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