среда, 29 октября 2014 г.

1С:Предприятие. Ubuntu Server 14.04 . Ошибочный идентификатор часового пояса

Собственно сабж. После перехода на зимнее время и появлением дополнительных часовых поясов в России, 1С отказывается стартовать как в режиме "конфигуратора", так и в режиме "предприятия". Валится с ошибкой "Ошибочный идентификатор часового пояса 'W-SU' " (вместо 'W-SU' может быть любой, который установлен в системе по-умолчанию).

Как всегда оооочень информативно))

Лечится так:


1. Остановить сервер 1С
  • Для выньды: остановить службу "Агент сервера 1С:Предприятия 8.X"
  • Для Linux:
    #service srv1cv8X stop  
2. Удалить каталог snccntx
  •  Для выньды: C:\Program Files\1cv8X\srvinfo\reg_1541\snccntx.
  •  Для Linux: в /home/usr1cv8/.1cv8/1C/1cv8/reg_1541 удалить все каталоги по шаблону %snccntx%
3. Запустить сервер 1С
  •  Для выньды: запустить службу "Агент сервера 1С:Предприятия 8.X"
  • Для Linux:
    #service srv1cv8X start 

1С:Предприятие 8.3.5. Создание конфигураций поставки и обновлений поставщика с публикацией на web-ресурсе

Ниже приводится пошаговая инструкция создания и публикации обновлений конфигураций поставщика. Предполагается, что дальнейшие действия будут выполнятся на компьютере под управлением  выньдовс, но проверялась и на Ubuntu 14.04, разница лишь в рабочих каталогах.


Рабочие каталоги:

D:\WORK - каталог информационной базы;
D:\VERS - каталог для хранения версий файлов поставки и файлов обновления;
D:\DIST - каталог дистрибутивов;
/var/www/1csupport - каталог на гипотетическом ресурсе http://my1clinux.ru;
(об организации LAMP-сервера подробно описано в этой статье)

Переменные:

Старая версия нашей конфигурации = 1.1.0.1;
Новая версия нашей конфигурации = 1.1.0.2;
Название конфигурации = "УправлениеВетклиникой"
Версия 1С:Предприятие 8.3 = 8.3.5.1231



Порядок действий:

1. В "чистую" БД загружаем версию конфигурации 1.1.0.1.

2. Выбираем пункт меню "Конфигурация - Поставка конфигурации - Создать файлы поставки и обновления конфигурации ..."

3. Нажимаем кнопку "Каталог файлов поставки".

4. Указываем каталог D:\VERS

5. Убираем флажок "Создать файл обновления конфигурации".

6. Нажимаем кнопку "Выполнить".

7. Убеждаемся, что создался файл D:\VERS\1.1.0.1\1Cv8.cf

8. Загружаем версию 1.1.0.2 конфигурации с полной заменой версии 1.1.0.1

9. Выбираем пункт меню "Конфигурация - Поставка конфигурации - Создать файлы поставки и обновления конфигурации ..."

10. Убеждаемся, что оба флажка установлены и
Имя файла поставки "D:\VERS\1.1.0.2\1Cv8.cf"
Имя файла обновления "D:\VERS\1.1.0.2\1Cv8.cfu"

11. Нажимаем кнопку "Добавить из предыдущих версий".

12. Выбираем D:\VERS\1.1.0.1\1Cv8.cf и нажимаем кнопку "ОК".

13. Нажимаем кнопку "Выполнить".

14. Убеждаемся, что создались файлы D:\VERS\1.1.0.2\1Cv8.cf
D:\VERS\1.1.0.2\1Cv8.cfu

15. Выбираем пункт меню "Конфигурация - Поставка конфигурации - Комплект поставки ..."

16. Выбираем "Создать новое описание комплекта поставки" и нажимаем кнопку "ОК".

17. В диалоге "Создание описания комплекта поставки" нажимаем кнопку "Готово".

18. Выбираем ветку
"Шаблоны конфигураций\УправлениеВетклиникой(..., версия 1.1.0.2)" и нажимаем кнопку "Добавить".

19. Выбираем "Отдельный файл", указываем путь D:\VERS\1.1.0.2\1Cv8.cfu и нажимаем кнопку "ОК".

20. Выбираем ветку "Вариант поставки" и нажимаем кнопку "Добавить".

21. Переименуем "Вариант поставки 1" в "Поставка обновления".

22. Нажимаем ссылку "Редактировать"

23. В диалоге "Вариант построения" ставим флажок возле файла 1Cv8.cfu и нажимаем кнопку "ОК".

24. Нажимаем кнопку "Создать файлы комплекта".

25. В диалоге "Выбор варианта построения" выбираем "Поставка обновления" и нажимаем кнопку "ОК".

26. Выбираем каталог D:\DIST и нажимаем кнопку "Open".

27. Убеждаемся, что создались файлы D:\DIST\КаталогПоставщика\1Cv8.cfu и D:\DIST\КаталогПоставщика\1cv8.mft

28. Выбираем пункт меню "Конфигурация - Поддержка - Шаблоны конфигураций и обновлений..."

29. Указываем каталог D:\DIST и нажимаем кнопку "Open".

30. Убеждаемся, что видна ветка УправлениеВетклиникой, редакция 1.0  1.1.0.2(обновление).

31. Выбираем "Действия - Создать файл списка шаблонов".

32. Убеждаемся, что создался файл D:\DIST\v8cscdsc.lst

33. Копируем содержимое (с подкаталогами) D:\DIST\ в /var/www/1csupport, так, что бы v8cscdsc.lst был доступен по пути "http://my1clinux.ru/1csupport/v8cscdsc.lst"

34. Загружаем версию 1.1.0.1 конфигурации.

35. Выбираем пункт меню "Конфигурация - Поддержка - Обновить конфигурацию..."

36. Выбираем "Поиск доступных обновлений".

37. Убираем флажок "Искать в текущем каталоге ..."

38. Нажимаем кнопку добавить и в диалоге "Выбор каталога" указываем путь http://my1clinux.ru/1csupport" target="_blank">http://my1clinux.ru/1csupport

39. Нажимаем кнопку "Далее >"

40. Выбираем 1.1.0.2(обновление) и нажимаем кнопку "Готово" 



(c) Сергей Нуралиев (http://partners.v8.1c.ru/forums/) + от себя любимого ;)

Организация сервера хранилища конфигураций 1С на Ubuntu Server 14.04 LTS х86_64

В стандартных поставках от 1С сервер хранилища конфигурации для linux x86_64 систем не поставляется.
Ибо сервер хранилища конфигурации является 32-разрядным приложением.
Случилось так, что сервер уже поднят и достаточно прекрасно чухает себя на 64-битной платформе. А понадобилась возможность ведения "командной" разработки конфигурации...
Фирма 1С заявляет, что "одновременная работа 32-х-битного сервера хранилища вместе с 64-х битным сервером 1С:Предприятия возможна"!

Качаем i386 сборку необходимого нам дистрибутива (в моем случае это был 8.3.5.1231) и распаковываем, например, в /opt/1C/cr

Приступим:
#apt-get install libstdc++6:i386
#service srv1cv83 stop
#cp /etc/init.d/srv1cv83 ~/
#cd /opt/1C/cr && ls | while read p; do dpkg -X ${p} / ; done

Создаем скрипт автозапуска сервера хранилища
#mcedit /etc/init.d/crserver
такого содержания:
#!/bin/bash
### BEGIN INIT INFO
# Provides:          crserver
# Required-Start:    $all
# Required-Stop:     $all
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: 1C 8.3 Confiration Storage Server
# Description:       1C 8.3 Confiration Storage Server
### END INIT INFO

SRV_PORT="1542"
STORAGES_DIR="/mnt/1c/ConfigurationStorage"
#
BINDIR="/opt/1C/v8.3/i386"
PATH="${BINDIR}:${PATH}"
DESC="1C 8.3 Confiration Storage Server"
NAME=crserver
DAEMON=${BINDIR}/$NAME
DAEMON_ARGS="-daemon -port ${SRV_PORT} -d ${STORAGES_DIR}"
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME

# ======[start]====== 
 
# Seting FD limit (fix: error 24 too many open files)
ulimit -n 50000

# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0

# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh

# Define LSB log_* functions.
# Depend on lsb-base (>= 3.2-14) to ensure that this file is present
# and status_of_proc is working.
. /lib/lsb/init-functions

do_start()
{
    # Return
    #   0 if daemon has been started
    #   1 if daemon was already running
    #   2 if daemon could not be started
    start-stop-daemon --start --pidfile $PIDFILE --exec $DAEMON --test > /dev/null || return 1
    start-stop-daemon --start --pidfile $PIDFILE --exec $DAEMON -- $DAEMON_ARGS || return 2
    # Add code here, if necessary, that waits for the process to be ready
    # to handle requests from services started subsequently which depend
    # on this one.  As a last resort, sleep for some time.
}

do_stop()
{
    # Return
    #   0 if daemon has been stopped
    #   1 if daemon was already stopped
    #   2 if daemon could not be stopped
    #   other if a failure occurred
    start-stop-daemon --stop --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
    RETVAL="$?"
    [ "$RETVAL" = 2 ] && return 2
    # Wait for children to finish too if this is a daemon that forks
    # and if the daemon is only ever run from this initscript.
    # If the above conditions are not satisfied then add some other code
    # that waits for the process to drop all resources that could be
    # needed by services started subsequently.  A last resort is to
    # sleep for some time.
    start-stop-daemon --stop --oknodo --retry=0/30/KILL/5 --exec $DAEMON
    [ "$?" = 2 ] && return 2
    # Many daemons don't delete their pidfiles when they exit.
    rm -f $PIDFILE
    return "$RETVAL"
}

case "$1" in
  start)
    [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
    do_start
    case "$?" in
        0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
        2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
    esac
    ;;
  stop)
    [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
    do_stop
    case "$?" in
        0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
        2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
    esac
    ;;
  status)
       status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
       ;;
  restart)
    #
    log_daemon_msg "Restarting $DESC" "$NAME"
    do_stop
    case "$?" in
      0|1)
        do_start
        case "$?" in
            0) log_end_msg 0 ;;
            1) log_end_msg 1 ;; # Old process is still running
            *) log_end_msg 1 ;; # Failed to start
        esac
        ;;
      *)
        # Failed to stop
        log_end_msg 1
        ;;
    esac
    ;;
  *)
    echo "Usage: $SCRIPTNAME {start|stop|status|restart}" >&2
    exit 3
    ;;
esac

# ======[theend]====== 
ну, соответственно подставляем свои переменные.

И далее все просто:
#mv ~/srv1cv83 /etc/init.d/srv1cv83
#chmod a+x /etc/init.d/crserver && update-rc.d crserver defaults
#service srv1cv83 start
#service crserver start
#rm -R /opt/1C/cr

Сервер хранилища запущен.

Запускаем конфигуратор и создаем новое локальное хранилище с <Имя хранилища>. Копируем его в каталог STORAGES_DIR, указанный в настройках скрипта запуска сервера хранилища. Подключаем полученное хранилище к БД для разработок (tcp://<IP сервера>/<Имя хранилища>).

пятница, 10 октября 2014 г.

Включение отладки на сервере 1С 8.3.5 LINUX

Останавливаем сервер:
#service srv1cv83 stop

Правим скрипт запуска/остановки:
#mcedit /etc/init.d/srv1cv83

находим строку "SRV1CV8_DEBUG=" и устанавливаем в 1 (0 - для выключения отладки)

Запускаем сервер:
#service srv1cv83 start

Жопиздан! Теперь можно ставить точки останова в серверных модулях...

вторник, 30 сентября 2014 г.

Ошибка загрузки библиотеки libWand.so по причине:dlopen: невозможно продолжать загрузку объекта со статичным TLS

KUbuntu 14.04.1 LTS x86_64 (ядро 3.13.0-36) 

Столкнулся недавича с ошибкой 1С:
Ошибка загрузки библиотеки libWand.so по причине:dlopen: невозможно продолжать
 загрузку объекта со статичным TLS 
Часть функций будет недоступна. 
Обратитесь к разделу справочной системы «1С:Предприятие - Работа пользователя – 
Особенности работы в Linux – Внешние библиотеки» 

Возникла при вызове метода табличного документа "ПроверитьВывод()".

Лечится так: Необходимо запускать 1С с параметром LD_PRELOAD=libgomp.so.1
$LD_PRELOAD=libgomp.so.1 /opt/1C/v8.3/x86_64/1cestart 

Коммент от 1С:
"Проблема заключается в том, что исчерпывается размер статического сегмента TLS из-за опций, с которыми скомпилирована статическая библиотека libgomp, поставляемая в составе дистрибутива. Дополнительную информацию по проблеме можно получить по ссылке: http://gcc.1065356.n5.nabble.com/patch-google-integration-Don-t-force-tl..."

понедельник, 25 августа 2014 г.

tail. Перекодировка CP1251 в UTF8 на лету

Есть такая замечательная связка команд:
$tail -f /SomeLogFileCP1251 | while read line; do echo $line | iconv -f cp1251 -t utf8; done

Настройка PostgreSQL. Оптимизация работы PostgreSQL.

Настройка конфигурации

параметр - значение - рекомендации


Настройка ресурсов

shared_buffers
Размер разделяемой между процессами PostgreSQL памяти, которая нужна для выполнения активных операций. Не следует указывать слишком большой объём, так как PostgreSQL использует также дисковый кэш.

Значения:
  • Средний объём данных и 256-512 МБ доступной памяти: 16-32 МБ
  • Большой объём данных и 1-4 ГБ доступной памяти: 64-256 МБ


temp_buffers
Буфер под временные объекты, в основном для временных таблиц.
Можно установить порядка 16 МБ


max_prepared_transactions
Количество одновременно подготавливаемых транзакций.
Для работы 1С этот параметр значения не имеет, PREPARE TRANSACTION там не используются.
Можно оставить по дефолту - 5


work_mem
Специальная память, используется для сортировки и кэширования таблиц, для одного запроса.
При задании этого параметра следует учитывать количество конкурентных запросов, выполняемых в один момент времени.
При памяти 1-4Gb рекомендуется устанавливать 32-128MB


maintenance_work_mem
Память использующаяся для операций VACUUM, CREATE INDEX, ALTER TABLE и FOREGIN KEY.
Следует устанавливать большее значение, чем для work_mem. Слишком большие значения приведут к использованию свопа.
При памяти 1-4Gb рекомендуется устанавливать 128-512MB


max_stack_depth
Специальный стек для сервера, в идеале он должен совпадать с размером стека, выставленном в ядре ОС. Установка большего значения, чем в ядре, может привести к ошибкам.
Рекомендуется устанавливать 2-4MB


max_fsm_relations
Максимальное количество таблиц, для которых будет отслеживаться свободное место в общей карте свободного пространства. Эти данные собираются VACUUM.
Выставьте параметр в соответствии с количеством таблиц в вашей базе с запасом. (Применимо для версий до 8.4)


max_fsm_pages
Количество блоков, для которых будет хранится информация о свободном месте. Информация хранится в разделяемой памяти, для каждой записи требуется по 6 байт.
Использование этого параметра позволяет избежать использования VACUUM FULL для базы, достаточно будет VACUUM. (Применимо для версий до 8.4)
Этот параметр должен быть не меньше чем 16*max_fsm_relations
Данный параметр задается автоматически при создании базы утилитой initdb
Можно задать его и вручную: в качестве начального приближения можно взять половину от среднего количества записей, изменяемых (UPDATE или DELETE) между запусками команды VACUUM.
Оценить это значение (база должна проработать уже какое-то время) можно выполнив:
vacuum full analyze;

NOTICE: number of page slots needed (196272) exceeds max_fsm_pages (153600)

HINT: Consider increasing the configuration parameter "max_fsm_pages" to a value over 196272.


max_files_per_process
Максимальное количество файлов, открываемых процессом и его подпроцессами в один момент времени.
Уменьшите данный параметр, если в процессе работы наблюдается сообщение "Too many open files".


Запись транзакционных логов на диск

commit_delay и commit_siblings
Значение commit_delay выражается в микросекундах (0 по умолчанию). Значение commit_siblings выражается в штуках (5 по умолчанию).
commit_delay определяют задержку между попаданием записи в буфер журнала транзакций и сбросом её на диск. Если при успешном завершении транзакции активно не менее commit_siblings транзакций, то запись будет задержана на время commit_delay. Если за это время завершится другая транзакция, то их изменения будут сброшены на диск вместе, при помощи одного системного вызова. Эти параметры позволят ускорить работу, если параллельно выполняется много «мелких» транзакций.


fsync
Данный параметр отвечает за сброс данных из кэша на диск при завершении транзакций.
Если установить его значение
fsync=off
то данные не будут записываться на дисковые накопители сразу после завершения операций. Это может существенно повысить скорость операций insert и update, но есть риск повредить базу, если произойдет сбой (неожиданное отключение питания, сбой ОС, сбой дисковой подсистемы).
Используйте эту возможность только если у вас имеются надежные ИБП и программное обеспечение, завершающее работу системы при низком заряде батарей.
Не следует отключать fsync при работе PostgreSQL на Windows платформе, из-за нестабильности системы


wal_sync_method
Метод, который используется для принудительной записи данных на диск.
Если fsync=off, то этот параметр не используется.
Возможные значения:
open_datasync - запись данных методом open() с параметром O_DSYNC
fdatasync - вызов метода fdatasync() после каждого commit
fsync_writethrough - вызывать fsync() после каждого commit игнорирую паралельные процессы
fsync - вызов fsync() после каждого commit
open_sync - запись данных методом open() с параметром O_SYNC
Не все методы доступны на определенных платформах. По умолчанию устанавливается первый, который доступен в системе.


full_page_writes
Установите данный параметр в off, если fsync=off. Иначе
Когда этот параметр on, PostgreSQL записывает содержимое каждой страницы в журнал транзакций во время первой модификации таблицы после контрольной точки. Это необходимо потому что страницы могут записаться лишь частично если в ходе процесса ОС "упала". Это приволит к тому, что на диске оказаываются новые данные смешанные со старыми. Строкового уровня записи в журнал транзакций может быть не достаточно, что бы полность восстановить данные после "падения". full_page_writes гарантирует корректное восстановление, ценой увелечения записываемых данных в журнал транзакций.(Потому что журнал транзакций все время начинается с контрольной точки. Единственный способ снижения объема записи заключается в увеличении checkpoint interval).


wal_buffers
Количество памяти используемое в SHARED MEMORY для ведения транзакционных логов.
При доступной памяти 1-4GB рекомендуется устанавливать 256-1024kb


Оптимизация запросов

enable_nestloop
Определяет использование планировщика запросов. В некоторых случаях выключение планировщика может уменьшать время исполнения отдельных запросов, в том числе и значительно. Однако в подавляющем большинстве случаев планировщик позволяет уменьшить время выполнения запросов. Не следует его выключать, по крайней мере на постоянной основе.


random_page_cost
Устанавливает у планировщика оценку "стоимоти" не последовательного перебора данных. По умолчанию 4.0. Уменьшение этого значения по отношению к seq_page_cost вызовет у планировщика предпочтение сканирования индекса, увеличение -- наобород сделает сканирование индекса "дороже". Вы можете изменить оба значения чтобы изменить отношение "стоимости" дисковых операций ввода/выдода, по отношениб с "стоимости" использования процессора, которая бадет описана следующими параметрами.
На серверах с быстрыми дисковыми массивами имеет смысл уменьшать изначальную настройку до 3.0, 2.5 или даже до 2.0. Если же активная часть вашей базы данных много больше размеров оперативной памяти, попробуйте поднять значение параметра. Можно подойти к выбору оптимального значения и со стороны производительности запросов. Если планировщик запросов чаще, чем необходимо, предпочитает последовательные просмотры (sequential scans) просмотрам с использованием индекса (index scans), понижайте значение. И наоборот, если планировщик выбирает просмотр по медленному индексу, когда не должен этого делать, настройку имеет смысл увеличить. После изменения тщательно тестируйте результаты на максимально широком наборе запросов. Никогда не опускайте значение random_page_cost ниже 2.0; если вам кажется, что random_page_cost нужно еще понижать, разумнее в этом случае менять настройки статистики планировщика.


cpu_tuple_cost
Устанавливает у планировщика оценку "стоимоти" затрат на обработку каждой строки во время выполнения запроса. По умолчанию 0,01.


cpu_index_tuple_cost
Устанавливает у планировщика оценку "стоимоти" затрат на обработку каждого индекса во время операции сканирования индекса. По умолчанию 0,005


cpu_operator_cost
Устанавливает у планировщика оценку "стоимоти" затрат на выполнение каждого оператора или функции во время выполнения запроса. По умолчанию 0.0025.


effective_cache_size
Передает данные планировщику запросов об объёме памяти, которая используется ОС для кэширования файлов, для одного запроса.
Этот параметр в ОС можно посмотреть в настройках:
Для Windows: в Диспетчере задач, Закладка Быстродействие, Физическая память-Системный кэш.
Для Linux: наберите команду free, необходимое значение в столбце cached (в kB)
Данное значение необходимо разделить на количество конкурентных запросов в один момент времени (среднее количество подключений к базе + запас).


default_statistics_target
Устанавливает глубину статистики по таблицам. БОльшие значения могут повысить время выполнения команды ANALYZE, но улучшат построение плана запроса.
Рекомендуется устанавливать порядка 100.


constraint_exclusion
Включает или отключает использование планером ограничений CONSTRAINT в таблицах при построении запросов.
Рекомендуется установить значение on, при этом, если Вы изменяете CONSTRAINT у таблиц, необходимо обновить их статистику выполнив ANALYZE, в противном случае будут построены неверные планы запросов.


Сбор статистики

stats_command_string
Передавать ли сборщику статистики информацию о текущей выполняемой команде и времени начала её выполнения.
Устанавливать on


stats_start_collector
Включать ли сбор статистики.
Устанавливать on


stats_row_level, stats_block_level
Собирать ли информацию об активности на уровне записей и блоков соответственно.
Устанавливать
stats_row_level=on
stats_block_level=off


stats_reset_on_server_start
Обнулять ли статистику при перезапуске сервера
Устанавливать off


Автовакуум

VACUUM - сборка "мусора". VACUUM восстанавливает место занятые "мертвыми" данными. При выполнении обычных операций с данными, PostgreSQL не удаляет данные физически из таблиц, это происходит с операцией VACUUM.


autovacuum
Включать ли автовакуум (автоматического запуска VACUUM), устанавливать on


autovacuum_naptime
Пауза между запусками Автовакуума.
Зависит от того, как часто обновляются данные в ваших таблицах. Может соствлять порядка 5min, по умолчанию 1min


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


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




Блокировки

max_locks_per_transaction
Количество блокировок за одну транзакцию: установить порядка 250


deadlock_timeout
Время жизни взаимных блокировок. Установить порядка 2 секунд.


Возможная ошибка
После исправления файла конфигурации PostgreSQL может не запуститься, выдав ошибку:
FATAL:  could not create shared memory segment:...

Failed system call was shmget(key=5432001, size=140075008, 03600).

This error usually means that PostgreSQL's request for a shared memory segment exceeded your kernel's SHMMAX parameter.  You can either reduce the request size or reconfigure the kernel with larger SHMMAX.  To reduce the request size (currently 140075008 bytes), reduce PostgreSQL's shared_buffers parameter (currently 16384) and/or its max_connections parameter (currently 10).

        If the request size is already small, it's possible that it is less than your kernel's SHMMIN parameter, in which case raising the request size or reconfiguring SHMMIN is called for.

        The PostgreSQL documentation contains more information about shared memory configuration.
Для исправления необходимо увеличить параметр SHMMAX в системе. Сделать это можно следующим образом (для ОС Linux):
Выполните команду:
echo 150829120 > /proc/sys/kernel/shmmax
указав свое новое значение для параметра (какое именно - можно посмотреть в логе ошибки PostgreSQL). Данная операция устанавливает параметр на лету, но после перезагрузки системы изменения будут потеряны. Чтобы этого не происходило, внесите в файл /etc/sysctl.conf следующую строку:
kernel.shmmax = 150829120
указав своё значение.

Средняя настройка

Среднестатическая настройка для максимальной производительности. Возможно для конкретного случая лучше подойдут другие настройки. Внимательно изучите данное руководство и настройте PostgreSQL, опираясь на эту информацию.


RAM -- размер памяти
* shared_buffers = 1/8 RAM или больше (но не более 1/4);
* work_mem в 1/20 RAM;
* maintenance_work_mem в 1/4;
* max_fsm_relations в планируемое кол-во таблиц в базах * 1.5;
* max_fsm_pages в max_fsm_relations * 2000;
* fsync = true;
* wal_sync_method = fdatasync;
* commit_delay = от 10 до 100 ;
* commit_siblings = от 5 до 10;
* effective_cache_size = 0.9 от значения cached, которое показывает free;
* random_page_cost = 2 для быстрых cpu, 4 для медленных;
* cpu_tuple_cost = 0.001 для быстрых cpu, 0.01 для медленных;
* cpu_index_tuple_cost = 0.0005 для быстрых cpu, 0.005 для медленных;

* autovacuum = on
* autovacuum_vacuum_threshold = 1800
* autovacuum_analyze_threshold = 900


Обслуживание базы

При первом запуске базы, после заливки данных, необходимо сделать ANALYZE для всей базы.
VACUUM выполняется автоматически, в соответствии с настройками в файле конфигурации.
VACUUM FULL выполнять не обязательно при правильно настроенном автовакууме.


Диски и файловые системы

Если в вашем сервере есть несколько физических дисков, то вы можете разнести файлы базы данных и журнал транзакций по разным дискам:
  • Остановите сервер.
  • Перенесите каталоги pg_clog и pg_xlog, находящийся в каталоге с базами данных, на другой диск.
  • Создайте на старом месте символическую ссылку.
  • Запустите сервер.

среда, 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