Перевод инфраструктуры 1С:Предприятие на операционные системы семейства Linux (в частности, Ubuntu) в связке с СУБД PostgreSQL — популярный шаг для оптимизации затрат на лицензирование. Однако на практике администраторы и разработчики часто сталкиваются со специфическими проблемами. В этой статье мы подробно разберем две абсолютно разные, но крайне неприятные проблемы, упомянутые пользователями при эксплуатации такой связки:
Проанализируем природу этих явлений и рассмотрим по шагам методы их полного устранения.
---
Рассмотрим ситуацию: в процессе обмена данными между «1С:Управление торговлей 10.3» и «1С:Бухгалтерия предприятия 2.0» система активно использует временный каталог для распаковки xml-пакетов и промежуточного хранения файлов. В операционной системе Ubuntu этот каталог по умолчанию располагается в ветке /tmp. Периодически права на эту папку сбрасываются, из-за чего служба сервера 1С (процесс ragent под пользователем usr1cv8 или 1c) теряет возможность записи, и обмен аварийно завершается.
Выясним причину такого поведения ОС. В современных дистрибутивах Linux под управлением инициализатора systemd каталог /tmp очень часто монтируется в оперативную память через файловую систему tmpfs (так называемый RAM-диск) либо жестко контролируется специализированной службой периодической очистки — systemd-tmpfiles-clean.service.
При перезагрузке сервера или при наступлении планового времени очистки система полностью удаляет содержимое временных папок. Если директория для обмена была создана внутри /tmp вручную с нужными правами, то после очистки операционная система пересоздает ее со стандартными системными правами (обычно владельцем становится root), лишая сервер 1С доступа.
Разберем два надежных варианта решения этой проблемы.
Самым правильным решением является изоляция временных файлов сервера 1С от общесистемной папки /tmp, подверженной регулярной очистке. Для этого мы можем переопределить системную переменную окружения TMPDIR для службы сервера 1С, указав в качестве пути каталог в /var/tmp, который не очищается при перезагрузке.
Выполним настройку по шагам:
sudo mkdir -p /var/tmp/1cv8
usr1cv8 или 1c), и установим необходимые права доступа:
sudo chown -R usr1cv8:grp1cv8 /var/tmp/1cv8
sudo chmod 755 /var/tmp/1cv8
/lib/systemd/system/srv1cv83.service или создан как кастомный юнит). В секцию [Service] добавим директиву переопределения переменной окружения TMPDIR:
[Service]
Environment="TMPDIR=/var/tmp/1cv8"
sudo systemctl daemon-reload
sudo systemctl restart srv1cv83
Если специфика вашей инфраструктуры требует, чтобы временные файлы создавались строго в оперативной памяти (в каталогах /tmp или /dev/shm), необходимо заставить операционную систему автоматически создавать требуемую структуру папок с нужными правами при каждом старте или очистке.
Для этого мы воспользуемся механизмом конфигурации tmpfiles.d:
sudo nano /etc/tmpfiles.d/1c-temp.conf
# Тип | Путь | Права | Пользователь | Группа | Время жизни
d /dev/shm/1ctmp-prod 0775 usr1cv8 grp1cv8 -
d /tmp/1c_exchange 0775 usr1cv8 grp1cv8 -
Environment="TMPDIR=/dev/shm/1ctmp-prod"
Этот подход гарантирует, что даже после полной очистки RAM-диска папка будет мгновенно пересоздана операционной системой с корректными правами доступа для сервера 1С.
---
Вторая проблема, с которой сталкиваются пользователи: при редактировании характеристик номенклатуры (вес, объем) в конфигурации «1С:Управление торговлей 10.3» внезапно выясняется, что в качестве единицы хранения остатков у товара оказывается указана «чужая» единица, принадлежащая совершенно другой позиции номенклатуры. Изменение веса ломает учет сразу у двух товаров.
Проанализируем архитектуру метаданных 1С, чтобы понять природу этой ошибки. Подозрения в адрес PostgreSQL или Linux в данном случае абсолютно беспочвенны. Это классический логический баг конфигураций на обычных формах (таких как УТ 10.3, УПП 1.3, КА 1.1), связанных с механизмом копирования элементов.
Справочник ЕдиницыИзмерения является подчиненным по отношению к справочнику Номенклатура (то есть у каждой единицы измерения в реквизите Владелец должна быть записана конкретная номенклатурная позиция).
Когда пользователь создает новый товар путем копирования старого (например, нажатием клавиши F9 или через контекстное меню):
ЕдиницаХраненияОстатков и ЕдиницаДляОтчетов остаются записанными ссылки на элементы справочника ЕдиницыИзмерения, подчиненные старому (исходному) товару.Для предотвращения этой путаницы необходимо зайти в конфигуратор 1С и скорректировать поведение системы при создании копии. Откроем модуль объекта справочника Номенклатура и найдем предопределенный обработчик события ПриКопировании.
Нам необходимо принудительно очистить ссылки на единицы измерения у копируемого объекта, чтобы система создала новые элементы при первом сохранении карточки товара. Добавим в процедуру следующий код:
Процедура ПриКопировании(ОбъектКопирования)
// Очищаем реквизиты единиц измерения, чтобы избежать ссылок на чужого владельца
ЕдиницаХраненияОстатков = Справочники.ЕдиницыИзмерения.ПустаяСсылка();
ЕдиницаДляОтчетов = Справочники.ЕдиницыИзмерения.ПустаяСсылка();
ЕдиницаШкалы = Справочники.ЕдиницыИзмерения.ПустаяСсылка();
// Если в вашей конфигурации используются другие базовые единицы,
// их также необходимо занулить для предотвращения коллизий
КонецПроцедуры
Этот простой шаг заставит пользователя (или алгоритм конфигурации при записи) сгенерировать новые, собственные единицы измерения для созданной карточки товара, у которых в поле Владелец будет корректно записана новая номенклатура.
Если база данных уже содержит множество позиций с нарушенными связями подчинения, ручная правка займет слишком много времени. Для исправления ситуации выполним следующие действия:
ЕдиницаХраненияОстатков.Владелец не совпадает с текущей номенклатурой, создаем для текущей номенклатуры новую единицу измерения (копированием параметров ошибочной).ЕдиницаХраненияОстатков записываем ссылку на свежесозданную единицу и сохраняем элемент номенклатуры.---
Проанализируем используемые версии ПО. Участники ветки упоминают платформу 1С версии 8.2.10.2667 и СУБД PostgreSQL версии 9.5.10. По современным меркам эти версии критически устарели. Работа на таких релизах неизбежно несет дополнительные риски:
rphost. Рекомендуется настроить регулярный автоматический перезапуск службы сервера 1С в ночное время (например, через утилиту cron).8.3 и СУБД PostgreSQL до специализированных сборок (например, от Postgres Pro с патчами для 1С), что позволит существенно поднять стабильность работы и скорость проведения транзакций.