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

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

При настройке правил обмена в конфигурации 1С:Конвертация данных 2.1 нередко возникает задача: на стороне источника существует один вид документа (например, РеализацияТоваровУслуг), но в зависимости от установленного реквизита или флага (например, ПередачаВПереработку) в базу-приемник должен загружаться либо аналогичный документ реализации, либо документ передачи материалов переработчику. Посмотрим на типовые ошибки при реализации такого сценария и разберем правильные подходы к решению задачи.

Почему происходит дублирование при вызове ВыгрузитьПоПравилу

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

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

Способ 1. Переопределение правила в ПВД (рекомендуемый подход)

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

В обработчике ПВД Перед выгрузкой объекта доступна служебная переменная ИмяПКО, а также переменная Объект, содержащая ссылку на выгружаемый документ. Для изменения целевого объекта достаточно переопределить имя правила:


Если Объект.ПередачаВПереработку Тогда
    ИмяПКО = "ПередачаТоваров";
Иначе
    ИмяПКО = "РеализацияТоваровУслуг";
КонецЕсли;

В этом случае платформа автоматически направит объект в нужное ПКО без необходимости ручного вызова функций выгрузки и без дублирования данных.

Обратите внимание: если в ПВД данные выбираются стандартной выборкой, в переменной Объект хранится ссылка. Если требуемый реквизит недоступен напрямую или требуется анализ табличной части, следует предварительно получить объект через Объект.ПолучитьОбъект().

Способ 2. Использование ВыгрузитьПоПравилу с установкой флага Отказ в ПКО

Рассмотрим альтернативный вариант, когда логику требуется разместить непосредственно в основном ПКО (например, если документ выгружается по ссылке из другого объекта, где ПВД не задействовано). Чтобы избежать формирования дубля исходного документа, сразу после принудительной выгрузки необходимо установить флаг Отказ = Истина;:


Если Источник.ПередачаВПереработку Тогда
    ВыгрузитьПоПравилу(Источник,
                       Неопределено,
                       Неопределено,
                       Неопределено,
                       "ПередачаТоваров");
    Отказ = Истина;
КонецЕсли;

Установка флага Отказ = Истина сообщает обработчику о необходимости прекратить дальнейшую стандартную сериализацию текущего документа, в результате чего в файл выгрузки попадет только узел, сформированный внутри функции ВыгрузитьПоПравилу.

Способ 3. Переопределение ПКО при выгрузке по ссылке (в ПКС)

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


Если Источник.ПередачаВПереработку Тогда
    ИмяПКО = "ПередачаТоваров";
КонецЕсли;

Как корректно переносить сопутствующие договоры

При трансформации реализации в передачу переработчику часто возникает несовпадение аналитики: в реализации используется договор с видом С покупателем, а в документе передачи требуется договор с видом С поставщиком или С переработчиком.

Разберем порядок действий для корректной синхронизации договоров:

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

Особенности синхронизации объектов по GUID

По умолчанию Конвертация данных 2.1 сопоставляет объекты по их внутреннему уникальному идентификатору (GUID). Если один и тот же документ источника может при определенных условиях конвертироваться в разные документы приемника, прямая синхронизация по GUID способна вызвать коллизии метаданных.

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

← На главную