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