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

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

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

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

Способ 1. Агрегация данных через обработчики ПВД (Правила выгрузки данных)

Этот метод считается наиболее надежным, так как позволяет собрать все ссылки на документы в единую структуру (массив или таблицу значений) непосредственно в процессе выгрузки, а затем одним программным вызовом создать объект в приемнике.

Проанализируем алгоритм настройки ПВД для объекта АктВыполненныхРабот:

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

Теперь настроим ПКО (Правило конвертации объектов) для документа РазовыеНачисления. Поскольку источника у нас нет, в ПКО поле «Источник» оставляем пустым.

Для настройки табличной части документа-приемника используем ПКГС (Правило конвертации групп свойств):

  1. В ПКГС для нужной табличной части переходим в обработчик «Перед обработкой».
  2. Нам необходимо сформировать КоллекцияОбъектов — это специальная переменная, которая будет служить источником данных для строк ТЧ.

КоллекцияОбъектов = Новый ТаблицаЗначений;
КоллекцияОбъектов.Колонки.Добавить("Сотрудник");
КоллекцияОбъектов.Колонки.Добавить("Сумма");

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

Способ 2. Интерактивный выбор документов через параметры обмена

Если вы хотите, чтобы пользователь в обработке «Универсальный обмен данными» сам выбирал список документов на специальной вкладке, нужно использовать Параметры конвертации.

Выясним, как это настроить:

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

Рассмотрим пример кода в ПВД:


Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ Документ.АктВыполненныхРабот ГДЕ Ссылка В (&СписокИзПараметров)";
Запрос.УстановитьПараметр("СписокИзПараметров", Параметры.СписокАктов);
ВыборкаДанных = Запрос.Выполнить().Выгрузить();
// Далее используем алгоритм из первого способа для формирования одного документа

Способ 3. Поиск и дополнение существующего документа в приемнике

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

Разберем работу в обработчике «При загрузке» для ПКО:

  1. Проанализируем ситуацию: нам нужно найти уже существующий документ (например, по дате или комментарию).
  2. Если документ найден, мы не создаем новый, а подменяем Объект.
  3. Устанавливаем режим записи, чтобы новые строки добавились в существующую таблицу.

// Пример поиска существующего документа по ключевому полю
ДокСсылка = Документы.РазовыеНачисления.НайтиПоРеквизиту("Комментарий", "Сводный_Перенос");

Если Не ДокСсылка.Пустая() Тогда
    // Если нашли - загружаем в него
    Объект = ДокСсылка.ПолучитьОбъект();
Иначе
    // Если не нашли - система создаст новый автоматически
КонецЕсли;

// Важно: если нужно добавлять строки, а не замещать, 
// можно очистить ТЧ программно или настроить правила так, чтобы они дополняли ТЧ

Важный момент: Чтобы избежать дублирования строк при повторной выгрузке одних и тех же документов, в ПКО рекомендуется использовать обработчик «Перед загрузкой» для очистки табличной части или внедрить проверку на уникальность (например, проверять, был ли этот конкретный Акт уже перенесен, записывая его номер в скрытый реквизит строки ТЧ в приемнике).

Резюме и рекомендации

Выясним, какой подход лучше выбрать в зависимости от условий:

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

← На главную