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