При формировании печатных форм периодически возникает задача выделить полужирным начертанием не всю ячейку целиком, а только отдельное слово, фразу или реквизит (например, выделить наименование товара или сумму внутри поясняющего абзаца). Разберем, как решается эта задача встроенными средствами платформы 1С и с помощью внешней постобработки в Microsoft Excel.
Рассмотрим возможности современных версий платформы. Начиная с версии 1С:Предприятие 8.3.24, в табличный документ была добавлена встроенная поддержка объекта ФорматированнаяСтрока. Если база работает на платформе не ниже 8.3.24 и режим совместимости конфигурации отключен или установлен на соответствующую версию, выгружать документ во внешние редакторы не требуется.
Разберем по шагам, как программно задать разное начертание внутри одной ячейки:
ФорматированнаяСтрока и передаем его в параметр области.Посмотрим на пример формирования такого текста:
ШрифтОбычный = Новый Шрифт(,, Ложь);
ШрифтЖирный = Новый Шрифт(,, Истина);
МассивЭлементов = Новый Массив;
МассивЭлементов.Добавить(Новый ФорматированнаяСтрока("Всего к оплате: ", ШрифтОбычный));
МассивЭлементов.Добавить(Новый ФорматированнаяСтрока(Формат(СуммаДокумента, "ЧДЦ=2"), ШрифтЖирный));
МассивЭлементов.Добавить(Новый ФорматированнаяСтрока(" руб.", ШрифтОбычный));
ОбластьСтрока.Параметры.ТекстИТого = Новый ФорматированнаяСтрока(МассивЭлементов);
ТабличныйДокумент.Вывести(ОбластьСтрока);
Если конфигурация работает на более ранних версиях платформы или в режиме совместимости, где форматированные строки в табличных документах недоступны, задачу решают экспортом документа в файл Excel с последующей программной модификацией.
Чтобы понять, какие свойства и методы Excel отвечают за форматирование фрагментов текста, используют встроенный механизм записи макросов в Excel:
В коде макроса за фрагмент строки отвечает метод 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();
Эксель = Неопределено;
Часто в документе выводится табличная часть переменной длины, и точные координаты ячеек заранее неизвестны. Выясним, как правильно адресовать ячейки в таких условиях:
ТабличныйДокумент.ВысотаТаблицы или свойство выведенной области ОбластьСтрока.Верх возвращает текущий номер строки. Эти номера можно заранее записать в массив или структуру соответствий и использовать при обходе в Excel.Лист.Cells.Find("ИскомыйТекст").Лист.UsedRange.Rows.Посмотрим на пример обхода строк таблицы в Excel с поиском нужной ключевой подстроки:
ВсегоСтрок = Лист.UsedRange.Rows.Count;
НомерКолонки = 2; // Колонка с описанием
Для НомерСтроки = 1 По ВсегоСтрок Цикл
Ячейка = Лист.Cells(НомерСтроки, НомерКолонки);
ТекстЯчейки = Строка(Ячейка.Value);
ПозицияВхождения = СтрНайти(ТекстЯчейки, "Артикул:");
Если ПозицияВхождения > 0 Тогда
// Выделяем слово "Артикул:" жирным начертанием
ДлинаСлова = СтрДлина("Артикул:");
Ячейка.Characters(ПозицияВхождения, ДлинаСлова).Font.Bold = Истина;
КонецЕсли;
КонецЦикла;
Проанализируем технические нюансы, которые необходимо учитывать при выборе решения на базе Microsoft Excel:
&НаКлиенте). Запуск процессов EXCEL.EXE на сервере 1С часто приводит к зависанию невидимых процессов в памяти, блокировкам файлов и утечкам ресурсов.Если версия платформы не поддерживает ФорматированнаяСтрока, а использовать Excel невозможно, применяют следующие обходные пути:
<b>...</b> или стили CSS.