При настройке обмена данными между конфигурациями 1С часто возникает задача агрегации данных. Стандартный механизм «один в один», когда одному объекту источника соответствует один объект приемника, не всегда подходит под требования бизнеса. Рассмотрим классическую ситуацию: в базе-источнике пользователь создает множество мелких документов (например, Акт выполненных работ), а в базе-приемнике требуется получить один сводный документ (например, Разовые начисления), в табличную часть которого попадут данные из всех выбранных актов.
Основная сложность здесь заключается в том, чтобы заставить универсальную обработку обмена «дождаться» окончания выбора всех документов и сформировать один результирующий объект вместо множества. Разберем по шагам, как это реализовать с помощью конфигурации «Конвертация данных 2.1».
Этот метод считается наиболее надежным, так как позволяет собрать все ссылки на документы в единую структуру (массив или таблицу значений) непосредственно в процессе выгрузки, а затем одним программным вызовом создать объект в приемнике.
Проанализируем алгоритм настройки ПВД для объекта АктВыполненныхРабот:
// Создаем массив в параметрах, чтобы он был доступен во всех итерациях выгрузки
Параметры.Вставить("ВыбранныеДокументыДляОбъединения", Новый Массив);
// Отменяем автоматическую выгрузку текущего объекта
Отказ = Истина;
// Добавляем ссылку на документ в наш массив
Параметры.ВыбранныеДокументыДляОбъединения.Добавить(Объект);
// Проверяем, есть ли данные для выгрузки
Если Параметры.ВыбранныеДокументыДляОбъединения.Количество() > 0 Тогда
// Вызываем выгрузку по правилу конвертации объекта (ПКО)
// В качестве источника передаем Неопределено, так как объекта-источника целиком нет
// Вместо этого передаем наш массив через параметр "ВходящиеДанные"
ВыгрузитьПоПравилу( , , Параметры.ВыбранныеДокументыДляОбъединения, , "РазовыеНачисления");
КонецЕсли;
Теперь настроим ПКО (Правило конвертации объектов) для документа РазовыеНачисления. Поскольку источника у нас нет, в ПКО поле «Источник» оставляем пустым.
Для настройки табличной части документа-приемника используем ПКГС (Правило конвертации групп свойств):
КоллекцияОбъектов — это специальная переменная, которая будет служить источником данных для строк ТЧ.
КоллекцияОбъектов = Новый ТаблицаЗначений;
КоллекцияОбъектов.Колонки.Добавить("Сотрудник");
КоллекцияОбъектов.Колонки.Добавить("Сумма");
// Перебираем документы, переданные из ПВД через ВходящиеДанные
Для Каждого ТекущийДокумент Из ВходящиеДанные Цикл
// Предположим, в акте есть ТЧ "Услуги" или реквизиты, которые нужно перенести
НоваяСтрока = КоллекцияОбъектов.Добавить();
НоваяСтрока.Сотрудник = ТекущийДокумент.Контрагент; // Пример сопоставления
НоваяСтрока.Сумма = ТекущийДокумент.СуммаДокумента;
КонецЦикла;
Если вы хотите, чтобы пользователь в обработке «Универсальный обмен данными» сам выбирал список документов на специальной вкладке, нужно использовать Параметры конвертации.
Выясним, как это настроить:
СписокАктов. Установите тип значения СписокЗначений.Рассмотрим пример кода в ПВД:
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ Документ.АктВыполненныхРабот ГДЕ Ссылка В (&СписокИзПараметров)";
Запрос.УстановитьПараметр("СписокИзПараметров", Параметры.СписокАктов);
ВыборкаДанных = Запрос.Выполнить().Выгрузить();
// Далее используем алгоритм из первого способа для формирования одного документа
Иногда задача стоит иначе: не создать один документ за один раз, а постепенно «дописывать» данные в один и тот же документ в приемнике при каждой выгрузке. В этом случае логику нужно перенести в ПКО объекта на сторону приемника.
Разберем работу в обработчике «При загрузке» для ПКО:
Объект.
// Пример поиска существующего документа по ключевому полю
ДокСсылка = Документы.РазовыеНачисления.НайтиПоРеквизиту("Комментарий", "Сводный_Перенос");
Если Не ДокСсылка.Пустая() Тогда
// Если нашли - загружаем в него
Объект = ДокСсылка.ПолучитьОбъект();
Иначе
// Если не нашли - система создаст новый автоматически
КонецЕсли;
// Важно: если нужно добавлять строки, а не замещать,
// можно очистить ТЧ программно или настроить правила так, чтобы они дополняли ТЧ
Важный момент: Чтобы избежать дублирования строк при повторной выгрузке одних и тех же документов, в ПКО рекомендуется использовать обработчик «Перед загрузкой» для очистки табличной части или внедрить проверку на уникальность (например, проверять, был ли этот конкретный Акт уже перенесен, записывая его номер в скрытый реквизит строки ТЧ в приемнике).
Выясним, какой подход лучше выбрать в зависимости от условий:
Помните, что при использовании ВыгрузитьПоПравилу без источника, вы берете на себя ответственность за заполнение всех обязательных реквизитов документа-приемника (Организация, Дата, Валюта и т.д.) либо через ВходящиеДанные, либо через алгоритмы в ПКО.