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

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

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

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

В чем сложность стандартного механизма ячеек?

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

Из-за этого разработчикам приходилось разделять текст на две отдельные ячейки: левую (для статичного жирного заголовка) и правую (для динамического текста). Однако при таком подходе, если текст в правой ячейке не помещался по ширине и переносился на следующую строку, он переносился исключительно в границах своей правой колонки. Пространство под левой ячейкой («Привет:») оставалось пустым, образуя некрасивую ступенчатую пустоту. Объединить ячейки ступенчато в табличном документе невозможно, поскольку сетка ячеек должна оставаться строго прямоугольной.

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

Решение 1. Современный подход: Использование «Форматированной строки» (для платформы 8.3.24 и выше)

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

Рассмотрим, как настроить такое поведение двумя способами: через Конфигуратор и программно.

Способ А. Визуальная настройка в Конфигураторе (для статического текста)

Если часть текста в ячейке известна заранее, настроить форматирование можно прямо в макете:

  1. Откройте макет печатной формы и выберите необходимую ячейку.
  2. В палитре свойств найдите поле Текст и нажмите кнопку выбора (три точки).
  3. В открывшемся диалоговом окне переключите вид на Форматированная строка.
  4. Теперь вы можете отформатировать текст визуально: выделите слово «Привет:», сделайте его жирным или измените цвет, а оставшуюся часть строки оставьте стандартной.
  5. Убедитесь, что для ячейки включено свойство Размещение текста в значение Переносить, а у строки макета свойство Высота строки установлено в значение Авто.

Способ Б. Динамическое заполнение из программного кода

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

Рассмотрим пример кода:


// 1. Получаем область макета
Область = Макет.ПолучитьОбласть("СтрокаДанных");

// 2. Создаем специальный шрифт для выделения префикса (например, Жирный)
ШрифтПрефикса = Новый Шрифт(,, Истина); 

// 3. Формируем массив частей для форматированной строки
МассивЧастей = Новый Массив;
МассивЧастей.Добавить(Новый ФорматированнаяСтрока("Привет: ", ШрифтПрефикса, ЦветаСтиля.ЦветОсобогоТекста));
МассивЧастей.Добавить(ПараметрыПечати.ДлинныйТекстИзБазы); // Обычный текст

// 4. Собираем единый объект и присваиваем его параметру ячейки
Область.Параметры.Инфорстарт = Новый ФорматированнаяСтрока(МассивЧастей);

// 5. Выводим область в табличный документ
ТабличныйДокумент.Вывести(Область);

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

Способ В. Использование функций БСП (Библиотеки Стандартных Подсистем)

Если в вашей конфигурации внедрена БСП, задачу можно решить еще проще и лаконичнее с помощью разметки, похожей на HTML. В общем модуле СтроковыеФункцииКлиентСервер существует функция преобразования тегов в форматированную строку.

Посмотрим на пример реализации:


// Формируем строку с простейшими тегами оформления
ТекстСРазметкой = "<b>Привет:</b> " + ПараметрыПечати.ДлинныйТекстИзБазы;

// Преобразуем разметку в объект ФорматированнаяСтрока и передаем в параметр
Область.Параметры.Инфорстарт = СтроковыеФункцииКлиентСервер.ФорматированнаяСтрока(ТекстСРазметкой);

Тег <b> автоматически преобразует текст внутри него в жирный шрифт, избавляя вас от необходимости вручную создавать объекты шрифтов в коде. Для построения всего модуля печати по стандартам библиотек можно использовать пример внешней печатной формы на базе БСП.

Решение 2. Обходной путь: Наложение графического объекта «Картинка с текстом» (для старых версий платформы)

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

Суть метода заключается в совмещении графического объекта табличного документа и текстового параметра ячейки. Разберем этот алгоритм по шагам:

  1. В макете объедините ячейки по всей ширине, где должен располагаться длинный текст. Настройте для объединенной ячейки свойство Размещение текста — Переносить.
  2. Добавьте в макет объект типа «Рисунок» (Меню: Таблица -> Рисунки -> Картинка). При выборе типа выберите «Текст». Назовите эту надпись, например, «Привет!».
  3. Настройте оформление этой надписи: задайте жирный шрифт, нужный цвет текста, а рамку и фон сделайте прозрачными.
  4. Наложите этот графический объект поверх левой части вашей объединенной ячейки.
  5. В саму ячейку мы будем передавать параметр, но перед основным текстом программно добавим необходимое количество пробелов. Эти пробелы визуально сдвинут динамический текст вправо, чтобы он не накладывался на нашу графическую надпись «Привет!».

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


// Определяем визуальный отступ (количество пробелов подбирается экспериментально)
КоличествоПробеловДляСдвига = 12;
СтрокаПробелов = "";

Для Счетчик = 1 По КоличествоПробеловДляСдвига Цикл
    СтрокаПробелов = СтрокаПробелов + " ";
КонецЦикла;

// Формируем итоговое значение параметра
Область.Параметры.Инфорстарт = СтрокаПробелов + ПараметрыПечати.ДлинныйТекстИзБазы;

Благодаря этому трюку первая строка текста начнется со сдвигом (аккурат после графической надписи), а все последующие строки, переносясь по границе объединенной ячейки, будут выводиться с самого начала левой границы — то есть ровно под надписью «Привет!». Этот способ отлично работает визуально, но требует аккуратного подбора количества пробелов под используемый шрифт.

Решение 3. Программное разбиение строки на два параметра

Еще один классический способ для старых платформ — аналитическое разделение текста в коде. Метод подходит, если ширина колонок печатной формы строго фиксирована.

Мы создаем в макете две ячейки:

В коде мы должны определить, какая часть текста помещается в первую ячейку, отрезать её по пробелу (чтобы не разорвать слово) и остаток перенести во вторую ячейку.

Разберем пример функции разбиения строки:


// Функция разбивает строку на две части по предельной длине первой части
Процедура РазбитьТекстНаПараметры(ИсходныйТекст, ПредельнаяДлина, Часть1, Часть2)
    
    ИсходныйТекст = СокрЛП(ИсходныйТекст);
    
    Если СтрДлина(ИсходныйТекст) <= ПредельнаяДлина Тогда
        Часть1 = ИсходныйТекст;
        Часть2 = "";
        Возврат;
    КонецЕсли;
    
    // Ищем последний пробел в пределах допустимой длины, чтобы не резать слова
    ПодстрокаДляАнализа = Лев(ИсходныйТекст, ПредельнаяДлина);
    ИндексПоследнегоПробела = СтрНайти(ПодстрокаДляАнализа, " ", НаправлениеПоиска.СКонца);
    
    Если ИндексПоследнегоПробела > 0 Тогда
        Часть1 = СокрЛП(Лев(ИсходныйТекст, ИндексПоследнегоПробела));
        Часть2 = СокрЛП(Сред(ИсходныйТекст, ИндексПоследнегоПробела + 1));
    Иначе
        // Если пробелов нет, режем принудительно по границе
        Часть1 = Лев(ИсходныйТекст, ПредельнаяДлина);
        Часть2 = Сред(ИсходныйТекст, ПредельнаяДлина + 1);
    EndIf;
    
КонецПроцедуры

Затем при выводе макета мы вызываем эту процедуру и заполняем параметры:


ПредельнаяШиринаСимволов = 35; // Примерное количество символов, помещающихся в первую строку
Часть1 = "";
Часть2 = "";

РазбитьТекстНаПараметры(ПараметрыПечати.ДлинныйТекстИзБазы, ПредельнаяШиринаСимволов, Часть1, Часть2);

Область.Параметры.Инфорстарт1 = Часть1;
Область.Параметры.Инфорстарт2 = Часть2;

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

Решение 4. Использование шаблонов ячеек макета (без изменения оформления)

Если задача разделения оформления не стоит жестко (например, допустимо, чтобы и слово «Привет:», и последующий текст были выведены стандартным шрифтом), вы можете использовать тип заполнения ячейки Шаблон.

Разберем этот вариант:

  1. В макете выделите и объедините ячейки под весь текст.
  2. В свойствах ячейки установите Заполнение в значение Шаблон.
  3. В тексте ячейки напишите: Привет: [НужныйТекст]. Текст в квадратных скобках автоматически распознается платформой как параметр.
  4. В коде вам достаточно будет заполнить только один параметр: Область.Параметры.НужныйТекст = "Ваш длинный текст...".

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

Особенности экспорта печатных форм

Если вы используете современный механизм ФорматированнаяСтрока (Решение 1), обязательно учитывайте особенности сохранения таких табличных документов во внешние файлы:

Мы проанализировали ключевые способы настройки переноса текста в макетах. Для устаревших платформ оптимальным решением остается использование «Картинки с текстом» и пробельного сдвига либо логическое разделение строки в коде. Для современных проектов на платформе версии 8.3.24 и выше безусловным стандартом является использование объекта ФорматированнаяСтрока, который решает задачу быстро, надежно и без написания сложных алгоритмов верстки.

← На главную