Как перенести единицы измерения номенклатуры из БП 3.0 в УТ 11 через Конвертацию данных

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

При настройке обмена данными между конфигурациями «Бухгалтерия предприятия 3.0» и «Управление торговлей 11» с помощью «Конвертации данных» (КД 2.0) разработчики часто сталкиваются с несоответствием структуры хранения базовых единиц измерения. В БП 3.0 реквизит номенклатуры ЕдиницаИзмерения ссылается напрямую на справочник КлассификаторЕдиницИзмерения. В некоторых релизах УТ 11 структура устроена сложнее: единицы измерения подчинены справочнику номенклатуры или наборам упаковок. Разберем особенности архитектуры обеих конфигураций и пошагово настроим правила конвертации для корректной передачи данных.

Архитектурные различия хранения единиц в БП 3.0 и УТ 11

Прежде чем приступать к написанию правил обмена, проанализируем версию конфигурации-приемника «Управление торговлей»:

  1. Ранние релизы УТ 11 (до версии 11.1.10): базовая единица номенклатуры хранилась в подчиненном справочнике УпаковкиЕдиницыИзмерения. Владельцем выступала сама позиция номенклатуры (или справочник НаборыУпаковок). В реквизите номенклатуры хранилась ссылка не на ОКЕИ, а на подчиненный элемент. Из-за этого возникала циклическая зависимость: подчиненную единицу нельзя записать без владельца, а номенклатуру без заполненной единицы.
  2. Современные релизы УТ 11 (начиная с 11.1.10, 11.2, 11.4, 11.5): разработчики платформы отказались от сложной схемы для базовых единиц. В справочнике Номенклатура реквизит ЕдиницаИзмерения стал прямой ссылкой на КлассификаторЕдиницИзмерения, аналогично БП 3.0. Подчиненный справочник был переименован в УпаковкиНоменклатуры и теперь хранит только упаковки с коэффициентами пересчета.

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

Способ 1. Настройка ПКО для подчиненной единицы через ИсходящиеДанные

Разберем классический подход в КД 2.0, когда для создания подчиненного элемента формируется отдельное правило конвертации объектов (ПКО), а выгрузка инициируется при обработке номенклатуры.

  1. Создаем ПКО для подчиненной единицы:

    Создадим новое правило, где Источник оставляем пустым, а Приемником выбираем справочник УпаковкиЕдиницыИзмерения (или ЕдиницыИзмерения). В параметрах ПКО обязательно снимаем флаг «Искать объект приемника по внутреннему идентификатору».

  2. Настраиваем поиск подчиненного элемента:

    В ПКС для реквизитов Владелец и ЕдиницаПоКлассификатору устанавливаем флаги «Поля поиска». Приемник будет находить существующую единицу по связке владельца и классификатора ОКЕИ, что предотвратит дублирование элементов при повторных выгрузках.

  3. Инициируем выгрузку в ПКО Номенклатуры:

    Перейдем в ПКО справочника Номенклатура и откроем обработчик ПослеВыгрузки. Сформируем структуру с данными единицы измерения и передадим ее в подчиненное правило с помощью метода ВыгрузитьПоПравилу():

    
    ИсходящиеДанные = Новый Структура;
    ИсходящиеДанные.Вставить("Владелец", Источник.Ссылка);
    ИсходящиеДанные.Вставить("ЕдиницаПоКлассификатору", Источник.ЕдиницаИзмерения);
    ИсходящиеДанные.Вставить("Коэффициент", 1);
    ИсходящиеДанные.Вставить("Числитель", 1);
    ИсходящиеДанные.Вставить("Знаменатель", 1);
    
    ВыгрузитьПоПравилу(Источник, , ИсходящиеДанные, , "ПКО_УпаковкиЕдиницыИзмерения");
    
  4. Разрешаем циклическую зависимость при загрузке:

    Чтобы избежать ошибки при записи объекта без владельца, не сопоставляйте реквизит ЕдиницаИзмерения у номенклатуры напрямую. Заполним его в обработчике ПослеЗагрузки ПКО единицы измерения:

    
    Если Объект.Владелец <> Неопределено И ЗначениеЗаполнено(Объект.Владелец) Тогда
        ОбъектВладелец = Объект.Владелец.ПолучитьОбъект();
        Если ОбъектВладелец <> Неопределено Тогда
            ОбъектВладелец.ЕдиницаИзмерения = Объект.Ссылка;
            ОбъектВладелец.Записать();
        КонецЕсли;
    КонецЕсли;
    

Способ 2. Выгрузка единиц отдельным ПВД через произвольный запрос

Если в базе-источнике большой объем данных и мы хотим избежать многократных обращений к обработчикам при выгрузке каждого элемента номенклатуры, разберем вариант с разделением переноса на два независимых шага.

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

Способ 3. Использование Универсального формата (EnterpriseData / КД 3.0)

Если конфигурации находятся на поддержке, лучшим решением будет отказ от правил КД 2.0 в пользу типового механизма обмена через универсальный формат EnterpriseData:

  1. В универсальном формате данные о единицах номенклатуры абстрагированы от внутренней структуры базы. Передается стандартизированная структура с кодом и наименованием по классификатору ОКЕИ.
  2. Типовой менеджер обмена в УТ 11 (МенеджерОбменаЧерезУниверсальныйФормат) самостоятельно определяет архитектуру конфигурации: при загрузке он проверяет наличие реквизита, создает необходимые записи в КлассификаторЕдиницИзмерения и при необходимости автоматически инициализирует базовые упаковки или наборы без ручного написания кода.
← На главную