Установка 1С: Предприятие 8.3.8 и PostgreSQL 9.2.4 на Ubuntu Server 16.04 (+ готовая виртуальная машина)

Существующая тенденция переходить на свободно распространяемое ПО ставит специалистам по 1С новые требования. Если ранее нужно было уметь настраивать сервер 1С под Windows и Microsoft SQL, то теперь нужно уметь делать это под Linux и на СУБД PostgreSQL.

Что понадобится?

Дистрибутивы:

  1. Ubuntu Server. На данный момент текущая версия 16.04.
  2. Сервер 1С. Существует версия x32 и x64 в виде rpm и deb-пакетов. В виртуальной машине версия 8.3.8.1933 x64.
  3. PostgreSQL. Также существует x32 и x64 версии rpm и deb. Лучше качать сразу одним архивом с дополнительными модулями. В Виртуальной машине версия 9.2.4_1С.

Аппаратное обеспечение:

Системные требования к Windows и Linux версии 1С описаны на официальном ресурсе.

Оборудование можно выбирать, основываясь на данных этой статьи ИТС.

Как устанавливать?

Процесс установки 1С и PostgreSQL подробно описан на множестве ресурсов. Как пример, на этом. Там подробно всё описано, какие команды нужно вводить, чтобы установить сервер 1С:Предприятия, PostgreSQL, Apache на Linux.

Повторяться в данной статье я не буду, но предоставлю вам готовую виртуальную машину VirtualBox, на которой уже всё установлено, и вы можете её скачать для пользования.

Параметры VM:

Версия сервера 1С: 8.3.8.1933.

Диск: 100 Гб.

Логин: testuser

Пароль: testpassword

Пароль postgres: testpassword2

Сетевые настройки: по DHCP.

Отладка на сервере 1С:Предприятие: включена.

Сетевое имя машины: ubuntuserver.

По умолчанию работает с некоторыми ограничениями без установленного ключа на сервер.

Если ваш 1С-клиент расположен в среде Windows, укажите в файле hosts соответствие IP-адреса сервера имени сервера ubuntuserver для корректной работы.

Файлы виртуальной машины VirtualBox:

  1. Torrent UbuntuServer1CPostgres64.zip.
  2. Прямая ссылка.

Куда помещает данные метод ПоместитьВоВременное Хранилище()?

Это один из часто задаваемых вопросов на экзамене «1С: Эксперт по технологическим вопросам».

Подробно о методе написано на ИТС («Анализ причин роста сеансовых данных» и «Помещение данных во временное хранилище»).

Попробуем рассмотреть кратко, что такое хранилище сеансовых данных.

Хранилище сеансовых данных — каталог на сервере «1С:Предприятие», которому установлено требование назначения функциональности «Сервис сеансовых данных». Если требования функциональности нет, то сеансовые данные распределяются по всем рабочим серверам.

Расположение каталога сеансовых данных можно определить по ключу «/d» в командной строке запуска службы сервера.

Обычно это файлы C:\Program Files (x86)\1cv8\srvinfo\reg_номерпорта\snccntx[guid]\snccntx*.dat .

Сеансовые данные образуются не только методами «ПоместитьВоВременноеХранилище», «ПоместитьФайл», «НачатьПомещениеФайла», но и в результате работы формы: после ввода значений в поля ввода, при последующих серверных вызовах, данные сбрасываются в хранилище сеансовых данных.

Хранилище сеансовых данных параллельно существует и в памяти операционной системы. С помощью технологии mapping данные файлов snccntx*.dat частично, в необходимом размере, отображаются в оперативную память.

Сеансовые данные постепенно устаревают — при закрытии формы, сеанса пользователя или при следующем серверном вызове. Это зависит от способа помещения данных в хранилище сеансовых данных.

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

Объём создаваемых сеансовых данных можно определить с помощью анализа технологического журнала. Для этого требуется включить сбор событий CALL, SCALL и CONN со следующими настройками:

При этом свойство InBytes события CALL будет показывать сеансовые данные в байтах.

Решение билета 1 (аттестация 1С: Эксперт по технологическим вопросам)

Условие билета

Вопрос 1.1

Вопрос имеет несколько решений в зависимости от версии платформы 1С и режима управления блокировкой данных в конфигурации.

В версии платформы <8.2.14 константы хранятся в одной таблице _Consts в одной строке в разных колонках:

Таблица _Const в 1С 8.2.13

Начиная с 1С 8.2.14 для каждой константы определена отдельная таблица:

Таблица _Const в 1С 8.2.14

Рассмотрим, какие блокировки будут накладываться при чтении в транзакции и вне транзакции в СУБД MS SQL 2014 при автоматическом режиме управления блокировкой данных:

1С 8.2.13 Чтение константы в транзакции методом Получить() в автоматическом режиме
Блокировки 8.2.13 чтение в транзакции методом Получить
Установлена разделяемая блокировка (S) на единственную запись в кластерном индексе _Consts_ByKey_B таблицы _Consts, а также блокировки намерения IS на страницу индекса _Consts_ByKey_B и на всю таблицу.
1С 8.2.13 Чтение константы в транзакции запросом в автоматическом режиме
Блокировки 8.2.13 чтение в транзакции запросом
Установлена разделяемая блокировка диапазона RangeS-S на единственную запись кластерного индекса _Consts_ByKey_B, блокировки намерения IS на страницу кластерного индекса _Consts_ByKey_B и на всю таблицу.

Переведём конфигурацию в управляемый режим, включим в ТЖ отслеживание событий TLOCK и SDBL к исследуемой базе. Проведём аналогичный эксперимент по чтению в транзакции константы методом Получить() и запросом.

После выполнения запроса установленных управляемых блокировок 1С и блокировок СУБД не зафиксировано.

Во время работы метода Получить() и выполнения запроса на строки, выбираемые запросом, накладывалась S-блокировка. После чтения строк данная блокировка снималась.

Изменим версию совместимости на 8.2.16. Повторим эксперимент в автоматическом режиме:

1С 8.2.16 Чтение константы в транзакции методом Получить() в автоматическом режиме
Блокировки 8.2.16 чтение в транзакции методом Получить
Установлена S-блокировка на запись кластерного индекса _Const1832_ByKey_B, блокировки намерения IS на страницу кластерного индекса и на всю таблицу. Видно, что для каждой константы используется своя таблица.
1С 8.2.16 Чтение константы в транзакции запросом в автоматическом режиме
Блокировки 8.2.16 чтение в транзакции запросом
Установлена разделяемая блокировка диапазона RangeS-S на единственную запись кластерного индекса _Const1832_ByKey_B, блокировки намерения IS на страницу кластерного индекса _Consts_ByKey_B и на всю таблицу.

При использовании платформы 8.3 без режима совместимости с 8.2 в управляемом режиме блокировок чтение в транзакции и без транзакции неблокирующее, вследствие использования уровня изоляции Read Commited Snapshot (RCS).

В автоматическом режиме блокировок в 8.3 без режима совместимости с 8.2 будут наложены аналогичные S и RangeS-S-блокировки, как и в 8.2 (см. иллюстрации выше).

В случае, если транзакции не используются, чтение в 8.2.13, 8.2.14 и 8.3 будет неблокирующее.

Таким образом, можно заполнить следующую таблицу-ответ на вопрос билета 1:

Действие 1 Действие 2 8.2.13 8.2.14 8.3
Запись Конст1 Запись Конст2 + +
Чтение Конст1 Запись Конст2 + +
Чтение Конст1 Чтение Конст2 + + +

Вопрос 1.2

Ответ на вопрос зависит от режима управления блокировкой в конфигурации и от версии платформы.

В случае автоматического режима и платформы 8.2 будет следующая картина:

Разделяемые блокировки после метода ПолучитьОбъект()
Разделяемые блокировки после метода ПолучитьОбъект() в автоматическом режиме

Исключительные блокировки после метода Записать() в автоматическом режиме
Исключительные блокировки после метода Записать() в автоматическом режиме

Поведение платформы в автоматическом режиме на платформе 8.3 будет аналогично.

Рассмотрим управляемый режим блокировок.

Исключительные блокировки в управляемом режиме
Исключительные блокировки в управляемом режиме после метода Записать()

Также в управляемом режиме при выполнении метода Записать() установилась управляемая блокировка на пространство Reference7.REFLOCK .

Данный код может привести к взаимоблокировке с видом «повышение уровня изоляции ресурса» вследствие следующих действий:

Если две параллельные транзакции в автоматическом режиме установят разделяемую S-блокировку на один и тот же ресурс, выполнив запрос в транзакции (методом ПолучитьОбъект()), то в последствии каждая транзакция будет вынуждена ждать другую для установки исключительной X-блокировки. Менеджер блокировок СУБД распознает это и возникнет взаимоблокировка.

Взаимоблокировка СУБД вследствие повышения уровня изоляции ресурса

Взаимоблокировка СУБД вследствие повышения уровня изоляции ресурса

Для решения проблемы взаимоблокировки можно пойти несколькими путями:

  1. Получать ссылку на объект номенклатуры запросом с опцией для ИЗМЕНЕНИЯ. Например, так:
  2. Перевести конфигурацию в управляемый режим блокировок. В этом случае разделяемая S-блокировка будет снята в процессе выполнения запроса после чтения строк данных (для 8.2) и не будет установлена вообще (для 8.3).
  3. Использовать методы объектной блокировки (для интерактивного режима). В этом случае метод Заблокировать() вызовет исключение, если данный объект уже заблокирован другим пользователем:

Вопрос 1.3

Особенностями автоматического режима управления блокировкой данных является следующее:

  1. При чтении запросом с опцией для ИЗМЕНЕНИЯ пустой таблицы будет заблокирована RangeS-U-блокировкой пустая запись индекса. любая другая запись будет «соседней» для пустой записью и не может быть вставлена в таблицу.
  2. Блокировка на соседних записях в регистре также вызвана особенностью Range-блокировок, которые не только блокируют считанный/записанный диапазон, но и ещё одну строку ниже этого диапазона.

Для решения указанных проблем требуется перевод конфигурации в управляемый режим, в котором нет Range-блокировок.

Для этого нужно выполнить следующие действия:

  1. Сделать копию рабочей базы.
  2. В копии рабочей базы установить свойство «Режим управления блокировкой» в значение «Управляемый».
  3. Найти в коде конфигурации все места, где выполняется чтение итогов регистра и последующая запись в этот регистр.
  4. Использовать в этих местах исключительную управляемую блокировку 1С на записываемые данные или использовать новую методику проведения (сначала записывать данные, потом контролировать итоги по регистру). В последнем случае рассмотреть возможность использования разделения итогов и опции БлокироватьДляИзменения набора записей.
  5. Сделать резервную копию рабочей базы.
  6. Объединить конфигурации.
  7. Провести тестирование.

Ответы на 1С: Профессионал по технологическим вопросам с комментариями

В процессе подготовки к аттестации «1С: Эксперт по технологическим вопросам» я наткнулся на интересный сайт http://[удалено про просьбе 1С].ru, на котором присутствуют ответы на сертификацию «1С: Профессионал по технологическим вопросам» с подробными комментариями, ссылками на авторитетные источники.

 

Ссылки на разделы удалены по просьбе 1С.

На случай исчезновения данного сайта был создан архив ответов здесь в Google Docs (ссылка удалена по просьбе 1С).

Отображение произвольной таблицы значений на управляемой форме

Недавно передо мной стояла задача отобразить произвольную таблицу значений, структуры которой я не знал, на управляемой форме.

Хочу поделиться кодом функции, которая отрисовывает на управляемой форме таблицу значений.

При использовании нужно учесть, что код писался под платформу 8.3, а в конфигурацию была внедрена «Библиотека стандартных подсистем» (если у вас не внедрена БСП, отключите вызов функции общего модуля «СтроковыеФункцииКлиентСервер»).

Также исключите из таблицы значений типы, которые не могут быть отображены на управляемой форме.

 

Оформление кода модулей с помощью областей

Согласно «Системе стандартов и методик разработки конфигураций для платформы 1С:Предприятие 8» код модулей должен быть оформлен соответствующим образом областями и разграничен на логические блоки. Если обратиться к типовым конфигурациям, можно увидеть все преимущества такого оформления. Рассмотрим основные принципы оформления кода модулей областями.

Модуль формы

Код модуля формы должен быть разграничен на следующие области:

Модуль объекта и менеджера

Общий модуль

Модуль команды

 

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

Разработчик может объединять код и в другие дополнительные блоки-области, например «Проведение», «РаботаСЭЦП» и пр.

Дополнительную информацию про оформление кода областями можно получить в этом разделе стандартов на ИТС.

Использование класса «ПостроительЗапроса» для динамического формирования теста запроса

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

Разберём, как его можно использовать для динамического формирования текста запроса.

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

К сожалению, мне не удалось применить «Построитель запроса» для добавления полей выборки.

Для того, чтобы добавить новую секцию «ГДЕ» или дополнительные условия фильтрации, можно использовать следующий пример кода:

В итоге, текст нового запроса приобрёл следующий вид:

Упрощение работы с таблицей значений при добавлении строк

Часто требуется программно добавить несколько строк в таблицу значений.

Обычно программисты делают это так:

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

В ходе теста оценки производительности данный сокращенный способ добавления строк в таблицу значений на платформе 8.3.6.2530 работает на 16.45% быстрее.

Код теста оценки производительности:

 

Влияние конструкции ВЫРАЗИТЬ на SQL-запрос и его план на поля не составных типов

Рассмотрим влияние конструкции ВЫРАЗИТЬ, если её применить к полю обычного ссылочного не составного типа.

Пусть выполняется запрос без ВЫРАЗИТЬ и с ВЫРАЗИТЬ по отношению к полю выборки:

В процессе выполнения строки Запрос.Выполнить() будут выполнены следующие запросы SQL:

В тексте запроса SQL различий нет.

Сравним план запроса:

Очевидно, что план запроса тоже одинаков.

Вывод: для приведения типа значения в таблице значений, передаваемой в качестве параметра запроса, допустимо использовать конструкцию ВЫРАЗИТЬ.

Таблица значений в качестве параметра запроса

Рассмотрим следующую ситуацию:

Имеется запрос, принимающий в качестве параметра таблицу значений.

Колонки таблицы значений имеют ссылочный тип. Требуется в запросе выбирать вложенные реквизиты колонок.

metadannye

Проблема:

При выборе поля таблицы значений

конструктор запроса не открывается, выдавая ошибку:

error

Решение:

  1. Выбирать поле свойства в самом первом запросе пакета:
  2. Использовать функцию языка запросов «ВЫРАЗИТЬ»: