Как выделить цветом часть текста или надписи на форме 1С?

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

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

Проанализируем базовое поведение платформы: стандартный механизм «Условное оформление» формы или динамического списка работает на уровне целых строк или отдельных ячеек (полей) целиком. Покрасить только часть текстовой строки внутри одной ячейки или поля ввода с помощью условного оформления невозможно. Для фрагментарного форматирования текста в платформе 1С предусмотрен специальный объект — ФорматированнаяСтрока.

Основное решение: использование объекта ФорматированнаяСтрока

Разберем принцип работы объекта ФорматированнаяСтрока. Он представляет собой составную строку, фрагменты которой могут иметь индивидуальные параметры отображения: собственный цвет текста, шрифт и даже гиперссылку. Создается такой объект через конструктор, куда передается массив компонентов.

Посмотрим на правила формирования массива фрагментов:

  1. Элементы добавляются в массив последовательно в том порядке, в котором они должны отображаться.
  2. Если в массив помещается объект типа Цвет (например, WebЦвета.Красный) или объект Шрифт, то эти свойства применяются ко всем последующим строковым элементам до тех пор, пока в массив не будет добавлен другой цвет/шрифт или пока оформление не завершится.
  3. Для сброса цвета к системному значению можно передать ЦветаСтиля.ТекстПоля или цвет по умолчанию.

Рассмотрим практический пример, в котором перебирается список дат и формируется разноцветная надпись через запятую:


&НаКлиенте
Процедура СформироватьСписокДат()

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

КонецПроцедуры

Элементы формы для отображения форматированной строки

Выясним, какие элементы управляемой формы умеют корректно отображать объект ФорматированнаяСтрока:

  1. Декорация с видом «Надпись» (ДекорацияНадпись): наиболее частый вариант для вывода статических или информационных блоков. В коде достаточно присвоить сформированный объект напрямую свойству Заголовок элемента формы.
  2. Поле надписи: создается реквизит формы с типом ФорматированнаяСтрока, а на форму добавляется элемент с видом «Поле надписи», связанный с этим реквизитом через путь к данным.
  3. Колонка таблицы формы: если на форме используется таблица, созданная на основе объекта ТаблицаЗначений, колонка таблицы может иметь составной тип или напрямую тип ФорматированнаяСтрока. Это позволяет раскрашивать фрагменты текста внутри строк на клиенте.

Технические ограничения платформы

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

  1. Поле ввода (редактируемый текст): стандартное ПолеВвода не поддерживает форматирование отдельных символов или слов. Нельзя позволить пользователю произвольно печатать текст и одновременно программно подсвечивать отдельные слова. ФорматированнаяСтрока работает исключительно в режиме только для чтения.
  2. Динамические списки: в запросе динамического списка невозможно собрать объект ФорматированнаяСтрока. Условное оформление динамического списка применяется только к ячейке или всей строке целиком, поэтому для таблиц документов и справочников поколоночная раскраска отдельных слов внутри одной ячейки стандартными средствами не поддерживается.

Альтернативные варианты реализации

Если возможностей объекта ФорматированнаяСтрока недостаточно, разберем альтернативные подходы:

1. Поле HTML документа
На форму добавляется реквизит строкового типа, а связанный элемент переводится в вид ПолеHTMLДокумента. Внутрь помещается обычный HTML-код, где нужные даты оборачиваются в теги span со стилями цвета, фона или скруглений под теги-бейджы (чипы). Это решение обеспечивает максимальную гибкость верстки и позволяет перехватывать нажатия на отдельные элементы через событие навигации.

2. Поле форматированного документа
Используется объект ФорматированныйДокумент. Этот вариант оправдан только в том случае, если пользователю требуется предоставить полноценный встроенный редактор с возможностью интерактивного набора и форматирования фрагментов текста.

3. Динамическая генерация кнопок-гиперссылок
Вместо склеивания текста через запятую можно разместить на форме обычную группу без рамок с группировкой «В контейнере» или горизонтальной с переносом. В эту группу программно создаются элементы с видом «Кнопка» (отображение «Гиперссылка») или надписи. Каждая дата получает свой цвет, подсказку и персональный обработчик клика.

← На главную