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