Как выгрузить дополнительные реквизиты из ERP 2 в обычные реквизиты Бухгалтерии при помощи Конвертации данных 2.1

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

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

В рамках данной статьи мы разберем, как правильно настроить правила конвертации свойств (ПКС) в Конвертации данных 2.1, чтобы корректно "поднять" данные из табличной части источника в шапку объекта приемника.

Способ 1. Получение значения через запрос в ПКС

Этот метод наиболее прост в реализации, когда нам нужно получить всего один или два дополнительных реквизита. Основная идея заключается в том, чтобы в правиле конвертации свойства (ПКС) оставить поле Источник пустым и программно вычислить Значение в обработчике Перед выгрузкой.

Проанализируем ситуацию: нам нужно выгрузить доп. реквизит "Цвет" из справочника Номенклатура. Рассмотрим пошаговый алгоритм:

  1. В ПКО Номенклатура добавим новое ПКС.
  2. В поле Приемник выберем реквизит Цвет (обычный реквизит в Бухгалтерии).
  3. Поле Источник оставим пустым.
  4. В обработчике Перед выгрузкой данного ПКС напишем следующий код:

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

Запрос.УстановитьПараметр("Источник", Источник);
// Укажите точное наименование вашего дополнительного реквизита в ERP
Запрос.УстановитьПараметр("ИмяСвойства", "Цвет (Общие)"); 

Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
    Значение = Выборка.Значение;
Иначе
    Значение = Неопределено;
КонецЕсли;

Важный нюанс: обращение к свойству по наименованию (НайтиПоНаименованию или через запрос по строке) является не самым надежным способом. Если пользователь изменит название свойства в ERP, обмен перестанет находить данные. Рассмотрим более профессиональный подход — использование уникального идентификатора или предопределенных имен, если они заданы в ПВХ ДополнительныеРеквизитыИСведения.

Способ 2. Оптимизированный сбор данных через ВходящиеДанные

Если у справочника Номенклатура десятки дополнительных реквизитов, которые нужно разложить по реквизитам приемника, делать запрос в каждом ПКС — крайне неэффективно. Это приведет к значительному замедлению выгрузки (проблема N+1 запроса). Выясним, как оптимизировать этот процесс.

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

Шаг 1. В ПКО Номенклатура, в обработчике Перед выгрузкой, подготовим данные:


ВходящиеДанные = Новый Структура;
// Инициализируем ключи структуры именами реквизитов приемника
ВходящиеДанные.Вставить("Цвет", "");
ВходящиеДанные.Вставить("Размер", "");

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

Шаг 2. В каждом ПКС (Цвет, Размер) в обработчике Перед выгрузкой достаточно будет написать:


Если ВходящиеДанные <> Неопределено Тогда
    Значение = ВходящиеДанные.Цвет; // Или другое имя ключа для соответствующего ПКС
КонецЕсли;

Способ 3. Конвертация типов (Строка из Доп. реквизита в Ссылку)

Бывают ситуации, когда в ERP дополнительный реквизит является строкой или специальным объектом ЗначенияСвойствОбъектов, а в базе-приемнике это должен быть элемент другого справочника. Проанализируем, как настроить такую связь.

Допустим, нам нужно передать "Формат сигарет". В источнике это значение доп. реквизита, а в приемнике — справочник КлассТМЦ. Разберем по шагам создание правил:

  1. Создадим отдельное ПКО для справочника КлассТМЦ. В нем настроим поиск, например, по Наименованию.
  2. В ПКО Номенклатура для ПКС ФорматСигарет в колонке Правило укажем наше новое ПКО КлассТМЦ.
  3. В обработчике Перед выгрузкой этого ПКС получим значение из ТЧ и передадим его как источник для поиска:

// Предположим, мы уже нашли нужную строку в ТЧ или получили её из запроса
// ЗначениеДопРеквизита — это ссылка на справочник "Значения свойств объектов" или строка
Если ЗначениеЗаполнено(ЗначениеДопРеквизита) Тогда
    // Передаем наименование, по которому ПКО "КлассТМЦ" выполнит поиск в приемнике
    Значение = Строка(ЗначениеДопРеквизита); 
Иначе
    Значение = "";
КонецЕсли;

Обратите внимание: чтобы поиск в приемнике отработал корректно, в ПКО КлассТМЦ у соответствующего ПКС Наименование должна стоять галочка "Поиск", а в самом ПКО — отключен поиск по внутреннему идентификатору (ГУИД), так как в разных базах они гарантированно будут отличаться.

Использование функций БСП для упрощения кода

Если конфигурация ERP 2 типовая, мы можем воспользоваться встроенными механизмами работы со свойствами. Рассмотрим пример использования общего модуля УправлениеСвойствами. Это позволит избежать прямого обращения к табличным частям и сделает код более устойчивым к изменениям метаданных.


// Пример получения значения свойства через БСП
СвойствоСсылка = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Цвет (Общие)");
Значение = УправлениеСвойствами.ЗначениеСвойстваОбъекта(Источник, СвойствоСсылка);

Такой подход делает разработку в Конвертации данных 2.1 более чистой и понятной. Однако помните, что при выгрузке через универсальную обработку V8Exchan83.epf на стороне сервера должны быть доступны все используемые модули.

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

Подведем итог. Для выгрузки дополнительных реквизитов из табличной части в обычные поля объекта:

Рассмотренные методы позволяют гибко настроить обмен любой сложности, сохраняя высокую производительность системы и целостность передаваемых данных между ERP и Бухгалтерией.

← На главную