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