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

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

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

Разберем основные подходы к решению этой задачи в конфигурации 1С:Конвертация данных 2.1 (КД 2).

Причина сложности переноса

Проанализируем структуру метаданных обеих конфигураций:

  1. В базе-источнике (УТ) единица измерения либо берется из базовой единицы номенклатуры (СправочникСсылка.КлассификаторЕдиницИзмерения), либо задается через реквизит Упаковка (СправочникСсылка.УпаковкиЕдиницыИзмерения).
  2. В базе-приемнике (БУХ) реквизит табличной части ЕдиницаИзмерения ссылается на подчиненный справочник СправочникСсылка.ЕдиницыИзмерения, для каждого элемента которого обязательным является реквизит Владелец (ссылка на номенклатуру).

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

Способ 1. Выгрузка через структуру в обработчике ПКС (рекомендуемый)

Рассмотрим стандартный механизм передачи подчиненных справочников через формирование структуры входящих данных в обработчике ПередВыгрузкой свойства табличной части.

Разберем порядок настройки по шагам:

  1. Создадим правило конвертации объекта (ПКО) ЕдиницыИзмерения. В настройках поиска установим флажки по полям Владелец и ЕдиницаПоКлассификатору (или Наименование). В свойствах правила обязательно активируем поиск с учетом владельца.
  2. В ПКО документа РеализацияТоваровИУслуг для табличной части Товары настроим правило конвертации свойства (ПКС) для приемника ЕдиницаИзмерения. Источник можно оставить пустым.
  3. Укажем созданное ПКО ЕдиницыИзмерения в качестве правила для этого свойства.
  4. В обработчике ПередВыгрузкой данного ПКС сформируем структуру с полями, необходимыми для поиска и создания подчиненного элемента в приемнике:

Значение = Новый Структура;
Значение.Вставить("Владелец", ОбъектКоллекции.Номенклатура);
Значение.Вставить("Коэффициент", 1);

Если ЗначениеЗаполнено(ОбъектКоллекции.Упаковка) Тогда
    Значение.Вставить("ЕдиницаПоКлассификатору", ОбъектКоллекции.Упаковка.ЕдиницаИзмерения);
    Значение.Вставить("Наименование", СокрЛП(ОбъектКоллекции.Упаковка.ЕдиницаИзмерения.Наименование));
Иначе
    Значение.Вставить("ЕдиницаПоКлассификатору", ОбъектКоллекции.Номенклатура.ЕдиницаИзмерения);
    Значение.Вставить("Наименование", СокрЛП(ОбъектКоллекции.Номенклатура.ЕдиницаИзмерения.Наименование));
КонецЕсли;

Обратите внимание: если в докуторе источника использовалась упаковка с коэффициентом, отличным от 1, необходимо также в обработчиках табличной части пересчитать реквизиты Количество и Цена, умножив или разделив их на коэффициент упаковки, чтобы не нарушить стоимостные и количественные итоги в бухгалтерском учете.

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

Если учет упаковок не требуется и в бухгалтерскую базу всегда должна попадать базовая единица измерения номенклатуры, можно упростить выгрузку значения в обработчике ПКС:

Значение = ОбъектКоллекции.Номенклатура.ЕдиницаИзмерения;

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

Способ 3. Дозаполнение единиц измерения в обработчике ПослеЗагрузки документа

Если требуется избежать настройки дополнительных ПКО для подчиненных справочников, заполнение реквизитов табличной части можно полностью перенести на сторону базы-приемника.

Для этого в ПКО документа РеализацияТоваровИУслуг в обработчике ПослеЗагрузки пропишем программный обход строк документа и подстановку единиц измерения из загруженной номенклатуры:


Для Каждого Стр Из Объект.Товары Цикл
    Если ЗначениеЗаполнено(Стр.Номенклатура) Тогда
        // Назначаем базовую единицу или единицу хранения остатков номенклатуры
        Стр.ЕдиницаИзмерения = Стр.Номенклатура.БазоваяЕдиницаИзмерения;
        
        // В зависимости от конфигурации может потребоваться поиск подчиненного элемента
        Если Не ЗначениеЗаполнено(Стр.ЕдиницаИзмерения) Тогда
            Стр.ЕдиницаИзмерения = Справочники.ЕдиницыИзмерения.НайтиПоРеквизиту("Владелец", Стр.Номенклатура);
        КонецЕсли;
    КонецЕсли;
КонецЦикла;

// Вызываем типовые процедуры пересчета и заполнения счетов учета
Объект.ЗаполнитьСчетаУчетаВТабличнойЧасти(Объект.Товары, "Товары");

Посмотрим на преимущества данного подхода: он не перегружает файл обмена промежуточными данными подчиненных справочников и гарантирует корректную привязку реквизитов по правилам базы-приемника.

← На главную