При программной загрузке номенклатуры из внешних источников (например, из файлов Excel) часто требуется создать не только саму позицию номенклатуры и ее базовую единицу хранения, но и сопутствующие единицы измерения — упаковки. Нередко разработчики сталкиваются с ситуацией: элемент номенклатуры записан, подчиненный элемент справочника упаковок создан, владелец указан, однако при переходе в список упаковок карточки номенклатуры список оказывается пустым, либо созданные элементы выглядят как некорректные записи классификатора.
Разберем детально, как устроена подсистема упаковок и единиц измерения в конфигурации «1С:Управление торговлей 11» (а также в «1С:ERP» и «1С:Комплексная автоматизация»), почему упаковки могут не отображаться в интерфейсе и как выглядит рабочий программный код для их корректного создания.
В современных типовых конфигурациях классификатор единиц измерения (ОКЕИ) и упаковки товаров объединены в одном справочнике — Справочники.УпаковкиЕдиницыИзмерения. При этом их поведение кардинально различается в зависимости от ключевых реквизитов:
Владелец пустой), а реквизит ТипИзмеряемойВеличины принимает значения вида Перечисления.ТипыИзмеряемыхВеличин.КоличествоШтук, Вес, Объем, Длина и т.д. Именно эти элементы выбираются в карточке номенклатуры в качестве единицы хранения.Владелец должен содержать ссылку на элемент справочника Номенклатура, а реквизит ТипИзмеряемойВеличины обязательно должен принимать значение Перечисления.ТипыИзмеряемыхВеличин.Упаковка.НаборыУпаковок (реквизит Владелец содержит ссылку на набор). Такой подход используется для типизированных упаковок (например, стандартная коробка на 10 штук для целой группы товаров).Смешивать эти понятия нельзя: упаковка не может выступать в качестве базовой единицы хранения (или единицы для отчетов без указания коэффициента), а базовая единица ОКЕИ не отобразится в списке упаковок товара.
Проанализируем основные причины, из-за которых динамический список упаковок в карточке номенклатуры остается пустым:
ТипИзмеряемойВеличины: если разработчик оставляет этот реквизит пустым или копирует значение из базовой единицы (например, КоличествоШтук), форма списка упаковок отфильтровывает такие записи, так как в отборе формы жестко прописано условие на тип измеряемой величины Упаковка.НаборУпаковок в номенклатуре: для использования индивидуальных упаковок недостаточно взвести флаг ИспользоватьУпаковки = Истина. Требуется явно указать предопределенное значение: Номенклатура.НаборУпаковок = Справочники.НаборыУпаковок.ИндивидуальныйДляНоменклатуры;. Без этого типовые механизмы формы не смогут связать контекст владельца.Ссылка.ЕдиницаИзмерения самой упаковки. Поиск единицы ОКЕИ безопаснее выполнять по коду классификатора (например, «796» для шт.).Рассмотрим правильную последовательность действий при программном формировании номенклатуры и ее индивидуальных упаковок.
Шаг 1. Подготовка и запись номенклатуры. Перед добавлением упаковок инициализируем реквизиты номенклатуры, включаем флаг использования упаковок, устанавливаем предопределенный индивидуальный набор и записываем элемент:
// Создаем или получаем объект номенклатуры
НоменклатураОбъект = Справочники.Номенклатура.СоздатьЭлемент();
НоменклатураОбъект.Наименование = "Товар тестовый";
НоменклатураОбъект.НаименованиеПолное = "Товар тестовый";
// Находим базовую единицу хранения по коду ОКЕИ (796 - штука)
БазоваяЕдиница = Справочники.УпаковкиЕдиницыИзмерения.НайтиПоРеквизиту("Код", "796");
НоменклатураОбъект.ЕдиницаИзмерения = БазоваяЕдиница;
// Включаем использование упаковок и привязываем индивидуальный набор
НоменклатураОбъект.ИспользоватьУпаковки = Истина;
НоменклатураОбъект.НаборУпаковок = Справочники.НаборыУпаковок.ИндивидуальныйДляНоменклатуры;
НоменклатураОбъект.Записать();
Шаг 2. Создание элемента упаковки. Заполняем реквизиты подчиненного элемента справочника УпаковкиЕдиницыИзмерения, обязательно задавая коэффициент пересчета, вес и признак типа измеряемой величины:
УпаковкаОбъект = Справочники.УпаковкиЕдиницыИзмерения.СоздатьЭлемент();
УпаковкаОбъект.Владелец = НоменклатураОбъект.Ссылка;
УпаковкаОбъект.Наименование = "Коробка (10 шт.)";
УпаковкаОбъект.ЕдиницаИзмерения = БазоваяЕдиница; // Единица, в которой исчисляется вложение
УпаковкаОбъект.ТипИзмеряемойВеличины = Перечисления.ТипыИзмеряемыхВеличин.Упаковка;
// Коэффициенты пересчета
УпаковкаОбъект.КоличествоУпаковок = 1;
УпаковкаОбъект.Числитель = 10;
УпаковкаОбъект.Знаменатель = 1;
// Весогабаритные характеристики (при необходимости)
УпаковкаОбъект.Вес = 2.5;
УпаковкаОбъект.Безразмерная = Истина; // Если линейные размеры не задаются
УпаковкаОбъект.Записать();
Шаг 3. Заполнение единицы для отчетов в номенклатуре. Если созданная упаковка или отдельная единица должна выступать единицей для отчетов, возвращаемся к номенклатуре и заполняем соответствующие реквизиты:
НоменклатураОбъект = НоменклатураОбъект.Ссылка.ПолучитьОбъект();
НоменклатураОбъект.ЕдиницаДляОтчетов = УпаковкаОбъект.Ссылка;
НоменклатураОбъект.КоэффициентЕдиницыДляОтчетов = УпаковкаОбъект.Числитель / УпаковкаОбъект.Знаменатель;
НоменклатураОбъект.Записать();
Если в вашей учетной системе множество товаров имеет одинаковые варианты фасовки (например, упаковки по 6, 12, 24 штуки), не рекомендуется создавать индивидуальные упаковки под каждую позицию. Это приводит к быстрому разрастанию справочника и затрудняет администрирование базы.
Вместо этого целесообразно создавать общие элементы в справочнике НаборыУпаковок, привязывать упаковки к этому набору (где Владелец — ссылка на набор упаковок), а в карточках товаров в реквизите НаборУпаковок указывать общий шаблон. Такой подход упрощает групповое изменение коэффициентов и ускоряет работу складской подсистемы.