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