Как обеспечить правильный приоритет выгрузки и проведения объектов в Конвертации данных 2.1

Программист 1С v8.3 (Обычные формы) 1С:Зарплата и Управление Персоналом IT и автоматизация бизнеса
← На главную

При настройке обмена данными между конфигурациями 1С с помощью «Конвертации данных 2.1» (КД 2.1) специалисты часто сталкиваются с ситуацией, когда документ (например, ПриемНаРаботу) загружается в базу-приемник раньше, чем связанные с ним справочники (Сотрудники, ФизическиеЛица). Если в правилах настроено автоматическое проведение документа при загрузке, система выдает ошибку, так как объект-ссылка в справочнике еще не «оброс» необходимыми реквизитами. Разберем подробно, почему штатный механизм приоритетов может не срабатывать и какими методами можно добиться корректной последовательности действий.

Развенчиваем миф о поле Приоритет

Прежде всего, проанализируем работу поля Приоритет в ПКО (Правилах конвертации объектов) и ПВД (Правилах выгрузки данных). В КД 2.1 это поле предназначено в основном для разрешения конфликтов. Если для одного и того же типа объекта в источнике создано несколько ПКО, система выберет то, у которого приоритет выше. Однако это поле напрямую не управляет порядком записи объектов в результирующий XML-файл при выгрузке по ссылкам. Если документ ссылается на сотрудника, и в правилах стоит выгрузка этого свойства, сотрудник может попасть в файл как «объект-ссылка» в теле документа, что и приводит к проблемам при проведении.

Метод 1: Изменение физического порядка ПВД

Выясним, как формируется структура XML-файла. Обработка выгрузки обходит дерево ПВД сверху вниз. Рассмотрим последовательность действий для исправления ситуации:

  1. Откроем дерево правил выгрузки данных в конфигурации «Конвертация данных».
  2. Найдем ПВД для справочников, данные которых критичны для проведения документов (например, Сотрудники, Должности, Подразделения).
  3. Используя стрелки перемещения в интерфейсе КД, поднимем эти ПВД в самый верх списка, чтобы они располагались выше ПВД документов.

Таким образом, при линейном чтении файла загрузки справочники будут созданы и записаны первыми. Когда дело дойдет до документа, все связи уже будут корректно заполнены в базе-приемнике.

Метод 2: Принудительная выгрузка объекта через обработчики

Если нам необходимо гарантировать, что конкретный объект справочника будет полностью выгружен непосредственно перед выгрузкой документа, воспользуемся программным методом. Для этого в ПКО документа (например, ПриемНаРаботу) в обработчике Перед выгрузкой пропишем вызов функции ВыгрузитьОбъект.

Рассмотрим пример кода:


// В обработчике "Перед выгрузкой" ПКО документа
Если ЗначениеЗаполнено(Источник.Сотрудник) Тогда
    // Принудительно выгружаем сотрудника со всеми реквизитами по его ПКО
    ВыгрузитьОбъект(Источник.Сотрудник);
КонецЕсли;

Этот подход заставляет систему прервать текущую последовательность и поместить полные данные справочника в файл обмена раньше данных самого документа. Это особенно полезно, если обмен идет не по всем данным сразу, а выборочно.

Метод 3: Использование флага Выгружать объект полностью

Проанализируем настройки ПКС (Правил конвертации свойств). Часто в правилах документа для свойства Сотрудник ошибочно устанавливается галочка Выгружать только ссылку. В этом случае, даже если справочник выгружается отдельно, в момент загрузки документа система может создать «битую» или пустую ссылку, если объект еще не был загружен.

Чтобы избежать этого, проверим следующие настройки:

Метод 4: Отложенное проведение документов

Самым надежным и профессиональным решением считается отказ от немедленного проведения при загрузке. Проведение — это сложная операция, требующая наличия множества записей в регистрах, которые могут передаваться в этом же обмене, но позже.

Рассмотрим алгоритм реализации отложенного проведения:

  1. В настройках ПКО документа на закладке «Выгрузка данных» снимем флаг Проводить при загрузке.
  2. В обработчике После загрузки (в ПКО или в целом для правил) добавим логику пометки документа для последующей обработки.
  3. Если используется типовая конфигурация на базе БСП, можно использовать механизм «Заметки к проведению» или записывать ссылки на загруженные документы во временный массив (параметр Параметры.ОбъектыДляПроведения).
  4. После завершения загрузки файла запустим отдельную процедуру, которая выполнит проведение всех новых документов в правильной последовательности.

Пример простейшего кода в обработчике После загрузки ПКО для немедленного проведения (с обработкой ошибок):


Попытка
    // Пытаемся провести объект только если он новый или был не проведен
    Если Объект.РежимЗаписиДокумента <> РежимЗаписиДокумента.Проведение Тогда
        Объект.Записать(РежимЗаписиДокумента.Проведение);
    КонецЕсли;
Исключение
    Сообщить("Не удалось провести документ: " + ОписаниеОшибки());
    // Оставляем документ просто записанным
    Объект.Записать(РежимЗаписиДокумента.Запись);
КонецПопытки;

Резюме

Для решения проблемы приоритетов в КД 2.1 мы рекомендуем использовать комплексный подход. Сначала поднимаем ПВД справочников в верх списка. Затем проверяем, чтобы свойства выгружались полностью, а не только по ссылке. В наиболее ответственных узлах используем ВыгрузитьОбъект(). И, наконец, наиболее стабильный результат дает отложенное проведение, выполняемое после того, как весь XML-пакет был успешно разобран и записан в информационную базу.

← На главную