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