Как добавить кадровые документы в обмен ЗУП – ERP и победить ошибку мутабельного значения при COM-соединении

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

При интеграции систем 1С:Зарплата и управление персоналом 3.1 (ЗУП) и 1С:ERP Управление предприятием 2 (ERP) разработчики часто сталкиваются с жесткими ограничениями типового обмена. Штатный механизм синхронизации через Универсальный формат (EnterpriseData) спроектирован исключительно для трансляции результатов расчетов в финансовый контур. Кадровые документы, такие как Прием на работу или Кадровое перемещение, в этот обмен по умолчанию не входят.

В этой статье мы подробно разберем, как расширить состав типового обмена без снятия конфигурации с поддержки, а также проанализируем природу популярной ошибки межконтекстного взаимодействия: "Попытка передачи с клиента на сервер мутабельного значения..." при записи справочников через COM-соединение.

Почему кадровые документы не выгружаются «из коробки»

Попытка просто доработать правила регистрации или правила обмена в программе «1С:Конвертация данных» и загрузить их в работающий узел синхронизации не принесет желаемого результата. Давайте выясним причину этого поведения.

Для того чтобы объект конфигурации (документ или справочник) мог участвовать в обмене данными, он должен быть зарегистрирован на соответствующем узле плана обмена. За это отвечает План обмена СинхронизацияДанныхЧерезУниверсальныйФормат. Если открыть состав этого плана обмена в конфигураторе, мы увидим строго ограниченный набор объектов. Физически платформа «1С:Предприятие 8» не позволяет зарегистрировать изменения для объекта, который не входит в состав плана обмена, даже если мы пропишем это в правилах регистрации данных.

Шаг 1. Расширение состава плана обмена без снятия с поддержки

Если наша конфигурация ЗУП находится на поддержке и обновляется в типовом режиме, мы можем изменить состав плана обмена с помощью механизма Расширений конфигурации. Разберем этот процесс по шагам:

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

Аналогичные действия по добавлению документов в план обмена необходимо проделать и на стороне приемника (ERP), чтобы база была готова принимать и записывать эти типы данных.

Шаг 2. Разработка правил в «Конвертации данных 3» (КД 3)

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

После этого новые правила выгружаются из КД 3 и загружаются в настройки синхронизации данных ЗУП и ERP.

Шаг 3. Анализ и исправление ошибки мутабельного значения

При первой же попытке протестировать обмен (особенно если он настроен через прямое COM-соединение) разработчики часто сталкиваются со следующей ошибкой выполнения транзакции:


Ошибка при вызове метода контекста (Записать): Ошибка при выполнении обработчика - 'ПриЗаписи': 
Попытка передачи с клиента на сервер мутабельного значения 1-го параметра метода СправочникСКонтактамиПриЗаписи ().

Давайте подробно разберем, почему возникает эта ошибка и как ее победить. Термин «мутабельное значение» в платформе «1С» означает сложный объект, состояние которого может изменяться (например, ссылки на транзакционные объекты БД, структуры, таблицы значений, а также системные объекты вида СправочникОбъект.ФизическиеЛица).

При обмене через COM-соединение внешняя база подключается как внешний клиент. Когда в процессе загрузки данных выполняется метод Записать() для справочника физических лиц или сотрудников, платформа инициирует выполнение подписок на события, привязанных к транзакции записи. В нашем случае срабатывает предопределенная подписка на событие ПриЗаписи, которая вызывает процедуру СправочникСКонтактамиПриЗаписи из общего модуля.

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

Решение проблемы мутабельности

Для исправления данной ошибки существует два дополняющих друг друга решения:

Решение 1. Настройка свойств общего модуля

Необходимо найти общий модуль, в котором объявлена процедура СправочникСКонтактамиПриЗаписи, открыть его свойства и установить флаг «Внешнее соединение». Это позволит коду обработчика выполняться в том же программном контексте, в котором выполняется COM-сессия, исключая межконтекстный вызов с передачей мутабельных параметров.

Решение 2. Корректная обработка свойства «ОбменДанными.Загрузка»

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

Посмотрим на пример правильного оформления обработчика:


Процедура СправочникСКонтактамиПриЗаписи(Источник, Отказ) Экспорт
    
    // Если происходит импорт данных из другой системы, прерываем выполнение обработчика
    Если Источник.ОбменДанными.Загрузка Тогда
        Возврат;
    КонецЕсли;
    
    // Далее идет основная логика работы для интерактивного режима
    РегистрироватьКонтактнуюИнформацию(Источник);
    
КонецПроцедуры

Установка свойства ОбменДанными.Загрузка = Истина выполняется платформой автоматически при работе стандартных механизмов обмена, что позволяет существенно ускорить загрузку данных и избежать ложных срабатываний бизнес-логики приемника.

Альтернативный архитектурный подход: Web-сервисы (On-Demand)

Прежде чем приступать к масштабной доработке планов обмена для переноса кадровых документов, давайте проанализируем бизнес-требования заказчика. Если руководству или сотрудникам смежных отделов в ERP требуется просто «видеть» кадровые данные (например, актуальное место работы сотрудника, историю его перемещений или печатную форму приказа), переносить физические документы в базу ERP не обязательно.

Вместо этого мы можем использовать интеграцию по требованию через Web/HTTP-сервисы:

  1. В базе ЗУП разрабатывается простой HTTP-сервис, принимающий на вход Уникальный Идентификатор (GUID) физического лица.
  2. Сервис выполняет запрос к кадровым регистрам ЗУП и возвращает структурированный ответ (например, в формате JSON) или сформированный двоичный макет печатной формы приказа в формате PDF.
  3. В ERP создается удобная форма-заглушка или отчет. При открытии этой формы ERP отправляет мгновенный запрос к Web-сервису ЗУП, получает актуальные данные «на лету» и выводит их пользователю.

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

← На главную