среда, 20 августа 2014 г.

Полная установка PostgreSQL 9.2.4-1.1C + 1C 8.3.5.1119 на Ubuntu Server 14.04 X64


Увеличиваем максимальный размер сегмента памяти до 4Гб (Обычно половина объема ОЗУ):
#echo "kernel.shmmax=1073741824" >>/etc/sysctl.conf
#sysctl -p

Генерируем необходимые локали и задаем переменную среды LANG, для работы скрипта инициализации БД.
#locale-gen en_US ru_RU ru_RU.UTF-8
#export LANG="ru_RU.UTF-8"

Устанавливаем необходимые зависимисти:
#apt-get install libssl0.9.8 libossp-uuid16 libxslt1.1 libicu52 libt1-5 t1utils imagemagick ttf-mscorefonts-installer unixodbc texlive-base libgfs-1.3-2

Качаем с сайта 1C необходимые пакеты Postgre 9.2.4 и устанавливаем их именно в такой последовательности:
#dpkg -i libpq5_9.2.4-1.1C_amd64.deb 
#wget http://archive.ubuntu.com/ubuntu/pool/main/p/postgresql-common/postgresql-client-common_154_all.deb
#dpkg -i postgresql-client-common_154_all.deb
#dpkg -i postgresql-client-9.2_9.2.4-1.1C_amd64.deb
#wget http://archive.ubuntu.com/ubuntu/pool/main/p/postgresql-common/postgresql-common_154_all.deb
#dpkg -i postgresql-common_154_all.deb
Пересобираем contrib:
#dpkg -x postgresql-contrib-9.2_9.2.4-1.1C_amd64.deb tmpdir
#dpkg -e postgresql-contrib-9.2_9.2.4-1.1C_amd64.deb tmpdir/DEBIAN
#mcedit ./tmpdir/DEBIAN/control
ишем строку libicu46 (>= 1.4.6) и меняем ее на libicu52 (>= 1.4.6)
сохраняем изменения
#rm postgresql-contrib-9.2_9.2.4-1.1C_amd64.deb
#dpkg -b tmpdir postgresql-contrib-9.2_9.2.4-1.1C_amd64.deb
#dpkg -i postgresql-contrib-9.2_9.2.4-1.1C_amd64.deb
#dpkg -i postgresql-9.2_9.2.4-1.1C_amd64.deb

Проверяем, запущен ли сервер:
#service postgresql status
Выхлоп:
9.2/main (port 5433): online

Создаем директорию для хранения баз банных 1С:
#mkdir /mnt/1с/db/
#chown postgres:postgres -R /mnt/1c/db

Инициализируем БД и создаем администратора БД:
#su postgres
$/usr/lib/postgresql/9.2/bin/initdb -D /mnt/1c/db --locale=ru_RU.UTF-8
$psql -U postgres -c "alter user postgres with password 'наш_пароль';"

Правим конфиг для корректной авторизации администратора БД (/mnt/1c/db/pg_hba.conf).
Меняем:
# IPv4 local connections:
host    all             all             127.0.0.1/32            ident
# IPv6 local connections:
host    all             all             ::1/128                 ident
На:
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
# IPv6 local connections:
host    all             all             ::1/128                 md5

Перезапускаем PostgreSQL:
#service postgresql restart

Проверяем:
#netstat -atn|grep 5432
выхлоп:
tcp 0 0 0.0.0.0:5432 0.0.0.0:* LISTEN
значит все гуд

На этом этапе установка PostgreSQL завершена.

Устанавливаем сервер 1С:
Создаем симлинк:
#ln -s /usr/lib/x86_64-linux-gnu/libMagickWand.so.5 /usr/lib/x86_64-linux-gnu/libMagickWand.so

Ставим все необходимые пакеты:
#dpkg -i 1c-enterprise83-common_8.3.4-476_amd64.deb
              1c-enterprise83-server_8.3.4-476_amd64.deb
              1c-enterprise83-ws_8.3.4-476_amd64.deb
              1c-enterprise83-common-nls_8.3.4-476_amd64.deb
              1c-enterprise83-server-nls_8.3.4-476_amd64.deb
              1c-enterprise83-ws-nls_8.3.4-476_amd64.deb
#wget http://old-releases.ubuntu.com/ubuntu/pool/universe/t/ttf2pt1/ttf2pt1_3.4.4-1.4_amd64.deb
#dpkg -i ttf2pt1_3.4.4-1.4_amd64.deb

Разрешаем запись:
#chown -R usr1cv8:grp1cv8 /opt/1C

Перезапускаем сервер 1с:
#service srv1cv83 restart

Проверяем порты:
#netstat -atn |grep 0.0.0.0:15
 
tcp        0      0 0.0.0.0:1560            0.0.0.0:*               LISTEN  
tcp        0      0 0.0.0.0:1540            0.0.0.0:*               LISTEN  
tcp        0      0 0.0.0.0:1541            0.0.0.0:*               LISTEN

Так же можно для профилактики проверить, все ли процессы сервера запущены:
#ps aux|grep 1c

usr1cv8  28351  0.0  1.1 264284 22664 ?        Ssl  10:01   0:00 /opt/1C/v8.3/x86_64/ragent -daemon
usr1cv8  28354  0.3  2.0 776216 41956 ?        Sl   10:01   0:00 /opt/1C/v8.3/x86_64/rmngr -port 1541 -host test -range 1560:1591
usr1cv8  28378  0.1  1.6 323900 34076 ?        Sl   10:01   0:00 /opt/1C/v8.3/x86_64/rphost -range 1560:1591 -reghost test -regport 1541 -pid f10fbd88-c9eb-11e3-0599-40618600e473
root        28439  0.0  0.0  13472   892 pts/2     S+  10:03   0:00 grep --color=auto 1c

Установка Sentinel HASP USB:
#wget ftp://ftp.cis-app.com/pub/hasp/Sentinel_HASP/Runtime_(Drivers)/6.62/Sentinel_LDK_Ubuntu_DEB_Run-time_Installer.tar.gz
#dpkg --add-architecture i386
#apt-get update
#apt-get install libc6:i386
#dpkg -i aksusbd_2.2-1_i386.deb 
#/etc/init.d/aksusbd restart

Тушим сервер. Вставляем ключи USB. Запускаем сервер.
#service aksusbd status
 
AKSUSB is running.
WINEHASP is running.
HASPLM is running.

Скрипты backup/restore аналогичны скриптам из этой статьи.


На этом этапе всё готово для создания БД из под оснастки Windows "Администрирование серверов предприятия"!!!!!!!!!!!!!!!!!!!

Возможные ошибки:

"Ошибка СУБД: ERROR: type "mvarchar" does not exist at character 31"

Означает что база данных была создана не из оснастки 1с. Необходимо удалить БД и создать ее из оснастки.
______________________________________________________________________

1С Предприятие
Ошибка СУБД:
ERROR: invalid byte sequence for encoding "UTF8": 0x01  (0x01 это для примера, адреса бывают разные)

Невосстановимая ошибка приводящая к вылету клиента
Наблюдается на платформе 1C 8.3.4 и 8.3.5
Редко на УТ 10, и часто на УТ 11

Лекарство: Установить значение параметра standard_conforming_strings в конфиге postgresql.conf в значение 'off'
Параметр лучше поправить как для БД, так и в глобальных настройках.
______________________________________________________________________

Ошибка при получении характеристик
по причине:
{(1, 31)}: Поле не найдено "Свойство.Presentation"
SELECT <<?>>

Означает, что не хватает прав на справочники "ЗначенияСвойствОбъектов", "ЗначенияСвойствОбъектовИерархия" и план видов характеристик "ДополнительныеРеквизитыИСведения".
Соответственно лечится установкой прав на эти объектов хотя бы на "чтение/просмотр"
______________________________________________________________________


Улучшаем работу сервера 1С предприятие 8.3.5

Через оснастку администрирования серверов 1с для конкретной БД выставляем свойства:

Количество ИБ на процесс = 1
Количество соединений на процесс  = 10

Это даёт нам автоматическую балансировку нагрузки по рабочим процессам. Сервер сам создаёт нужное количество рабочих процессов согласно указанным параметрам и также автоматически закрывает неиспользуемые рабочие процессы. Тем самым мы обеспечили не только балансировку, но и ротацию (перезагрузку) рабочих процессов с целью защиты от «пожирания памяти».


вторник, 20 мая 2014 г.

1С "SDBL: Выход за пределы размерности результата" при обновлении конфигурации.

Недавеча, при обновлении конфигурации случалась такая вот грабля:
"SDBL: Выход за пределы размерности результата"

Имеем:
Конфа = "Управление торговым предприятием для Украины", редакция 1.2.
Платформа = 1С:Предприятие 8.2 (8.2.19.90)
База на PostgreSQL 8.4.21.

Добавил, значит, в конфу новый самописный документ. При обновлении конфигурации конфигуратор "залипает" минут на 20 с состоянием "Регистрация изменений. Таблица регистрации изменений".  В консоли сервера 1С количество заблокированных объектов СУБД нарастает. А потом валится с ошибкой "SDBL: Выход за пределы размерности результата".

В файловом варианте все гуд...

ВАЖНО!!! не забываем про BACKUP!!! Если используется РИБа - необходимо "распинать" обмены на ВСЕ периферийные БД, и убедиться, что конфы во ВСЕХ узлах  идентичны!!!

А сабж, собственно, решается так:

Способ рас (средствами SQL).
В консоли SQL-сервера открываем нужную БД и чистим таблицы "_ConfigChngR" и "_ConfigChngR_ExtProps"

DELETE FROM _ConfigChngR;
DELETE FROM _ConfigChngR_ExtProps;
COMMIT;

В этих таблицах хранится информация о всех изменениях конфигурации для обмена с распределенными узлами. Платформа собирает эту информацию автоматически, всегда, независимо от того используется РИБа или нет!

В случае, когда распределенка не используется их, для экономии места можно периодически очищать, например, по регламенту.

Способ два (средствами 1С).
В режиме предприятия(конфигуратор должен быть закрыт) в центральной базе следует выполнить код:
ПланыОбмена.УстановитьГлавныйУзел(Неопределено);
ПланыОбмена.УстановитьГлавныйУзел(ПланыОбмена.<ВашПланОбмена>.НайтиПоКоду(<КодГлавногоУзла>)); 

и таблицы также будут очищены.

воскресенье, 4 мая 2014 г.

Качаем APK с Play Market Google

Появилась на днях необходимость скачать приложовину с play market`a. В принципе, ничего умного. Задача усложнялась только тем, что не было google аккаунта под рукой. Заводить новый - нет желания (ради одной то приложовины?). Да и просто стало интересно: "как дернуть apk`шку с play market`a"?
Предложенный далее способ, позволяет качнуть только бесплатные приложовины.
Всё что нужно – ссылка на приложовину в play market`e, которую можно скопировать из адресной строки браузера.
Например, для "acalendar" она будет выглядеть так:
https://play.google.com/store/apps/details?id=org.withouthat.acalendar
Далее, вставляем эту ссылку в сервайс APK Downloader в поле "Package name or Google Play URL" и жмакаем "Generate Download Link". Качаем APK`шку по сгенеренной ссылке. Жопиздан;) 

среда, 23 апреля 2014 г.

Установка поддержки 32-х битной архитектуры в 64-х битной Ubuntu 14.04

В ubunt`ах, включительно по 13.04, сабж реализовывался так:
$sudo apt-get install ia32-libs

Начиная с версии 13.10, вышеуказанный пакет зачем-то "выпилили". Теперь поддержка 32-х архитектуры включается так:
$sudo dpkg --add-architecture i386
$sudo apt-get update

Устанавливать 32-х битные пакеты можно таким образом:
#dpkg -i package-name.deb
или
$sudo apt-get install package-name:i386

Если есть какие то зависимости, например, libc6, то просто выполняем команду:
$sudo apt-get install libc6:i386

Опять же:
$sudo apt-get -f install
никто не отменял ;)

И чтобы не было проблем со Skype и другими 32-битными qt-приложениями, то ставим:
$sudo apt-get install sni-qt:i386 lsb-core libqt4-dbus libqt4-network libqt4-xml libasound2
$sudo apt-get -f install
 

понедельник, 14 апреля 2014 г.

Очистка оперативной памяти от кэша в Linux

При частых операциях с файлами, особенно с большими, Linux кеширует эти самые файлы в оперативную память. В принципе, в этом нет ничего страшного, потому что как только, занятая закешированными файлами, оперативная память понадобится ядру, она будет частично освобождена для более приоритетной задачи. Однако, например, когда сервер 1с выполняет операции с "объемным" набором данных, этого высвобождения памяти не происходит и сервер "ложится" по причине отсутствия оперативной памяти.
Для того, чтобы посмотреть сколько оперативной памяти занято и сколько закешировано в данный момент, можно воспользоваться командой free (параметр "-g" означает отображать в гигабайтах, "-m" соответственно в мегабайтах).


$free -g
                               total       used       free     shared    buffers     cached
Mem:                            7          7          0          0          0          5
-/+ buffers/cache:          1          6
Swap:                           5          0          5


$free -m
                              total       used       free     shared    buffers     cached
Mem:                     8063       7616        447          0        283       5414
-/+ buffers/cache:    1918       6145
Swap:                    5723         52       5671

Как видно из выхлопа, откешировано у нас аж 5 Гб. Чтобы освободить память от кеша, можно выполнить команду:

#echo 3 > /proc/sys/vm/drop_caches

Если такая ситуация происходит довольно часто,  можно выполнять данную команду по cron`y

четверг, 3 апреля 2014 г.

1С. Запись/чтение "ТаблицыЗначений" в/из XML

Область применения:
Переноса данных из одной конфигурации в другую, перенос данных между обработками, да, в принципе, для любого переноса данных.

Функция сохранения таблицы значений в XML:
Функция СохранитьТаблицуЗначенийВXML(Таблица, ФайлXML)
    Попытка
        Запись = Новый ЗаписьXML();
        Запись.ОткрытьФайл(ФайлXML);   
    Исключение
        Сообщить("Ошибка при создание XML файла! " + Символы.ПС + ОписаниеОшибки());
        Возврат Ложь;
    КонецПопытки;      
    
    Запись.ЗаписатьОбъявлениеXML();
    Запись.ЗаписатьНачалоЭлемента("root"); 
    
    МасКолонки = Новый Массив();
    Запись.ЗаписатьНачалоЭлемента("columns");  
    Для Ном = 0 по Таблица.Колонки.Количество()-1 цикл         
        Колонка = Таблица.Колонки[Ном];
        МасКолонки.Добавить(Колонка.Имя);
        
        Запись.ЗаписатьНачалоЭлемента("colum");
        Запись.ЗаписатьАтрибут("Name",Колонка.Имя);
        Запись.ЗаписатьАтрибут("Type",Строка(Колонка.ТипЗначения));
        Запись.ЗаписатьКонецЭлемента();  // colum      
    КонецЦикла;    
    Запись.ЗаписатьКонецЭлемента();  // columns
    
    Запись.ЗаписатьНачалоЭлемента("records");  
    Для Каждого СтрТаблицы из Таблица цикл
        
        Запись.ЗаписатьНачалоЭлемента("record");
        Для каждого ИмяКолонки из МасКолонки цикл
            Запись.ЗаписатьНачалоЭлемента(ИмяКолонки);
            Значение = Строка(СтрТаблицы[ИмяКолонки]);
            Запись.ЗаписатьСекциюCDATA(Значение);
            Запись.ЗаписатьКонецЭлемента();
        КонецЦикла;        
        Запись.ЗаписатьКонецЭлемента();
    КонецЦикла;    
    
    Запись.ЗаписатьКонецЭлемента();  // records    
    Запись.ЗаписатьКонецЭлемента();  // root       
    Запись.Закрыть();
    
    Возврат Истина;
КонецФункции



Функция чтения таблицы значений из XML:
Функция ЗагрузитьТаблицаЗначенийИзXML(ФайлXML)
    
    Попытка
        Чтение = Новый ЧтениеXML();
        Чтение.ОткрытьФайл(ФайлXML);   
    Исключение
        Сообщить("Ощибка при чтение данных из XML!" + Символы.ПС + ОписаниеОшибки());
    КонецПопытки;     
    
    ТЗ = Новый ТаблицаЗначений;
    Атрибут = Новый Соответствие;
    МассивКолонок = Новый Массив; 
    ТаблицаПостроена = Ложь;
    
    // Строим таблицу значений     
    Пока Чтение.Прочитать() Цикл       
        // Данные по колонке пошли
        Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента и Чтение.Имя = "colum" тогда
            Атрибут.Очистить();
            Пока Чтение.ПрочитатьАтрибут() цикл
                Атрибут[Чтение.Имя] = Чтение.Значение;             
            КонецЦикла;
            ТЗ.Колонки.Добавить(Атрибут["Name"], Новый ОписаниеТипов(Атрибут["Type"]));
            МассивКолонок.Добавить(Атрибут["Name"]);
        КонецЕсли;         
        
        // Данные по колонке закончились
        Если Чтение.ТипУзла = ТипУзлаXML.КонецЭлемента и Чтение.Имя = "columns" тогда     
            ТаблицаПостроена = Истина;
        КонецЕсли;
        
        Если Не ТаблицаПостроена тогда
            Продолжить;
        КонецЕсли;         
        
        // Началась запись в таблице значений
        Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента и Чтение.Имя = "record" тогда                     
            ЗаписьТЗ = ТЗ.Добавить();         
            Пока Чтение.Прочитать() цикл                           
                // Конец данных по записи
                Если Чтение.ТипУзла = ТипУзлаXML.КонецЭлемента и Чтение.Имя = "record" тогда
                    Прервать;
                КонецЕсли; 
                
                // Есть такая колонка в нашей ТаблицеЗначений
                Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента и
                     МассивКолонок.Найти(Чтение.Имя) <> Неопределено тогда
                    
                    ИмяКолонки = Чтение.Имя;
                    Чтение.Прочитать();
                    Если Чтение.ТипУзла = ТипУзлаXML.Текст тогда
                        ЗаписьТЗ[ИмяКолонки]= СокрЛП(Чтение.Значение);
                    КонецЕсли;                     
                КонецЕсли;                                             
            КонецЦикла;                           
        КонецЕсли; // Данные в таблице
        
    КонецЦикла;
    Возврат ТЗ;
КонецФункции

вторник, 28 января 2014 г.

HOWTO: LINUX SAMBA PROTOCOL NEGOTIATION FAILED: NT_STATUS_INSUFFICIENT_RESOURCES – SOLVED! WINDOWS XP 2K8 WIN7 WIN8 WIN2012

Случилась тут незадача... Моя свежепоставленная kubuntu 12.04 после недельного стабильного полета вдруг перестала видеть выньдовые шары. Причем как то избирательно. К одной машине все нормально, к другой - печаль: в dolphin`e тупо не открывались шары, пропали шаровые принтера и т.п.
Обваливается с ошибкой:

$smbclient -L 192.168.10.37
PROTOCOL NEGOTIATION FAILED: NT_STATUS_INSUFFICIENT_RESOURCES

Долго безрезультатно гуглил. И... Таки нашел...
Похоже, что выньдовый LanmanServer запускается с ограничением по памяти.

Лечится так:

На выньдовом тазике запускаем regedit (Пуск -> Выполнить -> regedit) и правим такие ключи реестра:

HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\LargeSystemCache
меняем значение 0 на 1

HKLM\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters\Size
меняем значение 1 на 3

Собсна, все! Теперь можно либо ребутнуть вынь, либо дернуть службы вручную:

(От имени админа запускаем cmd)
>net stop LanmanServer /y
>net start LanmanServer
>net start Browser
>net start HomeGroupListener