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

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

Приветствуем вас! При проектировании пользовательских интерфейсов в 1С:Предприятии часто возникает задача сделать отображение данных максимально наглядным и интерактивным. Например, выделить цветом ключевые слова, найденные поиском, или раскрасить определенные символы в артикуле номенклатуры, оставляя остальной текст стандартным черным цветом.

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

В этой статье мы подробно разберем, как обойти это ограничение. Мы рассмотрим классический способ, который использовали разработчики годами, а также изучим новые революционные возможности платформы 1С:Предприятие, начиная с версий 8.3.24 и 8.3.27, которые кардинально меняют подход к решению этой задачи.

Суть проблемы и почему стандартная ТаблицаЗначений бессильна

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

Исторически в сообщении №13 на форумах утверждалось, что «раскрасить часть строки в табличном документе также не получится». Долгое время разработчикам приходилось выкручиваться, используя сложные и не всегда производительные обходные пути. Давайте разберем по шагам все доступные на сегодняшний день варианты реализации этой задачи — от старых проверенных до ультрасовременных штатных инструментов.

Решение №1: Использование Поля HTML-документа (универсальный классический метод)

Как совершенно верно подсказали участники обсуждения в сообщениях №4 и №9, наиболее гибким и кроссплатформенным решением для старых версий платформы является использование элемента формы Поле HTML-документа вместо стандартной таблицы.

Этот метод основан на том, что мы генерируем полноценную HTML-страницу со стилизованной таблицей программно. В HTML мы можем использовать стандартный тег <span> со встроенными CSS-стилями для раскраски любой части текста.

Рассмотрим пример реализации этого механизма на управляемой форме:

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

Посмотрим на пример кода во встроенном языке 1С:


&НаСервере
Функция СформироватьHTMLТаблицу(ТаблицаДанных, ИскомаяПодстрока) Экспорт
    
    HTMLКод = "<html><head><style>
    |body { font-family: Arial, sans-serif; font-size: 14px; }
    |table { border-collapse: collapse; width: 100%; }
    |th, td { border: 1px solid #ccc; padding: 8px; text-align: left; }
    |th { background-color: #f2f2f2; }
    |.highlight { color: red; font-weight: bold; }
    |</style></head><body>";
    
    HTMLКод = HTMLКод + "<table><tr><th>Код</th><th>Наименование</th></tr>";
    
    Для Каждого СтрокаДанных Из ТаблицаДанных Цикл
        
        ИсходныйТекст = СтрокаДанных.Наименование;
        ПодсвеченныйТекст = ИсходныйТекст;
        
        Если ЗначениеЗаполнено(ИскомаяПодстрока) Тогда
            // Заменяем искомую подстроку на обертку со специальным CSS-классом
            ЗаменяемыйТекст = "<span class='highlight'>" + ИскомаяПодстрока + "</span>";
            ПодсвеченныйТекст = СтрЗаменить(ИсходныйТекст, ИскомаяПодстрока, ЗаменяемыйТекст);
        КонецЕсли;
        
        HTMLКод = HTMLКод + "<tr>";
        HTMLКод = HTMLКод + "<td>" + СтрокаДанных.Код + "</td>";
        HTMLКод = HTMLКод + "<td>" + ПодсвеченныйТекст + "</td>";
        HTMLКод = HTMLКод + "<tr>";
        
    КонецЦикла;
    
    HTMLКод = HTMLКод + "</table></body></html>";
    
    Возврат HTMLКод;
    
КонецФункции

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

Решение №2: Использование Поля табличного документа и объекта ФорматированнаяСтрока (Платформа 8.3.24+)

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

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

Давайте разберем по шагам, как программно вывести текст с частично раскрашенными буквами в ячейку табличного документа:


&НаСервере
Процедура ЗаполнитьТабличныйДокументНаФорме()
    
    ТабДок = Элементы.ПолеТабличногоДокумента;
    ТабДок.Очистить();
    
    // Создаем области ячеек
    ОбластьЯчейки = ТабДок.Область("R1C1");
    
    // Создаем компоненты для формирования форматированной строки
    ЦветВыделения = Новый Цвет(255, 0, 0); // Красный цвет
    ШрифтВыделения = Новый Шрифт(,,Истина); // Жирный шрифт
    
    // Собираем форматированную строку из частей
    Часть1 = "Артикул: ";
    Часть2 = Новый ФорматированнаяСтрока("ABC", ШрифтВыделения, ЦветВыделения);
    Часть3 = " - базовая модель";
    
    // Объединяем части в один объект
    ИтоговаяСтрока = Новый ФорматированнаяСтрока(Часть1, Часть2, Часть3);
    
    // Записываем результат напрямую в свойство Текст или Значение ячейки
    ОбластьЯчейки.Текст = ИтоговаяСтрока;
    
КонецПроцедуры

Преимущества этого подхода:

Решение №3: Форматированная строка в Системе компоновки данных (СКД) (Платформа 8.3.27+)

Платформа 1С продолжает развивать данный функционал. В версии 8.3.27 поддержка частичной раскраски текста пришла и в Систему компоновки данных (СКД).

Теперь вы можете использовать объект ФорматированнаяСтрока непосредственно в полях схемы компоновки данных. Это решает задачу красивого вывода отчетов. Например, при формировании отчета по продажам вы можете автоматически подсвечивать красным цветом определенные символы или слова-предупреждения в наименовании номенклатуры.

Для реализации этого в СКД:

  1. В схеме компоновки данных создается вычисляемое поле.
  2. В выражении этого поля вызывается функция общего модуля, которая формирует и возвращает объект ФорматированнаяСтрока (аналогично примеру, разобранному в Решении №2).
  3. При выводе отчета компоновщик автоматически распознает этот тип данных и отрисует ячейку с разноцветным текстом.

Резюме и рекомендации

Выбор конкретного решения зависит от архитектуры вашей задачи и используемой версии технологической платформы:

Надеемся, эти методики помогут вам сделать интерфейсы ваших прикладных решений более современными, понятными и удобными для конечных пользователей!

← На главную