Сброс прав на временную папку в Linux и подмена единиц измерения в 1С:Управление торговлей 10.3: разбираемся с багами связки 1С, PostgreSQL и Ubuntu

Системный администратор 1С v8.3 (Обычные формы) 1С:Управление торговлей Управленческий учет IT и автоматизация бизнеса
← На главную

Перевод инфраструктуры 1С:Предприятие на операционные системы семейства Linux (в частности, Ubuntu) в связке с СУБД PostgreSQL — популярный шаг для оптимизации затрат на лицензирование. Однако на практике администраторы и разработчики часто сталкиваются со специфическими проблемами. В этой статье мы подробно разберем две абсолютно разные, но крайне неприятные проблемы, упомянутые пользователями при эксплуатации такой связки:

  1. Систематический сброс прав на временную папку обмена в Linux-окружении, приводящий к остановке регулярных обменов данными между конфигурациями.
  2. Логическая ошибка с «подменой» единиц хранения остатков в конфигурации «1С:Управление торговлей 10.3», которую ошибочно списывают на особенности СУБД PostgreSQL.

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

---

Часть 1. Почему «слетают» права на временную папку обмена в Linux и как это исправить

Рассмотрим ситуацию: в процессе обмена данными между «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С в изолированный каталог (Рекомендуется)

Самым правильным решением является изоляция временных файлов сервера 1С от общесистемной папки /tmp, подверженной регулярной очистке. Для этого мы можем переопределить системную переменную окружения TMPDIR для службы сервера 1С, указав в качестве пути каталог в /var/tmp, который не очищается при перезагрузке.

Выполним настройку по шагам:

  1. Создадим новую постоянную папку для временных файлов сервера 1С: sudo mkdir -p /var/tmp/1cv8
  2. Назначим владельцем папки пользователя, под которым запускается сервер приложений 1С (в зависимости от вашей установки это может быть usr1cv8 или 1c), и установим необходимые права доступа:
    
    sudo chown -R usr1cv8:grp1cv8 /var/tmp/1cv8
    sudo chmod 755 /var/tmp/1cv8
    
  3. Отредактируем юнит-файл службы сервера 1С (обычно он находится по адресу /lib/systemd/system/srv1cv83.service или создан как кастомный юнит). В секцию [Service] добавим директиву переопределения переменной окружения TMPDIR:
    
    [Service]
    Environment="TMPDIR=/var/tmp/1cv8"
    
  4. Перезапустим конфигурацию служб systemd и сам сервер 1С для применения изменений:
    
    sudo systemctl daemon-reload
    sudo systemctl restart srv1cv83
    

Вариант Б. Автоматическое управление правами через tmpfiles.d

Если специфика вашей инфраструктуры требует, чтобы временные файлы создавались строго в оперативной памяти (в каталогах /tmp или /dev/shm), необходимо заставить операционную систему автоматически создавать требуемую структуру папок с нужными правами при каждом старте или очистке.

Для этого мы воспользуемся механизмом конфигурации tmpfiles.d:

  1. Создадим новый конфигурационный файл: sudo nano /etc/tmpfiles.d/1c-temp.conf
  2. Пропишем в него правила создания каталогов для обмена. При запуске ОС служба автоматически создаст папки с указанными правами и владельцами:
    
    # Тип | Путь | Права | Пользователь | Группа | Время жизни
    d /dev/shm/1ctmp-prod 0775 usr1cv8 grp1cv8 -
    d /tmp/1c_exchange 0775 usr1cv8 grp1cv8 -
    
  3. В конфигурационном файле службы 1С (юните systemd) укажем соответствующую переменную окружения: Environment="TMPDIR=/dev/shm/1ctmp-prod"

Этот подход гарантирует, что даже после полной очистки RAM-диска папка будет мгновенно пересоздана операционной системой с корректными правами доступа для сервера 1С.

---

Часть 2. Подмена единиц хранения остатков в УТ 10.3: почему СУБД PostgreSQL здесь ни при чем

Вторая проблема, с которой сталкиваются пользователи: при редактировании характеристик номенклатуры (вес, объем) в конфигурации «1С:Управление торговлей 10.3» внезапно выясняется, что в качестве единицы хранения остатков у товара оказывается указана «чужая» единица, принадлежащая совершенно другой позиции номенклатуры. Изменение веса ломает учет сразу у двух товаров.

Проанализируем архитектуру метаданных 1С, чтобы понять природу этой ошибки. Подозрения в адрес PostgreSQL или Linux в данном случае абсолютно беспочвенны. Это классический логический баг конфигураций на обычных формах (таких как УТ 10.3, УПП 1.3, КА 1.1), связанных с механизмом копирования элементов.

Почему это происходит?

Справочник ЕдиницыИзмерения является подчиненным по отношению к справочнику Номенклатура (то есть у каждой единицы измерения в реквизите Владелец должна быть записана конкретная номенклатурная позиция).

Когда пользователь создает новый товар путем копирования старого (например, нажатием клавиши F9 или через контекстное меню):

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

Как предотвратить появление ошибки (программное решение)

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

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


Процедура ПриКопировании(ОбъектКопирования)
    
    // Очищаем реквизиты единиц измерения, чтобы избежать ссылок на чужого владельца
    ЕдиницаХраненияОстатков = Справочники.ЕдиницыИзмерения.ПустаяСсылка();
    ЕдиницаДляОтчетов       = Справочники.ЕдиницыИзмерения.ПустаяСсылка();
    ЕдиницаШкалы            = Справочники.ЕдиницыИзмерения.ПустаяСсылка();
    
    // Если в вашей конфигурации используются другие базовые единицы, 
    // их также необходимо занулить для предотвращения коллизий
    
КонецПроцедуры

Этот простой шаг заставит пользователя (или алгоритм конфигурации при записи) сгенерировать новые, собственные единицы измерения для созданной карточки товара, у которых в поле Владелец будет корректно записана новая номенклатура.

Как исправить уже накопленные ошибки в базе данных?

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

  1. Используем специализированную обработку «Поиск и замена дублей» или напишем собственную небольшую обработку для восстановления связи.
  2. Алгоритм исправления должен быть следующим:
    • Выбираем всю номенклатуру базы данных.
    • Проверяем реквизит ЕдиницаХраненияОстатков.
    • Если у выбранной единицы измерения реквизит Владелец не совпадает с текущей номенклатурой, создаем для текущей номенклатуры новую единицу измерения (копированием параметров ошибочной).
    • Записываем новую единицу измерения, назначаем текущую номенклатуру владельцем.
    • В реквизит ЕдиницаХраненияОстатков записываем ссылку на свежесозданную единицу и сохраняем элемент номенклатуры.

---

Дополнительные рекомендации по работе связки 1С и PostgreSQL на Linux

Проанализируем используемые версии ПО. Участники ветки упоминают платформу 1С версии 8.2.10.2667 и СУБД PostgreSQL версии 9.5.10. По современным меркам эти версии критически устарели. Работа на таких релизах неизбежно несет дополнительные риски:

← На главную