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