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