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

Программист IT и автоматизация бизнеса
← На главную

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

Разберем основные способы реализации такой выгрузки в конфигурации Конвертация данных 2.0, а также выясним, как правильно настроить уникальность выгружаемых объектов, чтобы избежать появления дублей при повторном обмене.

Способ 1. Обход табличной части и выгрузка по правилу в событиях ПКО

Проанализируем первый вариант реализации. Он заключается в том, чтобы перехватить выгрузку основного документа-источника и программно вызвать правило конвертации для каждой строки его табличной части.

Разберем по шагам, как это настроить:

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

Посмотрим на пример кода в обработчике ПередВыгрузкой ПКО документа-источника:


Для Каждого СтрокаТЧ Из Источник.Товары Цикл
    
    ВходящиеДанные = Новый Структура;
    ВходящиеДанные.Вставить("Дата", Источник.Дата);
    ВходящиеДанные.Вставить("Организация", Источник.Организация);
    ВходящиеДанные.Вставить("Номенклатура", СтрокаТЧ.Номенклатура);
    ВходящиеДанные.Вставить("Количество", СтрокаТЧ.Количество);
    ВходящиеДанные.Вставить("Сумма", СтрокаТЧ.Сумма);
    ВходящиеДанные.Вставить("НомерСтрокиИсточника", СтрокаТЧ.НомерСтроки);
    
    ВыгрузитьПоПравилу( , , ВходящиеДанные, , "ПКО_ДокументПриемник");
    
КонецЦикла;

Отказ = Истина;

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

Способ 2. Выборка данных запросом и передача в коллекцию

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

Рассмотрим порядок действий для этого подхода:

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

Как избежать дублирования документов при повторном обмене?

При использовании выгрузки без объекта-источника (или при создании нескольких документов из одного) стандартный поиск по GUID (внутреннему идентификатору) не работает. В результате при каждом повторном обмене платформа будет создавать новые документы-дубли с разными номерами.

Выясним причины этой проблемы и способы ее решения:

  1. Управление ключом выгрузки данных: Чтобы платформа КД 2.0 корректно идентифицировала выгружаемые строки в рамках сеанса, в ПКО при выгрузке каждой строки необходимо задавать уникальный параметр КлючВыгружаемыхДанных. Например, формировать его как составную строку из уникального идентификатора документа-источника и номера строки:
    
    КлючВыгружаемыхДанных = Строка(Источник.Ссылка.УникальныйИдентификатор()) + "_" + Строка(СтрокаТЧ.НомерСтроки);
    
  2. Настройка поиска в базе-приемнике: В ПКО документа-приемника необходимо отключить галочку поиска по внутреннему идентификатору. Поиск ранее загруженного документа должен выполняться по бизнес-ключам.
  3. Использование обработчика ПоляПоиска: Для гарантированного сопоставления объектов в обработчике ПоляПоиска ПКО документа-приемника пишем алгоритм поиска существующего документа в базе-приемнике. Если документ найден, присваиваем его переменной СсылкаНаНайденныйОбъект и устанавливаем ПрекратитьПоиск = Истина.

Учитывая описанные рекомендации, мы обеспечим не только корректное расщепление табличной части документа на отдельные объекты, но и их правильную повторную синхронизацию при повторных обменах.

← На главную