Как программно раскрасить строки и настроить ячейки в таблице значений на управляемой форме?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Переход с обычных форм на управляемые часто вызывает вопросы у разработчиков, привыкших к событиям типа ПриВыводеСтроки или ПриПолученииДанных. В управляемом приложении работа с визуализацией данных строится на декларативном принципе. Если источником данных для таблицы на форме является ТаблицаЗначений (реквизит формы), мы не можем напрямую перехватить момент отрисовки каждой ячейки. Вместо этого мы должны заранее описать правила, по которым платформа будет оформлять таблицу. Разберем подробно, как реализовать программную раскраску, установку текста и пиктограмм.

Механизм Условного Оформления

Основным инструментом для изменения цвета фона, шрифта или текста в строках таблицы значений является Условное оформление. В управляемых формах оно доступно как через свойства формы в конфигураторе, так и программно через коллекцию УсловноеОформление. Проанализируем, как создать правило оформления в коде.

Рассмотрим пример, в котором нам нужно выделить жирным шрифтом и определенным цветом строки, где значение в колонке ТребуетОбработки равно Истина. Для этого мы напишем процедуру, которую можно вызывать, например, в событии ПриСозданииНаСервере.


Процедура УстановитьОформлениеТаблицы(Форма, ИмяТаблицы = "МояТаблица", ИмяПоляУсловия = "ТребуетОбработки") Экспорт 
    
    // 1. Создаем новый элемент условного оформления
    ЭлементУО = Форма.УсловноеОформление.Эelements.Добавить();
    
    // 2. Настраиваем само оформление (что именно меняем)
    // Установим жирный шрифт
    ТекущийШрифт = Форма.Элементы[ИмяТаблицы].Шрифт;
    ЖирныйШрифт = Новый Шрифт(ТекущийШрифт, , , Истина);
    ЭлементУО.Оформление.УстановитьЗначениеПараметра("Шрифт", ЖирныйШрифт);
    
    // Установим цвет фона
    ЭлементУО.Оформление.УстановитьЗначениеПараметра("ЦветФона", ЦветаСтиля.ОсобыйТекстКрасный);
    
    // 3. Указываем поля, которые будут оформляться
    // Если нужно раскрасить всю строку, добавляем поле с именем самой таблицы
    ОформляемоеПоле = ЭлементУО.Поля.Элементы.Добавить(); 
    ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных(ИмяТаблицы);    
    
    // 4. Формируем условие (отбор), при котором сработает оформление
    ЭлементОтбора = ЭлементУО.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ИмяТаблицы + "." + ИмяПоляУсловия);
    ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
    ЭлементОтбора.ПравоеЗначение = Истина;
    ЭлементОтбора.Использование = Истина;
    
КонецПроцедуры

Важно помнить, что если вы хотите раскрасить только конкретную колонку, в ЭлементУО.Поля нужно добавлять имя конкретного элемента формы (например, МояТаблицаСумма). Если добавить имя всей таблицы, оформится вся строка целиком.

Использование служебных колонок для сложной логики

Бывают ситуации, когда условие раскраски слишком сложное, чтобы описать его простым сравнением в ЭлементОтбора. Например, цвет строки зависит от результата сложной функции, которая анализирует данные других таблиц. В этом случае мы используем методику "технических колонок".

Разберем этот алгоритм по шагам:

  1. Добавляем в объект ТаблицаЗначений (реквизит формы) дополнительную колонку, например, ИндексЦвета (тип Число).
  2. При заполнении таблицы на сервере рассчитываем нужный цвет в коде 1С и записываем в эту колонку числовой код (0 — без цвета, 1 — красный, 2 — зеленый).
  3. Настраиваем Условное оформление так, чтобы оно реагировало на значение в колонке ИндексЦвета.

Такой подход позволяет реализовать любую логику, так как расчет происходит в обычном коде модуля, а механизм оформления лишь "подхватывает" готовый результат. Саму колонку ИндексЦвета на форме можно сделать невидимой, чтобы она не смущала пользователя.

Аналог УстановитьТекст в управляемых формах

В обычных формах мы могли программно подменить текст в ячейке через ОформлениеСтроки.Ячейки.ИмяКолонки.УстановитьТекст(). В управляемых формах для ТаблицыЗначений есть два пути:

Путь первый: Прямое изменение данных. Поскольку ТаблицаЗначений — это коллекция данных в памяти сервера, мы можем просто записать нужную строку в соответствующую ячейку таблицы. В отличие от ДинамическогоСписка, данные здесь полностью подконтрольны разработчику.

Путь второй: Условное оформление (Параметр "Текст"). У объекта Оформление есть параметр Текст. Если мы установим его значение, в ячейке будет отображаться именно этот текст, хотя в самих данных таблицы значение останется прежним. Это удобно для замены пустых значений на надписи типа "Не заполнено" или для форматирования сумм с валютой.


// Пример подмены текста через УО
ЭлементУО = Форма.УсловноеОформление.Элементы.Добавить();
ЭлементУО.Оформление.УстановитьЗначениеПараметра("Текст", "Внимание: Просрочено!");

// Поле, в котором меняем текст
ОформляемоеПоле = ЭлементУО.Поля.Элементы.Добавить();
ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("ТаблицаДолгиСрокОплаты");

// Условие: если дата оплаты меньше текущей
ЭлементОтбора = ЭлементУО.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ТаблицаДолги.СрокОплаты");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Меньше;
ЭлементОтбора.ПравоеЗначение = ТекущаяДата();

Программная установка пиктограмм (иконок)

Чтобы реализовать аналог УстановитьПиктограмму, нам потребуется выполнить настройку свойств элемента формы, отвечающего за колонку. В управляемых формах для отображения картинок в таблице используется свойство КартинкаЗначений.

Выясним, как настроить вывод иконок программно:

  1. В ТаблицеЗначений должна быть колонка (например, ИндексКартинки) типа Число. Значения в ней соответствуют номеру картинки в коллекции (0, 1, 2...).
  2. Для элемента формы (колонки) устанавливаем вид ПолеКартинки.
  3. Указываем коллекцию картинок.

Процедура НастроитьКолонкуКартинки(ЭлементТаблицы)
    
    // Находим нужный элемент (колонку)
    КолонкаСтатус = Элементы.ТаблицаДанныхСтатус;
    
    // Устанавливаем вид - Поле картинки
    КолонкаСтатус.Вид = ВидПоляФормы.ПолеКартинки;
    
    // Указываем путь к данным (индексу)
    КолонкаСтатус.ПутьКДанным = "Объект.ТаблицаДанных.ИндексКартинки";
    
    // Назначаем саму коллекцию иконок (из библиотеки картинок)
    КолонкаСтатус.КартинкаЗначений = БиблиотекаКартинок.СостоянияДокумента;
    
КонецПроцедуры

Если вам нужно, чтобы в одной ячейке был и текст, и картинка, используйте свойство ПутьКДаннымКартинки у обычного ПоляВвода. В этом случае картинка будет отображаться слева от текста. Значением в этой колонке может быть либо индекс из КартинкаЗначений, либо непосредственно объект типа Картинка.

Особенности и правила работы с оформлением

Проанализируем важные нюансы, которые помогут избежать ошибок при программном управлении внешним видом таблицы:

1. Очистка коллекции. Если вы добавляете правила условного оформления в процедурах, которые могут вызываться повторно (например, при нажатии кнопки обновления данных), обязательно очищайте коллекцию перед добавлением новых правил: ЭтаФорма.УсловноеОформление.Элементы.Очистить();. В противном случае правила будут дублироваться, что приведет к значительным тормозам формы.

2. Приоритетность. Правила в списке УсловноеОформление применяются сверху вниз. Если строка попадает под условия двух разных правил, применится то, которое находится ниже в списке (имеет больший индекс). Учитывайте это при построении сложной иерархии раскраски.

3. Производительность. Старайтесь не создавать сотни правил оформления программно. Оптимальнее создать несколько универсальных правил, завязанных на технические колонки-флаги, чем генерировать отдельное правило для каждой уникальной ситуации.

4. Область применения. Помните, что для ТаблицыЗначений условное оформление всегда задается на уровне всей формы (ЭтаФорма.УсловноеОформление). Это отличает её от ДинамическогоСписка, у которого есть собственное свойство УсловноеОформление в настройках компоновки данных.

Таким образом, комбинируя механизмы Условного оформления и программную настройку свойств элементов формы, мы получаем гибкий и мощный инструмент для визуализации данных в управляемом приложении, полностью заменяющий старые методы обычных форм.

← На главную