Как реализовать нерастягивающийся пробел с подчеркиванием при выравнивании по ширине в 1С

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

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

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

Метод 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С не будет пытаться его растянуть, и ваш филлер останется монолитным и аккуратным.

Метод 2. Использование других фиксированных пробелов Unicode

Если four-per-em space не подходит под конкретный шрифт, разберем другие варианты символов Unicode, которые обладают свойством фиксированной ширины:

  1. Цифровой пробел (Figure Space, U+2007): Его ширина в точности равна ширине цифры в выбранном шрифте. Это крайне удобно, если вы верстаете финансовые документы, где важна соосность символов.
  2. Пунктуационный пробел (Punctuation Space, U+2008): Соответствует ширине точки или запятой.
  3. Узкий неразрывный пробел (Narrow No-Break Space, U+202F): Очень тонкий символ, который часто игнорируется алгоритмами растяжения.

Проанализируем ситуацию с поддержкой этих символов. Важно понимать, что корректность отображения напрямую зависит от шрифта, установленного в операционной системе. Если шрифт не поддерживает конкретный глиф, 1С может вывести пустой квадрат. Для гарантированного результата рекомендуется использовать шрифты семейства Arial Unicode MS.

Метод 3. Программный добор символов через расчет ширины

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

Алгоритм действий следующий:

  1. Устанавливаем для ячейки свойство Размещать = Переносить.
  2. Используем метод ПроверитьВывод() табличного документа для итерационного подбора длины строки.
  3. В цикле добавляем к тексту по одному символу подчеркивания до тех пор, пока высота области не увеличится (что будет означать переход на новую строку).
  4. Удаляем последний лишний символ.

Этот метод гарантирует, что визуально строка всегда будет доходить до правого края, независимо от логики Justify.

Метод 4. Структурная верстка макета (разделение на ячейки)

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

Рассмотрим шаги реализации:

  1. Текст "Адрес проживания:" помещается в одну ячейку с выравниванием по левому краю.
  2. Оставшаяся часть строки в макете — это отдельная ячейка (или группа ячеек), у которой включена только Нижняя граница (сплошная линия).

Преимущество этого способа: абсолютная стабильность при печати и экспорте в PDF. Вы не зависите от кодировок, шрифтов и особенностей рендеринга Unicode-символов.

Метод 5. Использование графических объектов (Линии)

В особо сложных случаях, когда требуется идеальное соответствие государственным стандартам (например, гербовые бланки), можно использовать объект Рисунок типа Линия.

Проанализируем этот подход: Программно можно вычислить координаты конца текстовой строки и позиционировать графическую линию прямо поверх табличного документа. Однако это требует филигранной работы с координатами: ТекущаяОбласть.Лево и ТекущаяОбласть.Ширина. Этот способ стоит использовать только тогда, когда текстовые методы не дают нужной точности.

Важные замечания по экспорту в PDF

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

Рекомендации для сохранения качества:

Подводя итог, можно сказать: наиболее "чистым" с точки зрения кода является Метод 1 с использованием фиксированных пробелов, но самым надежным для печати остается Метод 4 с использованием границ ячеек. Выбор зависит от того, насколько динамическим является ваш текст перед подчеркиванием.

← На главную