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