При разработке интерфейсов на управляемых формах 1С часто возникает задача визуального акцентирования данных. Например, требуется вывести список дат или статусов через запятую и окрасить определенные значения в зависимости от условий (просроченные даты — в красный, актуальные — в зеленый, системные пояснения — в серый). Рассмотрим, почему для этого не подходят стандартные механизмы условного оформления и как правильно решить задачу с помощью встроенных возможностей платформы.
Проанализируем базовое поведение платформы: стандартный механизм «Условное оформление» формы или динамического списка работает на уровне целых строк или отдельных ячеек (полей) целиком. Покрасить только часть текстовой строки внутри одной ячейки или поля ввода с помощью условного оформления невозможно. Для фрагментарного форматирования текста в платформе 1С предусмотрен специальный объект — ФорматированнаяСтрока.
Разберем принцип работы объекта ФорматированнаяСтрока. Он представляет собой составную строку, фрагменты которой могут иметь индивидуальные параметры отображения: собственный цвет текста, шрифт и даже гиперссылку. Создается такой объект через конструктор, куда передается массив компонентов.
Посмотрим на правила формирования массива фрагментов:
Цвет (например, WebЦвета.Красный) или объект Шрифт, то эти свойства применяются ко всем последующим строковым элементам до тех пор, пока в массив не будет добавлен другой цвет/шрифт или пока оформление не завершится.ЦветаСтиля.ТекстПоля или цвет по умолчанию.Рассмотрим практический пример, в котором перебирается список дат и формируется разноцветная надпись через запятую:
&НаКлиенте
Процедура СформироватьСписокДат()
МассивФрагментов = Новый Массив;
// Определим используемые цвета
ЦветОбычный = WebЦвета.Черный;
ЦветПросрочено = WebЦвета.Красный;
ЦветБудущее = WebЦвета.Зеленый;
ДатаТекущая = НачалоДня(ТекущаяДата());
// Для примера сформируем массив дат
СписокДат = Новый Массив;
СписокДат.Добавить(ДатаТекущая - 86400 * 2); // Просроченная
СписокДат.Добавить(ДатаТекущая); // Сегодня
СписокДат.Добавить(ДатаТекущая + 86400 * 3); // Будущая
ВсегоЭлементов = СписокДат.Количество();
Для Индекс = 0 По ВсегоЭлементов - 1 Цикл
ТекущаяДатаСписка = СписокДат[Индекс];
// Определяем цвет по условию
Если ТекущаяДатаСписка < ДатаТекущая Тогда
МассивФрагментов.Добавить(ЦветПросрочено);
ИначеЕсли ТекущаяДатаСписка > ДатаТекущая Тогда
МассивФрагментов.Добавить(ЦветБудущее);
Иначе
МассивФрагментов.Добавить(ЦветОбычный);
КонецЕсли;
// Добавляем строковое представление даты
МассивФрагментов.Добавить(Формат(ТекущаяДатаСписка, "ДФ=dd.MM.yyyy"));
// Добавляем разделитель стандартным цветом, если это не последний элемент
Если Индекс < ВсегоЭлементов - 1 Тогда
МассивФрагментов.Добавить(ЦветОбычный);
МассивФрагментов.Добавить(", ");
КонецЕсли;
КонецЦикла;
// Создаем объект форматированной строки
ФорматированныйРезультат = Новый ФорматированнаяСтрока(МассивФрагментов);
// Способ 1: Вывод в элемент формы Декорация с видом "Надпись"
Элементы.ДекорацияДаты.Заголовок = ФорматированныйРезультат;
КонецПроцедуры
Выясним, какие элементы управляемой формы умеют корректно отображать объект ФорматированнаяСтрока:
ДекорацияНадпись): наиболее частый вариант для вывода статических или информационных блоков. В коде достаточно присвоить сформированный объект напрямую свойству Заголовок элемента формы.ФорматированнаяСтрока, а на форму добавляется элемент с видом «Поле надписи», связанный с этим реквизитом через путь к данным.ТаблицаЗначений, колонка таблицы может иметь составной тип или напрямую тип ФорматированнаяСтрока. Это позволяет раскрашивать фрагменты текста внутри строк на клиенте.Проанализируем важные ограничения, с которыми можно столкнуться при реализации подобных задач:
ПолеВвода не поддерживает форматирование отдельных символов или слов. Нельзя позволить пользователю произвольно печатать текст и одновременно программно подсвечивать отдельные слова. ФорматированнаяСтрока работает исключительно в режиме только для чтения.ФорматированнаяСтрока. Условное оформление динамического списка применяется только к ячейке или всей строке целиком, поэтому для таблиц документов и справочников поколоночная раскраска отдельных слов внутри одной ячейки стандартными средствами не поддерживается.Если возможностей объекта ФорматированнаяСтрока недостаточно, разберем альтернативные подходы:
1. Поле HTML документа
На форму добавляется реквизит строкового типа, а связанный элемент переводится в вид ПолеHTMLДокумента. Внутрь помещается обычный HTML-код, где нужные даты оборачиваются в теги span со стилями цвета, фона или скруглений под теги-бейджы (чипы). Это решение обеспечивает максимальную гибкость верстки и позволяет перехватывать нажатия на отдельные элементы через событие навигации.
2. Поле форматированного документа
Используется объект ФорматированныйДокумент. Этот вариант оправдан только в том случае, если пользователю требуется предоставить полноценный встроенный редактор с возможностью интерактивного набора и форматирования фрагментов текста.
3. Динамическая генерация кнопок-гиперссылок
Вместо склеивания текста через запятую можно разместить на форме обычную группу без рамок с группировкой «В контейнере» или горизонтальной с переносом. В эту группу программно создаются элементы с видом «Кнопка» (отображение «Гиперссылка») или надписи. Каждая дата получает свой цвет, подсказку и персональный обработчик клика.