Разработчики, занимающиеся настройкой интеграции между конфигурациями 1С при помощи инструмента «Конвертация данных 2.1», часто сталкиваются со следующей проблемой. Написанный программный код в обработчиках правил конвертации объектов (ПКО) идеально отрабатывает при тестировании через обработку «Универсальный обмен данными в формате XML». Однако стоит запустить те же самые правила в режиме автоматической фоновой синхронизации данных (через Библиотеку стандартных подсистем — БСП), как программное создание записей в регистре сведений полностью перестает работать.
В этой статье мы подробно разберем, почему возникает такое поведение системы, проанализируем внутренние механизмы работы платформы 1С и БСП, а также рассмотрим несколько способов решения этой задачи — от быстрой настройки до архитектурно правильного проектирования правил обмена.
Для начала давайте разберем типичный сценарий. Разработчик в ПКО справочника (например, способы отражения зарплаты) в обработчике После загрузки (или ошибочно названном «После обработки») пишет следующий код:
НаборЗаписей = РегистрыСведений.ПорядокОтраженияЗарплатыВБухУчете.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.СпособОтраженияЗарплатыВБухУчете.Установить(Объект.Ссылка);
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.СпособОтраженияЗарплатыВБухУчете = Объект.Ссылка;
НаборЗаписей.Записать();
При ручном переносе через обработку «Универсальный обмен» этот код успешно отрабатывает. Но при синхронизации в фоновом режиме записи в регистре не появляются. Проанализируем ключевые причины этого сбоя.
После загрузки срабатывает в момент, когда объект прочитан из XML-файла и заполнен в памяти, но еще не сохранен в СУБД. В этот момент у нового объекта свойство Объект.Ссылка может быть еще пустым или не иметь фактической записи в таблице базы данных. Попытка записать набор записей регистра с незаписанной ссылкой приводит к ошибке целостности базы данных или созданию битых ссылок, из-за чего транзакция записи может тихо откатываться.ОбменДанными.Загрузка = Истина, система начнет выполнять всю сопутствующую бизнес-логику регистра (подписки на события, проверки в модуле набора записей). В режиме синхронизации это часто вызывает конфликты блокировок или транзакционные ошибки.Записать() для созданных вручную наборов записей), если они выполняются в обход стандартных механизмов XML-десериализации.Теперь, когда мы понимаем физику процесса, давайте пошагово разберем методы устранения проблемы.
Если ваша база-приемник работает на управляемых формах (например, Бухгалтерия предприятия 3.0), обязательно обновите правила обмена на обеих сторонах. Для этого выполним следующие действия:
Давайте оптимизируем код создания записи регистра сведений. Во-первых, перенесем код из обработчика После загрузки в обработчик После записи ПКО справочника. На данном этапе объект гарантированно записан в базу данных и имеет валидную ссылку.
Во-вторых, обязательно добавим установку флага ОбменДанными.Загрузка для создаваемого набора записей. Рассмотрим правильный пример написания кода:
// Код пишется в ПКО нужного справочника, в событии "После записи"
НаборЗаписей = РегистрыСведений.ПорядокОтраженияЗарплатыВБухУчете.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.СпособОтраженияЗарплатыВБухУчете.Установить(Объект.Ссылка);
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.СпособОтраженияЗарплатыВБухУчете = Объект.Ссылка;
// Здесь можно заполнить другие реквизиты и измерения регистра, если необходимо
// Установка флага загрузки критически важна для обхода лишних проверок и исключения зацикливания обмена!
НаборЗаписей.ОбменДанными.Загрузка = Истина;
Попытка
НаборЗаписей.Записать();
Исключение
ЗаписьЖурналаРегистрации("ОбменДанными.ЗаписьРегистра",
УровеньЖурналаРегистрации.Ошибка, , ,
"Не удалось записать регистр для объекта: " + ОписаниеОшибки());
КонецПопытки;
Использование конструкции Попытка...Исключение с выводом информации в Журнал регистрации позволит вам быстро локализовать проблему, если запись регистра все же заблокируется из-за каких-либо внутренних ограничений базы данных.
Написание сложного программного кода в обработчиках загрузки «Конвертации данных» — это крайняя мера, которая снижает читаемость правил и часто ломается при обновлениях БСП. Проектировщики КД 2.1 заложили декларативный способ решения подобных задач.
Давайте разберем по шагам, как настроить автоматический перенос регистра сведений без написания кода записи в приемнике:
ПорядокОтраженияЗарплатыВБухУчете. Настройте правила конвертации свойств (ПКС) для его измерений и ресурсов.
// Передаем ссылку на текущий справочник-источник в ПКО регистра сведений
ВыгрузитьПоПравилу(Источник, , , , "ПорядокОтраженияЗарплатыВБухУчете");
При таком подходе платформа на стороне источника сама сформирует XML-пакет для регистра сведений. Приемник получит штатные данные регистра в стандартном XML-виде и загрузит их, используя оптимизированные платформенные механизмы БСП. Это гарантирует стабильную работу обмена, корректную регистрацию изменений и полное отсутствие ошибок, связанных с безопасным режимом выполнения серверного кода.