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