Как выделить жирным шрифтом часть текста внутри ячейки в 1С?

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

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

Вариант 1. Штатное использование форматированной строки (начиная с 1С 8.3.24)

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

Разберем по шагам, как программно задать разное начертание внутри одной ячейки:

  1. В макете печатной формы в нужной ячейке указываем тип заполнения Параметр.
  2. В коде формируем массив или коллекцию элементов форматирования.
  3. Создаем объект ФорматированнаяСтрока и передаем его в параметр области.

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


ШрифтОбычный = Новый Шрифт(,, Ложь);
ШрифтЖирный = Новый Шрифт(,, Истина);

МассивЭлементов = Новый Массив;
МассивЭлементов.Добавить(Новый ФорматированнаяСтрока("Всего к оплате: ", ШрифтОбычный));
МассивЭлементов.Добавить(Новый ФорматированнаяСтрока(Формат(СуммаДокумента, "ЧДЦ=2"), ШрифтЖирный));
МассивЭлементов.Добавить(Новый ФорматированнаяСтрока(" руб.", ШрифтОбычный));

ОбластьСтрока.Параметры.ТекстИТого = Новый ФорматированнаяСтрока(МассивЭлементов);
ТабличныйДокумент.Вывести(ОбластьСтрока);

Вариант 2. Программная обработка файла через Excel (COM-объект)

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

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

  1. В Excel включаем запись макроса.
  2. Выделяем мышью часть текста внутри нужной ячейки и нажимаем кнопку «Полужирный» (Bold).
  3. Останавливаем запись и смотрим получившийся код в редакторе VBA.

В коде макроса за фрагмент строки отвечает метод Characters(Старт, Длина). Перенесем эту логику на встроенный язык 1С через работу с объектом COMОбъект("Excel.Application").

Посмотрим на пример выгрузки, открытия и форматирования фрагмента ячейки:


ИмяФайла = ПолучитьИмяВременногоФайла("xlsx");
ТабличныйДокумент.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX);

Попытка
    Эксель = Новый COMОбъект("Excel.Application");
    Эксель.Visible = Ложь;
    Эксель.DisplayAlerts = Ложь;
Исключение
    Сообщить("Не удалось запустить Microsoft Excel: " + ОписаниеОшибки());
    Возврат;
КонецПопытки;

Книга = Эксель.Workbooks.Open(ИмяФайла);
Лист = Книга.Sheets(1);

// Предположим, нужно выделить в ячейке R5C2 первые 10 символов
Ячейка = Лист.Cells(5, 2);
ПозицияНачала = 1;
ДлинаФрагмента = 10;

Ячейка.Characters(ПозицияНачала, ДлинаФрагмента).Font.Bold = Истина;

Книга.Save();
Книга.Close();
Эксель.Quit();
Эксель = Неопределено;

Как динамически определить номера строк и колонок

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

  1. Фиксация координат при формировании в 1С: при выводе секций в табличный документ свойство ТабличныйДокумент.ВысотаТаблицы или свойство выведенной области ОбластьСтрока.Верх возвращает текущий номер строки. Эти номера можно заранее записать в массив или структуру соответствий и использовать при обходе в Excel.
  2. Поиск по значению средствами Excel: для поиска нужной ячейки в уже сохраненном файле можно применить метод Лист.Cells.Find("ИскомыйТекст").
  3. Перебор используемого диапазона: можно обойти строки таблицы циклом по объекту Лист.UsedRange.Rows.

Посмотрим на пример обхода строк таблицы в Excel с поиском нужной ключевой подстроки:


ВсегоСтрок = Лист.UsedRange.Rows.Count;
НомерКолонки = 2; // Колонка с описанием

Для НомерСтроки = 1 По ВсегоСтрок Цикл
    Ячейка = Лист.Cells(НомерСтроки, НомерКолонки);
    ТекстЯчейки = Строка(Ячейка.Value);
    
    ПозицияВхождения = СтрНайти(ТекстЯчейки, "Артикул:");
    Если ПозицияВхождения > 0 Тогда
        // Выделяем слово "Артикул:" жирным начертанием
        ДлинаСлова = СтрДлина("Артикул:");
        Ячейка.Characters(ПозицияВхождения, ДлинаСлова).Font.Bold = Истина;
    КонецЕсли;
КонецЦикла;

Ограничения и особенности работы через COM-объект Excel

Проанализируем технические нюансы, которые необходимо учитывать при выборе решения на базе Microsoft Excel:

  1. Зависимость от операционной системы: COM-технология доступна исключительно в среде Windows. На клиентах и серверах под управлением Linux данный код работать не будет.
  2. Наличие установленного пакета Office: на компьютере пользователя должен быть установлен и активирован Microsoft Excel.
  3. Клиентский контекст выполнения: автоматизацию Excel настоятельно рекомендуется выполнять на стороне клиента (&НаКлиенте). Запуск процессов EXCEL.EXE на сервере 1С часто приводит к зависанию невидимых процессов в памяти, блокировкам файлов и утечкам ресурсов.

Альтернативные решения внутри 1С

Если версия платформы не поддерживает ФорматированнаяСтрока, а использовать Excel невозможно, применяют следующие обходные пути:

  1. Разбиение на смежные ячейки: текст делят на части и выводят в соседние ячейки (например, в первой ячейке обычный текст, во второй — полужирный). У смежных ячеек убирают внутренние границы. Этот вариант подходит только для статических надписей с фиксированной длиной слов.
  2. Формирование документа в формате HTML: если макет печатной формы создается как HTML-документ, внутри текста можно применять стандартные теги оформления <b>...</b> или стили CSS.
← На главную