При переходе на современные конфигурации на платформе «1С:Предприятие 8.3», такие как «1С:Комплексная автоматизация 2», «1С:ERP Управление предприятием» или «1С:Управление торговлей 11», разработчики и аналитики часто сталкиваются с неочевидным поведением системы при работе с единицами измерения и упаковками. Типичный сценарий: в табличной части документа (например, в «Заказе клиента» или «Реализации товаров и услуг») визуально в колонке «Упаковка» отображается «шт» (или другая базовая единица), но при анализе этой таблицы через консоль запросов или программно реквизит Упаковка возвращает пустую ссылку.
В этой статье мы подробно разберем техническую архитектуру работы с упаковками, выясним причины такого поведения системы, рассмотрим устройство справочника УпаковкиЕдиницыИзмерения и научимся правильно извлекать данные в запросах для отчетов и печатных форм.
Проанализируем ситуацию, с которой сталкивается программист при исследовании базы данных. Открыв консоль запросов и обратившись к табличной части Товары любого торгового документа, мы видим, что поле Упаковка для многих строк содержит пустую ссылку типа СправочникСсылка.УпаковкиЕдиницыИзмерения. При этом, глядя на форму того же самого документа в режиме «1С:Предприятие», мы отчетливо видим в соответствующей колонке надпись «шт» (штуки), «кг» (килограммы) или «полный набор».
Такое поведение не является ошибкой или программным сбоем. Это **штатный механизм оптимизации хранения данных**, заложенный разработчиками фирмы «1С». Логика системы строится на следующих правилах:
Упаковка.Упаковка в базе данных заполняется реальным значением только тогда, когда товар действительно отгружается или принимается в упаковках (коробках, паллетах, пачках), отличных от базовой единицы хранения. В этом случае в реквизит записывается ссылка на конкретную упаковку, у которой определен коэффициент пересчета (например, коробка = 10 шт.).Выясним, каким образом на форме документа пользователю выводится базовая единица измерения, если в самой базе данных реквизит пуст. Многие разработчики ошибочно полагают, что здесь задействовано тяжелое программное условное оформление или динамический пересчет строк при выводе. На самом деле всё гораздо проще и элегантнее.
Разберем по шагам, как устроена колонка «Упаковка» на управляемой форме документа (например, в форме документа ЗаказКлиента):
Объект.Товары.Упаковка (путь к данным реквизита ТЧ).Объект.Товары.Номенклатура.ЕдиницаИзмерения.Упаковка пустое, система автоматически скрывает пустоту и выводит значение из альтернативного поля — базовую единицу измерения номенклатуры. Если же упаковка выбрана (например, «Коробка»), то отображается именно представление этой упаковки.Таким образом, пользователь видит целостную и понятную картину («шт», «кг» или «Коробка (10 шт)») в одной и той же колонке, а база данных при этом остается ненагруженной лишними дублирующими связями.
В старых решениях 1С (например, в «Управление производственным предприятием 1.3» или «Управление торговлей 10.3») существовали раздельные справочники для классификатора единиц измерения и для упаковок (мест) номенклатуры. В современных прикладных решениях на базе ERP-платформы структура метаданных подверглась глубокой унификации.
Справочника «Единицы измерения» в чистом виде больше нет. Вместо него функционирует единый справочник УпаковкиЕдиницыИзмерения. Он имеет сложную иерархическую структуру и систему подчинения (владельцев):
КлассификаторЕдиницИзмерения (ОКЕИ). Однако в карточке номенклатуры реквизит ЕдиницаИзмерения теперь ссылается на справочник УпаковкиЕдиницыИзмерения, где элемент выступает «оберткой» над записью классификатора ОКЕИ.УпаковкиЕдиницыИзмерения выступает справочник НаборыУпаковок (например, шаблон «Обувная коробка и паллета»).УпаковкиЕдиницыИзмерения будет являться непосредственно элемент справочника Номенклатура.Поскольку реквизит Упаковка в табличной части товаров часто бывает пустым, прямая выборка этого поля в запросе для вывода в печатную форму или отчет приведет к тому, что вместо «шт» или «кг» пользователь увидит пустые поля. Чтобы избежать этой популярной ошибки, в запросах необходимо использовать условную конструкцию ВЫБОР.
Рассмотрим подробнее шаблон построения такого запроса:
ВЫБРАТЬ
ЗаказТовары.НомерСтроки КАК НомерСтроки,
ЗаказТовары.Номенклатура КАК Номенклатура,
ЗаказТовары.Количество КАК Количество,
ВЫБОР
КОГДА ЗаказТовары.Упаковка = ЗНАЧЕНИЕ(Справочник.УпаковкиЕдиницыИзмерения.ПустаяСсылка)
ТОГДА ЗаказТовары.Номенклатура.ЕдиницаИзмерения
ИНАЧЕ ЗаказТовары.Упаковка
КОНЕЦ КАК ЕдиницаИзмеренияУпаковка,
ВЫБОР
КОГДА ЗаказТовары.Упаковка = ЗНАЧЕНИЕ(Справочник.УпаковкиЕдиницыИзмерения.PushСсылка)
ТОГДА ЗаказТовары.Номенклатура.ЕдиницаИзмерения.Наименование
ИНАЧЕ ЗаказТовары.Упаковка.Наименование
КОНЕЦ КАК ЕдиницаИзмеренияПредставление
ИЗ
Документ.ЗаказКлиента.Товары КАК ЗаказТовары
ГДЕ
ЗаказТовары.Ссылка = &Ссылка
Проанализируем этот запрос. В поле ЕдиницаИзмеренияУпаковка мы получаем готовую ссылку: либо на базовую единицу измерения номенклатуры (если упаковка не была указана), либо на конкретный элемент упаковки. В поле ЕдиницаИзмеренияПредставление мы сразу извлекаем текстовое наименование для вывода на печать. Это гарантирует, что печатная форма всегда будет заполнена корректными данными. Для автоматического вывода весогабаритных характеристик упаковок в документы и контроля кратности подойдёт расширение для расчета веса, объема и вывода данных в печатные формы.
Иногда администраторы и аналитики замечают, что после перехода на «1С:Комплексную автоматизацию» в рабочей базе абсолютно во всех документах поле Упаковка в СУБД остается пустым, хотя в интерфейсе везде горит «шт». Выясним возможные причины этой ситуации:
ИспользоватьУпаковки = Истина или некорректно заполнить владельцев в справочнике УпаковкиЕдиницыИзмерения. В результате данные в системе есть, но логика документов их «не видит».Понимание этой архитектурной особенности хранения упаковок и единиц измерения в 1С v8.3 позволяет разработчикам писать более оптимизированные запросы, избегать ошибок при создании печатных форм и оперативно локализовать проблемы интеграции при переносе данных из других информационных систем. При необходимости быстро настроить учет по упаковкам после переноса данных можно воспользоваться обработкой для массового создания индивидуальных упаковок.