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

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

Разработчики, привыкшие к гибкости Microsoft Excel, часто сталкиваются с задачей выделить отдельные слова в одной ячейке табличного документа 1С разными цветами. Типовой пример: «Продано 10 штук», где число должно быть красным, а остальной текст — черным. Однако в платформе «1С:Предприятие» свойство ЦветТекста применяется ко всему объекту ОбластьЯчеек целиком. В этой статье мы подробно разберем, как обойти это ограничение, проанализируем доступные методы и выберем оптимальный вариант в зависимости от ваших целей (печать или отображение на форме).

Причина ограничения платформы

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

Способ 1: Использование графических объектов (Надписей)

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

Рассмотрим алгоритм реализации по шагам:

  1. Оставляем целевую ячейку пустой, но задаем ей нужные размеры.
  2. Программно создаем объект типа РисунокТабличногоДокумента.
  3. Устанавливаем тип рисунка — ТипРисункаТабличногоДокумента.Текст.
  4. Для каждого слова с уникальным цветом создаем отдельный рисунок-надпись и позиционируем их друг за другом.

Посмотрим на пример кода, который иллюстрирует логику добавления такой надписи:


// Пример добавления текстового рисунка поверх ячейки
ТабДок = Новый ТабличныйДокумент;
Область = ТабДок.Область("R1C1");

// Создаем рисунок
Рисунок = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Текст);
Рисунок.Текст = "Красное слово";
Рисунок.ЦветТекста = ЦветаСтиля.ОсобыйТекст; // Красный
Рисунок.ГраницаСверху = Ложь;
Рисунок.ГраницаСлева = Ложь;
Рисунок.ГраницаСправа = Ложь;
Рисунок.ГраницаСнизу = Ложь;

// Указываем координаты (в миллиметрах или привязкой к ячейкам)
Рисунок.Расположить(Область);

Важный момент: Этот метод требует точного расчета ширины каждого слова в пикселях или миллиметрах, чтобы слова не «наезжали» друг на друга. Это трудозатратно, но позволяет добиться идеального результата при печати.

Способ 2: Измельчение сетки (Комбинированные ячейки)

Разберем более простой, «классический» метод. Если структура отчета позволяет, мы можем сильно уменьшить ширину колонок (сделать «миллиметровку») и выводить каждое слово в отдельную ячейку. Соседние ячейки будут выглядеть как одна, если убрать границы между ними.

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

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

Способ 3: Поле HTML-документа (Для экранных форм)

Если ваша задача — показать пользователю красивую таблицу в интерфейсе (а не распечатать её), то лучшим решением будет использование Поля HTML-документа. В HTML-разметке раскрашивание отдельных слов является стандартной задачей.

Выясним, как это реализовать:

  1. Добавьте на форму реквизит с типом Строка и перетащите его на форму, выбрав вид «Поле HTML-документа».
  2. Сформируйте строку в формате <table>.
  3. Внутри ячеек <td> используйте теги <span> с атрибутом style.

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


ТекстHTML = "<html><body>
|<table border='1'>
|  <tr>
|    <td>Обычный текст <span style='color:red;'>КРАСНЫЙ</span> снова обычный</td>
|  </tr>
|</table>
|</body></html>";
ЭтаФорма.РеквизитПолеHTML = ТекстHTML;

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

Способ 4: Использование FormattedDocument (Конвертация в картинку)

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

Алгоритм действий:

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

Это позволяет обойти проблему ручного расчета координат каждого слова, так как движок форматированного документа сам расставит слова правильно.

Способ 5: Постобработка в Excel через COM-объект

Если отчет в конечном итоге должен быть в формате Excel, проанализируем вариант постобработки. Вы можете сохранить стандартный табличный документ 1С в файл .xlsx, а затем открыть его через COM-соединение и применить форматирование к конкретным символам в ячейке.

Пример логики на языке 1С:


Excel = Новый COMОбъект("Excel.Application");
Книга = Excel.Workbooks.Open("C:\отчет.xlsx");
Лист = Книга.Sheets(1);
Ячейка = Лист.Cells(1, 1);
// Раскрашиваем символы с 5-го по 10-й в красный цвет (код цвета 255)
Ячейка.Characters(5, 5).Font.Color = 255;
Книга.Save();
Excel.Quit();

Важно: Данный метод требует наличия установленного Microsoft Excel на сервере или клиенте (в зависимости от места выполнения кода) и работает медленнее остальных вариантов.

Резюме

Мы выяснили, что прямой поддержки многоцветного текста в одной ячейке ТабличногоДокумента нет, но мы нашли пять рабочих инструментов для решения этой задачи. Для печати наиболее профессиональным является метод с использованием графических объектов-надписей или измельчение сетки. Для интерфейса — использование HTML-полей. Выбор метода зависит от сложности вашего макета и требований к производительности системы.

← На главную