При разработке печатных форм в 1С программисты часто сталкиваются с эстетической проблемой: необходимо вывести строку с филлером (подчеркиванием для последующего ручного заполнения), сохранив при этом выравнивание основного текста по ширине (Justify). Стандартный механизм выравнивания в 1С MXL воспринимает обычные и неразрывные пробелы как объекты для растяжения. В итоге между текстом и подчеркиванием _______ возникают огромные пустые дыры, которые портят вид документа.
В этой статье мы подробно разберем, как обойти ограничения табличного документа 1С, рассмотрим программные методы генерации стабильных филлеров и проанализируем альтернативные подходы к верстке макетов.
Проанализируем природу проблемы. Алгоритм выравнивания "по ширине" ищет в строке символы пробела (U+0020) и увеличивает их ширину, чтобы края текста прилегали к границам ячейки. Чтобы обмануть этот механизм, нам нужно использовать символы, которые визуально выглядят как пустое место, но с точки зрения движка рендеринга 1С не являются "растягиваемыми" пробелами.
Рассмотрим решение, основанное на комбинировании специального пробела four-per-em space (средний пробел, 1/4 кегельной шпации) и диакритического знака подчеркивания. Выясним, как это реализовать программно.
Для реализации этого метода создадим функцию, которая генерирует строку нужной длины, состоящую из фиксированных пробелов с нижним подчеркиванием:
Функция ПолучитьФиллер(ДлинаСтроки)
// Формируем базовую строку из нулей нужной длины
Строка0 = Формат(0, СтрШаблон("ЧЦ=%1; ЧН=; ЧВН=; ЧГ=", Формат(ДлинаСтроки, "ЧН=; ЧГ=")));
// Символ комбинируемого нижнего подчеркивания (U+0332)
ДиакрПодчеркивания = Символ(818);
// Спецпробел "four-per-em space" (U+2005), который не растягивается в 1С
СпецПробел = Символ(8197);
// Создаем комбинацию: невидимый символ + подчеркивание
СтрокаЗамены = СпецПробел + ДиакрПодчеркивания;
// Заменяем нули в строке на нашу комбинацию
Возврат СтрЗаменить(Строка0, "0", СтрокаЗамены);
КонецФункции
Этот метод хорош тем, что Символ(8197) воспринимается системой как жесткий глиф с фиксированной шириной. При выравнивании по ширине 1С не будет пытаться его растянуть, и ваш филлер останется монолитным и аккуратным.
Если four-per-em space не подходит под конкретный шрифт, разберем другие варианты символов Unicode, которые обладают свойством фиксированной ширины:
Проанализируем ситуацию с поддержкой этих символов. Важно понимать, что корректность отображения напрямую зависит от шрифта, установленного в операционной системе. Если шрифт не поддерживает конкретный глиф, 1С может вывести пустой квадрат. Для гарантированного результата рекомендуется использовать шрифты семейства Arial Unicode MS.
Рассмотрим более сложный, но надежный "инженерный" подход. Вместо того чтобы полагаться на автоматическое выравнивание ячейки, мы можем установить выравнивание "По левому краю" и программно рассчитать, сколько символов подчеркивания нужно добавить в конец строки, чтобы она заполнила всю ячейку.
Алгоритм действий следующий:
Размещать = Переносить.ПроверитьВывод() табличного документа для итерационного подбора длины строки.Этот метод гарантирует, что визуально строка всегда будет доходить до правого края, независимо от логики Justify.
Выясним причину, по которой многие опытные разработчики предпочитают не использовать спецсимволы, а менять структуру самого макета. Если текст филлера (например, "адрес: ____________") всегда находится в конце строки, можно разбить этот блок на две ячейки или использовать объединение ячеек.
Рассмотрим шаги реализации:
Преимущество этого способа: абсолютная стабильность при печати и экспорте в PDF. Вы не зависите от кодировок, шрифтов и особенностей рендеринга Unicode-символов.
В особо сложных случаях, когда требуется идеальное соответствие государственным стандартам (например, гербовые бланки), можно использовать объект Рисунок типа Линия.
Проанализируем этот подход:
Программно можно вычислить координаты конца текстовой строки и позиционировать графическую линию прямо поверх табличного документа. Однако это требует филигранной работы с координатами: ТекущаяОбласть.Лево и ТекущаяОбласть.Ширина. Этот способ стоит использовать только тогда, когда текстовые методы не дают нужной точности.
Разберем критически важный нюанс. Даже если в самой 1С макет выглядит идеально, при сохранении в PDF ситуация может измениться. 1С использует встроенный движок генерации PDF, который может не включать (не внедрять) редкие символы Unicode в файл.
Рекомендации для сохранения качества:
_), если это допустимо дизайном.Courier New) допустим в вашем макете, используйте его. В нем ширина пробела фиксирована изначально, и выравнивание по ширине работает предсказуемо.Подводя итог, можно сказать: наиболее "чистым" с точки зрения кода является Метод 1 с использованием фиксированных пробелов, но самым надежным для печати остается Метод 4 с использованием границ ячеек. Выбор зависит от того, насколько динамическим является ваш текст перед подчеркиванием.