При настройке обмена данными между современными конфигурациями на базе БСП (такими как ERP 2, УТ 11, КА 2) и более старыми или кастомизированными решениями (например, локальные версии Бухгалтерии 8), программисты часто сталкиваются с архитектурным различием в хранении данных. В ERP 2 дополнительные сведения и реквизиты хранятся в универсальной табличной части ДополнительныеРеквизиты, в то время как в базе-приемнике эти же данные могут быть представлены как обычные реквизиты объекта.
В рамках данной статьи мы разберем, как правильно настроить правила конвертации свойств (ПКС) в Конвертации данных 2.1, чтобы корректно "поднять" данные из табличной части источника в шапку объекта приемника.
Этот метод наиболее прост в реализации, когда нам нужно получить всего один или два дополнительных реквизита. Основная идея заключается в том, чтобы в правиле конвертации свойства (ПКС) оставить поле Источник пустым и программно вычислить Значение в обработчике Перед выгрузкой.
Проанализируем ситуацию: нам нужно выгрузить доп. реквизит "Цвет" из справочника Номенклатура. Рассмотрим пошаговый алгоритм:
Номенклатура добавим новое ПКС.Цвет (обычный реквизит в Бухгалтерии).Перед выгрузкой данного ПКС напишем следующий код:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| НоменклатураДополнительныеРеквизиты.Значение КАК Значение
|ИЗ
| Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты
|ГДЕ
| НоменклатураДополнительныеРеквизиты.Ссылка = &Источник
| И НоменклатураДополнительныеРеквизиты.Свойство.Наименование = &ИмяСвойства";
Запрос.УстановитьПараметр("Источник", Источник);
// Укажите точное наименование вашего дополнительного реквизита в ERP
Запрос.УстановитьПараметр("ИмяСвойства", "Цвет (Общие)");
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Значение = Выборка.Значение;
Иначе
Значение = Неопределено;
КонецЕсли;
Важный нюанс: обращение к свойству по наименованию (НайтиПоНаименованию или через запрос по строке) является не самым надежным способом. Если пользователь изменит название свойства в ERP, обмен перестанет находить данные. Рассмотрим более профессиональный подход — использование уникального идентификатора или предопределенных имен, если они заданы в ПВХ ДополнительныеРеквизитыИСведения.
Если у справочника Номенклатура десятки дополнительных реквизитов, которые нужно разложить по реквизитам приемника, делать запрос в каждом ПКС — крайне неэффективно. Это приведет к значительному замедлению выгрузки (проблема N+1 запроса). Выясним, как оптимизировать этот процесс.
Мы можем один раз собрать все дополнительные реквизиты в обработчике Перед выгрузкой самого ПКО (Правила конвертации объекта) и передать их в ПКС через структуру ВходящиеДанные.
Шаг 1. В ПКО Номенклатура, в обработчике Перед выгрузкой, подготовим данные:
ВходящиеДанные = Новый Структура;
// Инициализируем ключи структуры именами реквизитов приемника
ВходящиеДанные.Вставить("Цвет", "");
ВходящиеДанные.Вставить("Размер", "");
Для Каждого СтрокаТЧ Из Источник.ДополнительныеРеквизиты Цикл
НазваниеСвойства = Строка(СтрокаТЧ.Свойство);
Если НазваниеСвойства = "Цвет (Общие)" Тогда
ВходящиеДанные.Цвет = СтрокаТЧ.Значение;
ИначеЕсли НазваниеСвойства = "Размер (Общие)" Тогда
ВходящиеДанные.Размер = СтрокаТЧ.Значение;
КонецЕсли;
КонецЦикла;
Шаг 2. В каждом ПКС (Цвет, Размер) в обработчике Перед выгрузкой достаточно будет написать:
Если ВходящиеДанные <> Неопределено Тогда
Значение = ВходящиеДанные.Цвет; // Или другое имя ключа для соответствующего ПКС
КонецЕсли;
Бывают ситуации, когда в ERP дополнительный реквизит является строкой или специальным объектом ЗначенияСвойствОбъектов, а в базе-приемнике это должен быть элемент другого справочника. Проанализируем, как настроить такую связь.
Допустим, нам нужно передать "Формат сигарет". В источнике это значение доп. реквизита, а в приемнике — справочник КлассТМЦ. Разберем по шагам создание правил:
КлассТМЦ. В нем настроим поиск, например, по Наименованию.Номенклатура для ПКС ФорматСигарет в колонке Правило укажем наше новое ПКО КлассТМЦ.Перед выгрузкой этого ПКС получим значение из ТЧ и передадим его как источник для поиска:
// Предположим, мы уже нашли нужную строку в ТЧ или получили её из запроса
// ЗначениеДопРеквизита — это ссылка на справочник "Значения свойств объектов" или строка
Если ЗначениеЗаполнено(ЗначениеДопРеквизита) Тогда
// Передаем наименование, по которому ПКО "КлассТМЦ" выполнит поиск в приемнике
Значение = Строка(ЗначениеДопРеквизита);
Иначе
Значение = "";
КонецЕсли;
Обратите внимание: чтобы поиск в приемнике отработал корректно, в ПКО КлассТМЦ у соответствующего ПКС Наименование должна стоять галочка "Поиск", а в самом ПКО — отключен поиск по внутреннему идентификатору (ГУИД), так как в разных базах они гарантированно будут отличаться.
Если конфигурация ERP 2 типовая, мы можем воспользоваться встроенными механизмами работы со свойствами. Рассмотрим пример использования общего модуля УправлениеСвойствами. Это позволит избежать прямого обращения к табличным частям и сделает код более устойчивым к изменениям метаданных.
// Пример получения значения свойства через БСП
СвойствоСсылка = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Цвет (Общие)");
Значение = УправлениеСвойствами.ЗначениеСвойстваОбъекта(Источник, СвойствоСсылка);
Такой подход делает разработку в Конвертации данных 2.1 более чистой и понятной. Однако помните, что при выгрузке через универсальную обработку V8Exchan83.epf на стороне сервера должны быть доступны все используемые модули.
Подведем итог. Для выгрузки дополнительных реквизитов из табличной части в обычные поля объекта:
Значение.ЗначениеЗаполнено(), чтобы не затирать существующие данные в приемнике пустыми значениями, если это не предусмотрено логикой обмена.Рассмотренные методы позволяют гибко настроить обмен любой сложности, сохраняя высокую производительность системы и целостность передаваемых данных между ERP и Бухгалтерией.