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