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

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

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

В этой статье мы подробно разберем, почему штатные механизмы платформы не позволяют решить эту задачу «в лоб», проанализируем ограничения популярных внешних компонент (таких как FormEx и Yoksel) и изучим проверенные практические методы (лайфхаки), которые позволяют обойти это платформенное ограничение.

Анализ технического ограничения платформы 1С 7.7

Для начала выясним причину проблемы. В штатном табличном документе 1С 7.7 любое свойство оформления (будь то цвет шрифта, его размер, начертание или фоновая заливка) применяется исключительно к ячейке целиком. Платформа физически не поддерживает хранение информации о частичном форматировании Rich Text (богатого текста) внутри одного текстового поля.

Обратите внимание на популярные внешние компоненты, которые часто используются для расширения возможностей интерфейса 1С 7.7:

  1. Компонента FormEx: Она отлично справляется с раскраской строк в табличных частях экранных форм, умеет динамически менять цвета списков или ячеек при помощи специальных макрокоманд вроде FONT и BRUSH. Однако форматировать отдельные слова внутри одной ячейки печатной формы она не умеет.
  2. Проект Йоксель (Yoksel): Это мощный инструмент для работы с табличными документами, который значительно расширяет возможности выгрузки и оформления. Но даже он работает на уровне свойств ячеек и не предоставляет встроенных функций для разметки отдельных символов внутри строки.

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

Решение 1. Метод «невидимых границ» (сплит-ячейки)

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

Рассмотрим алгоритм настройки этого метода по шагам:

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

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

Решение 2. Динамическое создание графических объектов поверх таблицы

В табличном документе 1С 7.7 можно размещать не только текстовые данные в сетке ячеек, но и полноценные графические объекты, расположенные «поверх» этой сетки. Мы можем использовать объект типа «Текст» (рисунок с текстом) для позиционирования нужного слова.

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

Решение 3. Использование OLE-соединения с Microsoft Excel или Word

Если печатная форма формируется на компьютере, где установлен офисный пакет Microsoft Office, мы можем использовать OLE-автоматизацию (COM-соединение). В отличие от 1С 7.7, объектная модель MS Excel и MS Word полностью поддерживает посимвольное форматирование внутри ячеек и абзацев.

Давайте посмотрим на практический пример кода для выгрузки данных в Excel с выделением конкретного слова цветом:


// Создаем объект связи с Excel
Попытка
    Эксель = СоздатьОбъект("Excel.Application");
Исключение
    Предупреждение("Не удалось запустить Microsoft Excel!");
    Возврат;
КонецПопытки;

// Добавляем новую рабочую книгу и выбираем активный лист
Книга = Эксель.Workbooks.Add();
Лист = Книга.ActiveSheet;

// Записываем строку в ячейку A1
Ячейка = Лист.Cells(1, 1);
Ячейка.Value = "Внимание: Договор просрочен!";

// Нам нужно выделить слово "просрочен!" красным цветом.
// Слово начинается с 19-го символа и имеет длину 10 символов.
Старт = 19;
Длина = 10;

// Применяем форматирование к конкретным символам ячейки
Ячейка.Characters(Старт, Длина).Font.Color = 255; // Красный цвет (RGB: 255, 0, 0)
Ячейка.Characters(Старт, Длина).Font.Bold = 1;   // Делаем слово жирным

// Делаем Excel видимым для пользователя
Эксель.Visible = 1;

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

Решение 4. Формирование печатной формы в формате HTML

Еще один продвинутый способ обойти ограничения Moxel — полностью отказаться от генерации стандартной таблицы 1С в пользу HTML-разметки. В HTML-документе мы можем стилизовать любые слова внутри абзацев без каких-либо сложностей.

Разберем по шагам пример реализации этой логики:


// Создаем объект для записи текстового файла с расширением .html
ФайлHTML = СоздатьОбъект("Текст");
ФайлHTML.ДобавитьСтроку("<html>");
ФайлHTML.ДобавитьСтроку("<head><meta charset='windows-1251'></head>");
ФайлHTML.ДобавитьСтроку("<body style='font-family: Arial, sans-serif;'>");

// Формируем строку с выделением отдельного слова тегом span
СтрокаТекста = "Уважаемый клиент, Ваш баланс составляет <span style='color: red; font-weight: bold;'>отрицательное</span> значение.";
ФайлHTML.ДобавитьСтроку("<p>" + СтрокаТекста + "</p>");

ФайлHTML.ДобавитьСтроку("</body>");
ФайлHTML.ДобавитьСтроку("</html>");

// Записываем файл во временный каталог
ПутьКФайлу = КаталогВременныхФайлов() + "print_form.html";
ФайлHTML.Записать(ПутьКФайлу);

// Открываем документ для пользователя во внешнем браузере
ЗапуститьПриложение(ПутьКФайлу);

Сформированный таким образом файл можно не только открыть в стандартном браузере, но и встроить непосредственно в форму вашей обработки 1С, используя стандартный ActiveX-элемент WebBrowser (Проводник Internet Explorer).

Как эта проблема решается в современных версиях 1С (8.3)?

Многих разработчиков интересует вопрос: изменилось ли положение дел в более современных версиях платформы? К сожалению, стандартный ТабличныйДокумент в 1С:Предприятии 8.3 при выводе обычного текста в ячейку по-прежнему форматирует его только целиком.

Тем не менее, в 1С 8.x появился специализированный класс ФорматированнаяСтрока. С его помощью можно собирать текстовые конструкции из частей с различным оформлением. Однако поддержка вывода объекта ФорматированнаяСтрока непосредственно в ячейки печатных форм до сих пор ограничена некоторыми режимами работы и версиями платформы. Поэтому даже в 8.3 программисты нередко прибегают к использованию аналогичных обходных путей — делению ячеек или генерации HTML-макетов.

Подведем итоги

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

← На главную