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