Как заполнить табличную часть в 1С:Конвертации данных, если в базе-источнике такой таблицы нет?

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

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

Способ 1. Использование входящих данных (ВходящиеДанные)

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

  1. Настройка правила конвертации группы свойств (ПКГС):

    В правиле конвертации объекта (ПКО) перейдем к табличной части приемника. В строке ПКГС оставляем поле «Источник» пустым, а в свойствах группы установим признак «Получать из входящих данных».

  2. Формирование таблицы в ПКО «Перед выгрузкой»:

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

    
    // Создаем структуру входящих данных, если она еще не инициализирована
    Если ВходящиеДанные = Неопределено Тогда
        ВходящиеДанные = Новый Структура;
    КонецЕсли;
    
    // Создаем и описываем колонки таблицы
    ТЗ_Работники = Новый ТаблицаЗначений;
    ТЗ_Работники.Колонки.Добавить("Сотрудник");
    ТЗ_Работники.Колонки.Добавить("ПодразделениеОрганизации");
    ТЗ_Работники.Колонки.Добавить("Должность");
    
    // Заполняем строки данными (например, из реквизитов шапки или запроса)
    НоваяСтрока = ТЗ_Работники.Добавить();
    НоваяСтрока.Сотрудник = Источник.ФизическоеЛицо;
    НоваяСтрока.ПодразделениеОрганизации = Источник.Подразделение;
    НоваяСтрока.Должность = Источник.Должность;
    
    // Передаем таблицу в структуру с именем табличной части приемника
    ВходящиеДанные.Вставить("РаботникиОрганизации", ТЗ_Работники);
    
  3. Настройка правил конвертации свойств (ПКС):

    В подчиненных строках ПКС внутри ПКГС также оставляем источник пустым, либо включаем признак получения из входящих данных, чтобы поля сопоставлялись автоматически по именам колонок созданной таблицы.

Способ 2. Переопределение выборки через переменную «КоллекцияОбъектов»

Проанализируем альтернативный и более компактный способ — прямое переопределение коллекции строк непосредственно в обработчике ПКГС без использования структуры ВходящиеДанные.

В обработчике «Перед обработкой» или «Перед выгрузкой» ПКГС достаточно присвоить сформированную таблицу или массив структур специальной предопределенной переменной КоллекцияОбъектов:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |    Сотрудник КАК Сотрудник,
    |    Должность КАК Должность
    |ИЗ
    |    Документ.ПриемНаРаботу.Начисления КАК Док
    |ГДЕ
    |    Док.Ссылка = &Ссылка";

Запрос.УстановитьПараметр("Ссылка", Источник.Ссылка);
КоллекцияОбъектов = Запрос.Выполнить().Выгрузить();

В этом случае конвертация автоматически выполнит обход строк полученной таблицы и передаст данные в приемник по настроенным ПКС.

Установка предопределенных и фиксированных значений в строках

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

  1. Через ПКС без источника на стороне выгрузки:

    В обработчике Перед выгрузкой нужного ПКС передаем строковое имя предопределенного элемента или уникальный код:

    Значение = "ОтражениеНачисленийПоУмолчанию";

    В ПКО соответствующего справочника настраиваем поиск по имени предопределенного элемента.

  2. В обработчиках загрузки базы-приемника:

    В обработчике «После загрузки» правила конвертации документа можно обойти уже заполненную табличную часть и дозаполнить недостающие ссылки:

    
    Для Каждого Стр Из Объект.РаботникиОрганизации Цикл
        Стр.СпособОтраженияВБухучете = Справочники.СпособыОтраженияЗарплатыВРеглУчете.ОтражениеНачисленийПоУмолчанию;
    КонецЦикла;
    

Свертка строк и предотвращение пустых записей

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

Посмотрим на пример правильной группировки таблицы перед отправкой в обработчике ПКГС Перед обработкой:


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

Важно: если при выгрузке строки не удовлетворяют определенному условию, нельзя просто оставлять реквизиты пустыми — платформа создаст пустую строку в приемнике. Чтобы полностью исключить строку из выгрузки, в обработчике ПКС или ПКГС используйте флаг отмены:


Если Не СтрокаТаблицыСоответствуетУсловию Тогда
    Отказ = Истина;
КонецЕсли;

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

← На главную