Как правильно реализовать выбор единиц измерения и упаковок в документах 1С:ERP?

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

При разработке собственных документов в конфигурациях на базе 1С:ERP (таких как УТ 11 или КА 2) программисты часто сталкиваются с задачей реализации выбора единиц измерения. Типовой механизм предполагает, что в одной колонке пользователь может видеть либо базовую единицу измерения номенклатуры, либо выбранную упаковку. Однако при попытке повторить это "с нуля" часто возникает ошибка: в строке отображаются оба значения через запятую, что загромождает интерфейс и выглядит некорректно. В этой статье мы разберем, как устроен этот механизм "под капотом" и как правильно настроить форму документа.

Разбор визуальной концепции выбора единиц

В типовых решениях 1С:ERP визуализация единиц измерения реализована через объединение двух полей в одну группу. Основная логика заключается в следующем: пользователю должно казаться, что он работает с одним полем, которое динамически меняет свое содержимое. Если для товара выбрана конкретная упаковка, должна отображаться она. Если же упаковка не используется (товар учитывается в базовых единицах), должно отображаться текстовое представление единицы измерения из карточки номенклатуры.

Для начала проанализируем структуру группы полей в табличной части. Чтобы механизм заработал, нам необходимо создать группу полей, например, с именем ТоварыУпаковкаЕдиницаИзмерения. В эту группу мы помещаем два элемента:

  1. Поле для выбора упаковки (путь к данным: Объект.Товары.Упаковка).
  2. Поле для отображения базовой единицы (путь к данным: Объект.Товары.Номенклатура.ЕдиницаИзмерения).

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

Программная настройка условного оформления

Как выяснилось в ходе обсуждения, в ERP существует специальная серверная процедура, которая берет на себя всю рутину по настройке видимости этих полей. Для того чтобы "магия" заработала, в модуле формы документа, в обработчике ПриСозданииНаСервере, необходимо вызвать следующую функцию:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Инициализация условного оформления для единиц измерения
    НоменклатураСервер.УстановитьУсловноеОформлениеЕдиницИзмерения(ЭтаФорма);
    
КонецПроцедуры

Рассмотрим подробнее, что именно делает процедура НоменклатураСервер.УстановитьУсловноеОформлениеЕдиницИзмерения(ЭтаФорма). Она динамически добавляет в коллекцию УсловноеОформление формы два ключевых правила:

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

Настройка группы полей в конфигураторе

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

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

Связь с логикой пересчета количества и цен

Просто скрыть или показать поле — это только половина задачи. В ERP выбор упаковки неразрывно связан с математическим пересчетом. Выясним причину, по которой это важно: каждая упаковка имеет свой коэффициент (например, коробка = 10 штук). В табличной части документа обычно присутствуют два реквизита: Количество (в базовых единицах) и КоличествоУпаковок (в выбранных упаковках).

Проанализируем ситуацию: когда пользователь меняет упаковку, система должна автоматически пересчитать КоличествоУпаковок. Для этого в обработчике события ПриИзменении поля Упаковка следует вызывать типовые процедуры из общих модулей. Примерная схема кода в модуле формы:


&НаКлиенте
Процедура ТоварыУпаковкаПриИзменении(Элемент)
    
    ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
    
    // Вызов логики пересчета коэффициентов
    СтруктураПересчета = Новый Структура;
    СтруктураПересчета.Вставить("Номенклатура", ТекущаяСтрока.Номенклатура);
    СтруктураПересчета.Вставить("Упаковка",    ТекущаяСтрока.Упаковка);
    
    // Типовой механизм определит новый коэффициент и обновит зависимые поля
    РассчитатьКоличествоУпаковокНаСервере(ТекущаяСтрока);
    
КонецПроцедуры

Также не забывайте про настройку использования упаковок в самой номенклатуре. Если в карточке товара использование упаковок отключено, поле выбора на форме должно становиться недоступным. Это также регулируется через условное оформление или программно при смене номенклатуры в строке.

Рекомендации по поиску примеров

Если вы создаете сложный документ и хотите, чтобы он вел себя в точности как типовой, мы рекомендуем детально изучить формы следующих объектов:

При анализе типовых форм обязательно заглядывайте в коллекцию УсловноеОформление через отладчик. Часто настройки, которые вы ищете в конфигураторе, создаются программно в общих модулях при инициализации формы. Понимание работы метода НоменклатураСервер.УстановитьУсловноеОформлениеЕдиницИзмерения позволит вам избежать написания лишнего кода и сделать ваш документ максимально совместимым с логикой 1С:ERP.

← На главную