Приветствуем вас! При проектировании пользовательских интерфейсов в 1С:Предприятии часто возникает задача сделать отображение данных максимально наглядным и интерактивным. Например, выделить цветом ключевые слова, найденные поиском, или раскрасить определенные символы в артикуле номенклатуры, оставляя остальной текст стандартным черным цветом.
Если мы попытаемся решить эту задачу стандартным механизмом платформы — Условным оформлением, то быстро столкнемся с ограничением: оно умеет оформлять только ячейку целиком (шрифт, цвет фона, цвет текста). Изменить оформление лишь нескольких букв или слов внутри одной строковой ячейки с его помощью невозможно.
В этой статье мы подробно разберем, как обойти это ограничение. Мы рассмотрим классический способ, который использовали разработчики годами, а также изучим новые революционные возможности платформы 1С:Предприятие, начиная с версий 8.3.24 и 8.3.27, которые кардинально меняют подход к решению этой задачи.
Давайте проанализируем ситуацию. Стандартный элемент управляемой формы «Таблица», связанный с реквизитом типа ТаблицаЗначений или ДинамическийСписок, отображает данные в виде обычных плоских строк. Строковый тип данных в ячейке не подразумевает хранения тегов разметки или метаданных о цвете отдельных букв.
Исторически в сообщении №13 на форумах утверждалось, что «раскрасить часть строки в табличном документе также не получится». Долгое время разработчикам приходилось выкручиваться, используя сложные и не всегда производительные обходные пути. Давайте разберем по шагам все доступные на сегодняшний день варианты реализации этой задачи — от старых проверенных до ультрасовременных штатных инструментов.
Как совершенно верно подсказали участники обсуждения в сообщениях №4 и №9, наиболее гибким и кроссплатформенным решением для старых версий платформы является использование элемента формы Поле HTML-документа вместо стандартной таблицы.
Этот метод основан на том, что мы генерируем полноценную HTML-страницу со стилизованной таблицей программно. В HTML мы можем использовать стандартный тег <span> со встроенными CSS-стилями для раскраски любой части текста.
Рассмотрим пример реализации этого механизма на управляемой форме:
Строка (неограниченной длины), назовем его Адрес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.
Если раньше утверждение о невозможности раскраски текста в табличном документе было истинным, то начиная с версии платформы 8.3.24 ситуация в корне изменилась. Разработчики 1С добавили штатную поддержку объекта ФорматированнаяСтрока непосредственно внутрь ячеек ТабличногоДокумента.
Это революционное обновление позволяет отказаться от сложной верстки HTML и использовать стандартные механизмы платформы. Если вам необходимо вывести интерактивный список на форму с частичным форматированием текста, вы можете использовать элемент формы Поле табличного документа, имитируя им таблицу значений.
Давайте разберем по шагам, как программно вывести текст с частично раскрашенными буквами в ячейку табличного документа:
&НаСервере
Процедура ЗаполнитьТабличныйДокументНаФорме()
ТабДок = Элементы.ПолеТабличногоДокумента;
ТабДок.Очистить();
// Создаем области ячеек
ОбластьЯчейки = ТабДок.Область("R1C1");
// Создаем компоненты для формирования форматированной строки
ЦветВыделения = Новый Цвет(255, 0, 0); // Красный цвет
ШрифтВыделения = Новый Шрифт(,,Истина); // Жирный шрифт
// Собираем форматированную строку из частей
Часть1 = "Артикул: ";
Часть2 = Новый ФорматированнаяСтрока("ABC", ШрифтВыделения, ЦветВыделения);
Часть3 = " - базовая модель";
// Объединяем части в один объект
ИтоговаяСтрока = Новый ФорматированнаяСтрока(Часть1, Часть2, Часть3);
// Записываем результат напрямую в свойство Текст или Значение ячейки
ОбластьЯчейки.Текст = ИтоговаяСтрока;
КонецПроцедуры
Преимущества этого подхода:
Платформа 1С продолжает развивать данный функционал. В версии 8.3.27 поддержка частичной раскраски текста пришла и в Систему компоновки данных (СКД).
Теперь вы можете использовать объект ФорматированнаяСтрока непосредственно в полях схемы компоновки данных. Это решает задачу красивого вывода отчетов. Например, при формировании отчета по продажам вы можете автоматически подсвечивать красным цветом определенные символы или слова-предупреждения в наименовании номенклатуры.
Для реализации этого в СКД:
ФорматированнаяСтрока (аналогично примеру, разобранному в Решении №2).Выбор конкретного решения зависит от архитектуры вашей задачи и используемой версии технологической платформы:
Надеемся, эти методики помогут вам сделать интерфейсы ваших прикладных решений более современными, понятными и удобными для конечных пользователей!