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