При интеграции систем 1С:Зарплата и управление персоналом 3.1 (ЗУП) и 1С:ERP Управление предприятием 2 (ERP) разработчики часто сталкиваются с жесткими ограничениями типового обмена. Штатный механизм синхронизации через Универсальный формат (EnterpriseData) спроектирован исключительно для трансляции результатов расчетов в финансовый контур. Кадровые документы, такие как Прием на работу или Кадровое перемещение, в этот обмен по умолчанию не входят.
В этой статье мы подробно разберем, как расширить состав типового обмена без снятия конфигурации с поддержки, а также проанализируем природу популярной ошибки межконтекстного взаимодействия: "Попытка передачи с клиента на сервер мутабельного значения..." при записи справочников через COM-соединение.
Попытка просто доработать правила регистрации или правила обмена в программе «1С:Конвертация данных» и загрузить их в работающий узел синхронизации не принесет желаемого результата. Давайте выясним причину этого поведения.
Для того чтобы объект конфигурации (документ или справочник) мог участвовать в обмене данными, он должен быть зарегистрирован на соответствующем узле плана обмена. За это отвечает План обмена СинхронизацияДанныхЧерезУниверсальныйФормат. Если открыть состав этого плана обмена в конфигураторе, мы увидим строго ограниченный набор объектов. Физически платформа «1С:Предприятие 8» не позволяет зарегистрировать изменения для объекта, который не входит в состав плана обмена, даже если мы пропишем это в правилах регистрации данных.
Если наша конфигурация ЗУП находится на поддержке и обновляется в типовом режиме, мы можем изменить состав плана обмена с помощью механизма Расширений конфигурации. Разберем этот процесс по шагам:
СинхронизацияДанныхЧерезУниверсальныйФормат, кликнем по нему правой кнопкой мыши и выберем пункт «Добавить в расширение».ПриемНаРаботу, КадровоеПеремещение, Увольнение). Для каждого добавленного объекта укажем авторегистрацию в значении Запретить (так как регистрацией будут управлять наши правила регистрации).СинхронизацияДанныхЧерезУниверсальныйФорматРегистрация) и включим в состав ее источников наши новые кадровые документы.Аналогичные действия по добавлению документов в план обмена необходимо проделать и на стороне приемника (ERP), чтобы база была готова принимать и записывать эти типы данных.
Поскольку обмен осуществляется через универсальный формат EnterpriseData, нам потребуется настроить правила интеграции:
После этого новые правила выгружаются из КД 3 и загружаются в настройки синхронизации данных ЗУП и ERP.
При первой же попытке протестировать обмен (особенно если он настроен через прямое COM-соединение) разработчики часто сталкиваются со следующей ошибкой выполнения транзакции:
Ошибка при вызове метода контекста (Записать): Ошибка при выполнении обработчика - 'ПриЗаписи':
Попытка передачи с клиента на сервер мутабельного значения 1-го параметра метода СправочникСКонтактамиПриЗаписи ().
Давайте подробно разберем, почему возникает эта ошибка и как ее победить. Термин «мутабельное значение» в платформе «1С» означает сложный объект, состояние которого может изменяться (например, ссылки на транзакционные объекты БД, структуры, таблицы значений, а также системные объекты вида СправочникОбъект.ФизическиеЛица).
При обмене через COM-соединение внешняя база подключается как внешний клиент. Когда в процессе загрузки данных выполняется метод Записать() для справочника физических лиц или сотрудников, платформа инициирует выполнение подписок на события, привязанных к транзакции записи. В нашем случае срабатывает предопределенная подписка на событие ПриЗаписи, которая вызывает процедуру СправочникСКонтактамиПриЗаписи из общего модуля.
Если у общего модуля, в котором расположен обработчик подписки, на уровне конфигурации не установлен флаг «Внешнее соединение», платформа пытается передать управление из контекста COM-соединения (которое воспринимается как клиентская сессия) на серверный контекст. При этом вызове первым параметром передается сам записываемый объект (Источник, имеющий тип СправочникОбъект). Поскольку передавать мутабельные объекты между клиентом и сервером запрещено, система аварийно завершает транзакцию с ошибкой.
Для исправления данной ошибки существует два дополняющих друг друга решения:
Решение 1. Настройка свойств общего модуля
Необходимо найти общий модуль, в котором объявлена процедура СправочникСКонтактамиПриЗаписи, открыть его свойства и установить флаг «Внешнее соединение». Это позволит коду обработчика выполняться в том же программном контексте, в котором выполняется COM-сессия, исключая межконтекстный вызов с передачей мутабельных параметров.
Решение 2. Корректная обработка свойства «ОбменДанными.Загрузка»
Любые транзакционные проверки, заполнение контактной информации по умолчанию и прочая интерактивная бизнес-логика не должны выполняться, если объект записывается программно в процессе импорта данных. В начале каждого обработчика подписки на события обязательно должна присутствовать проверка режима загрузки данных.
Посмотрим на пример правильного оформления обработчика:
Процедура СправочникСКонтактамиПриЗаписи(Источник, Отказ) Экспорт
// Если происходит импорт данных из другой системы, прерываем выполнение обработчика
Если Источник.ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
// Далее идет основная логика работы для интерактивного режима
РегистрироватьКонтактнуюИнформацию(Источник);
КонецПроцедуры
Установка свойства ОбменДанными.Загрузка = Истина выполняется платформой автоматически при работе стандартных механизмов обмена, что позволяет существенно ускорить загрузку данных и избежать ложных срабатываний бизнес-логики приемника.
Прежде чем приступать к масштабной доработке планов обмена для переноса кадровых документов, давайте проанализируем бизнес-требования заказчика. Если руководству или сотрудникам смежных отделов в ERP требуется просто «видеть» кадровые данные (например, актуальное место работы сотрудника, историю его перемещений или печатную форму приказа), переносить физические документы в базу ERP не обязательно.
Вместо этого мы можем использовать интеграцию по требованию через Web/HTTP-сервисы:
Такой подход гарантирует чистоту базы данных ERP, исключает дублирование транзакционной информации, значительно упрощает последующие обновления обеих конфигураций и решает проблемы разграничения прав доступа к конфиденциальным кадровым данным.