При разработке печатных форм в системе 1С:Предприятие программисты часто сталкиваются со специфической задачей: необходимо вывести длинный текст (например, условия договора или описание товара) таким образом, чтобы он не просто расширял одну ячейку, а аккуратно ложился на заранее подготовленные горизонтальные линии («разлиновку»). Стандартное поведение платформы при установленном свойстве Переносить часто приводит к тому, что одна строка макета просто увеличивается по высоте, игнорируя нарисованные ниже пустые строки.
В этой статье мы подробно разберем, как заставить текст «перетекать» из одной строки макета в другую, сохраняя при этом структуру документа и визуальную целостность бланка. Рассмотрим несколько подходов: от простых настроек свойств до сложных алгоритмов динамического разбиения текста.
Прежде чем приступать к написанию сложного кода, проанализируем возможности визуального редактора макетов. Один из самых простых, но действенных способов — это объединение ячеек и настройка их поведения. Для подробного ознакомления с пользовательской настройкой макетов пригодится руководство по редактированию печатных форм в 1С.
Разберем этот метод по шагам:
Переносить.Шаблон.Важный нюанс: при использовании свойства Переносить платформа автоматически управляет высотой. Если вы хотите сохранить фиксированную разлиновку, этот метод может потребовать точной настройки межстрочного интервала, что не всегда удобно.
Если нам нужно строгое распределение текста по конкретным физическим строкам макета (Строка1, Строка2 и т.д.), мы можем прибегнуть к принудительному разбиению строки. Рассмотрим пример, когда мы заранее знаем лимит символов в одной строке.
Проанализируем пример кода:
// Предположим, длина одной строки макета составляет 80 символов
ДлинныйТекст = "Очень длинное описание, которое не помещается в одну строку...";
ПараметрыОбласти.Строка1 = Сред(ДлинныйТекст, 1, 80);
ПараметрыОбласти.Строка2 = Сред(ДлинныйТекст, 81, 80);
ПараметрыОбласти.Строка3 = Сред(ДлинныйТекст, 161, 80);
Однако у этого метода есть существенный недостаток: функция Сред() может разрезать слово пополам в конце строки. Чтобы этого избежать, необходимо использовать более продвинутый алгоритм «Word Wrap» (перенос по словам).
Для создания профессионального отчета выясним, как реализовать перенос текста без разрыва слов. Суть метода заключается в разделении исходной строки на массив слов и последующей сборке строк с проверкой их длины.
Разберем логику реализации:
СтрРазделить).ТекущаяСтрока, пока её длина вместе со следующим словом не превысит лимит символов.ТекущаяСтрока в очередную строку макета и начинаем новую строку со слова, которое не поместилось.Посмотрим на пример функции:
Функция РазбитьТекстПоСтрокам(Знач ИсходныйТекст, ЛимитСимволов)
МассивРезультат = Новый Массив;
МассивСлов = СтрРазделить(ИсходныйТекст, " ", Ложь);
ТекущаяСтрока = "";
Для Каждого Слово Из МассивСлов Цикл
Если СтрДлина(ТекущаяСтрока + " " + Слово) <= ЛимитСимволов Тогда
ТекущаяСтрока = ТекущаяСтрока + ?(ПустаяСтрока(ТекущаяСтрока), "", " ") + Слово;
Иначе
МассивРезультат.Добавить(ТекущаяСтрока);
ТекущаяСтрока = Слово;
КонецЕсли;
КонецЦикла;
Если Не ПустаяСтрока(ТекущаяСтрока) Тогда
МассивРезультат.Добавить(ТекущаяСтрока);
КонецЕсли;
Возврат МассивРезультат;
КонецФункции
Наиболее точный способ, который учитывает реальную ширину шрифта (ведь символ «i» уже, чем «W»), основан на методе ПроверитьВывод() объекта ТабличныйДокумент. Этот метод позволяет понять, помещается ли область в текущие границы печатной страницы или заданной ширины.
Рассмотрим алгоритм действий:
ТабличныйДокумент.ПроверитьВывод() для этой области.Ложь (высота строки увеличилась), значит, последнее слово лишнее — его нужно перенести на следующую строку.Этот метод считается «золотым стандартом» в разработке сложных печатных форм, так как он гарантирует отсутствие пустого места или обрезания текста независимо от выбранного шрифта и кегля.
В некоторых случаях мы можем подготовить текст программно, вставив в него символы переноса строк. Выясним, как это работает вместе со свойством РазмещениеТекста = Переносить.
Для управления переносами используются следующие спецсимволы:
Символы.ПС (Перевод Строки) — принудительно переносит текст на новую строку внутри одной ячейки.Символы.НПП (Неразрывный пробел) — позволяет предотвратить разрыв важных связок слов (например, фамилии и инициалов).Если в макете предусмотрена одна высокая ячейка, наложенная поверх линий, мы можем рассчитать количество строк через СтрЧислоСтрок() и выводить текст так:
// Пример вывода многострочного текста
Для Сч = 1 По СтрЧислоСтрок(ВесьТекст) Цикл
ТекущаяСтрокаТекста = СтрПолучитьСтроку(ВесьТекст, Сч);
// Вывод в соответствующую область макета
ОбластьСтрока.Параметры.Текст = ТекущаяСтрокаТекста;
ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;
Проанализируем ситуацию с визуальной точки зрения. Чтобы пользователь видел «разлинованные» поля, даже если текста в них нет, стоит придерживаться следующих правил:
Забивать. Это полезно, если линии отрисованы не границами, а подстрочными символами.Подводя итог, выбор метода зависит от жесткости требований к макету. Для простых форм достаточно настройки свойств ячейки Переносить, а для строгой отчетности на бланках строгой отчетности лучше использовать комбинацию алгоритма Word Wrap и метода ПроверитьВывод().