Как реализовать перенос текста на несколько разлинованных строк в макете 1С?

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

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

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

Метод 1: Использование свойств ячейки и шаблонов

Прежде чем приступать к написанию сложного кода, проанализируем возможности визуального редактора макетов. Один из самых простых, но действенных способов — это объединение ячеек и настройка их поведения. Для подробного ознакомления с пользовательской настройкой макетов пригодится руководство по редактированию печатных форм в 1С.

Разберем этот метод по шагам:

  1. Выделите область в макете, предназначенную для ввода текста. Если у вас несколько отдельных строк с подчеркиванием, попробуйте объединить их в одну большую ячейку.
  2. В свойствах ячейки (палитра свойств) найдите параметр РазмещениеТекста. Установите значение Переносить.
  3. Если вы хотите добавить фиксированный текст к параметру (например, «Основание: [ЗначениеПараметра]»), установите тип заполнения ячейки Шаблон.
  4. Чтобы текст попадал точно на линии, в некоторых случаях эффективнее использовать подчеркнутый шрифт для самой ячейки вместо рисования границ. Для этого в свойствах шрифта выберите Подчеркивание.

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

Метод 2: Программное разбиение строки функцией Сред()

Если нам нужно строгое распределение текста по конкретным физическим строкам макета (Строка1, Строка2 и т.д.), мы можем прибегнуть к принудительному разбиению строки. Рассмотрим пример, когда мы заранее знаем лимит символов в одной строке.

Проанализируем пример кода:


// Предположим, длина одной строки макета составляет 80 символов
ДлинныйТекст = "Очень длинное описание, которое не помещается в одну строку...";

ПараметрыОбласти.Строка1 = Сред(ДлинныйТекст, 1, 80);
ПараметрыОбласти.Строка2 = Сред(ДлинныйТекст, 81, 80);
ПараметрыОбласти.Строка3 = Сред(ДлинныйТекст, 161, 80);

Однако у этого метода есть существенный недостаток: функция Сред() может разрезать слово пополам в конце строки. Чтобы этого избежать, необходимо использовать более продвинутый алгоритм «Word Wrap» (перенос по словам).

Метод 3: Алгоритм разбиения текста по словам (Word Wrap)

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

Разберем логику реализации:

  1. Разбиваем исходный текст на массив слов, используя пробел как разделитель (функция СтрРазделить).
  2. Создаем цикл, который обходит массив слов.
  3. Внутри цикла накапливаем слова в переменную ТекущаяСтрока, пока её длина вместе со следующим словом не превысит лимит символов.
  4. Как только лимит достигнут, выводим ТекущаяСтрока в очередную строку макета и начинаем новую строку со слова, которое не поместилось.

Посмотрим на пример функции:


Функция РазбитьТекстПоСтрокам(Знач ИсходныйТекст, ЛимитСимволов)
    МассивРезультат = Новый Массив;
    МассивСлов = СтрРазделить(ИсходныйТекст, " ", Ложь);
    
    ТекущаяСтрока = "";
    Для Каждого Слово Из МассивСлов Цикл
        Если СтрДлина(ТекущаяСтрока + " " + Слово) <= ЛимитСимволов Тогда
            ТекущаяСтрока = ТекущаяСтрока + ?(ПустаяСтрока(ТекущаяСтрока), "", " ") + Слово;
        Иначе
            МассивРезультат.Добавить(ТекущаяСтрока);
            ТекущаяСтрока = Слово;
        КонецЕсли;
    КонецЦикла;
    
    Если Не ПустаяСтрока(ТекущаяСтрока) Тогда
        МассивРезультат.Добавить(ТекущаяСтрока);
    КонецЕсли;
    
    Возврат МассивРезультат;
КонецФункции

Метод 4: Использование метода ПроверитьВывод()

Наиболее точный способ, который учитывает реальную ширину шрифта (ведь символ «i» уже, чем «W»), основан на методе ПроверитьВывод() объекта ТабличныйДокумент. Этот метод позволяет понять, помещается ли область в текущие границы печатной страницы или заданной ширины.

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

  1. Создаем временный ТабличныйДокумент.
  2. Постепенно добавляем слова в ячейку макета.
  3. После добавления каждого слова вызываем ПроверитьВывод() для этой области.
  4. Если метод возвращает Ложь (высота строки увеличилась), значит, последнее слово лишнее — его нужно перенести на следующую строку.

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

Метод 5: Использование управляющих символов и свойств размещения

В некоторых случаях мы можем подготовить текст программно, вставив в него символы переноса строк. Выясним, как это работает вместе со свойством РазмещениеТекста = Переносить.

Для управления переносами используются следующие спецсимволы:

Если в макете предусмотрена одна высокая ячейка, наложенная поверх линий, мы можем рассчитать количество строк через СтрЧислоСтрок() и выводить текст так:


// Пример вывода многострочного текста
Для Сч = 1 По СтрЧислоСтрок(ВесьТекст) Цикл
    ТекущаяСтрокаТекста = СтрПолучитьСтроку(ВесьТекст, Сч);
    // Вывод в соответствующую область макета
    ОбластьСтрока.Параметры.Текст = ТекущаяСтрокаТекста;
    ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;

Рекомендации по оформлению макета

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

  1. Минимальная высота строки: Всегда задавайте фиксированную минимальную высоту для строк макета, чтобы пустые строки не «схлопывались».
  2. Свойство «Забивать»: Если вы хотите, чтобы текст визуально продолжался вправо на соседние пустые ячейки (как в Excel), используйте тип размещения Забивать. Это полезно, если линии отрисованы не границами, а подстрочными символами.
  3. Графические объекты: В исключительных случаях можно использовать объект Рисунок (Текст). Он позволяет накладывать прозрачный блок с текстом поверх любой графики в макете, обеспечивая автоматический перенос внутри своих границ.

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

← На главную