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