Разработчики печатных форм в среде 1С часто сталкиваются с эстетической проблемой: при выводе текста очень крупным шрифтом (например, размером 48, 72 или более) визуально ломается левая граница выравнивания. Даже если для ячейки жестко задано свойство «Выравнивание по левому краю», перед текстом все равно остается заметный пустой отступ. Особенно сильно этот дефект бросается в глаза при верстке ценников, рекламных объявлений, крупных этикеток или титульных листов отчетов. Для решения других нестандартных задач верстки подобных макетов можно использовать способ формирования печатной формы ценников с присоединением областей разной высоты.
В этой статье мы подробно разберем, почему возникает такое смещение, изучим знаменитый хак со свойством ОриентацияТекста, проанализируем его скрытые риски и рассмотрим альтернативные, более надежные способы достижения идеального выравнивания.
Если провести эксперимент и дважды кликнуть по ячейке с крупным текстом в режиме просмотра табличного документа, можно заметить странную вещь: в момент перехода в режим редактирования текст мгновенно сдвигается влево, прижимаясь вплотную к рамке ячейки. Но как только мы завершаем редактирование, текст снова «отпрыгивает» вправо.
Такое поведение объясняется тем, что платформа 1С использует два абсолютно разных движка для отрисовки содержимого ячеек:
Давайте подробно разберем методы решения этой проблемы, начиная от изящного системного «костыля» и заканчивая гарантированно стабильными архитектурными подходами.
Наиболее простым и быстрым решением, найденным опытными разработчиками, является управление углом наклона текста. Если мы установим свойству ОриентацияТекста значение 360, текст визуально останется строго горизонтальным (ведь 360 градусов геометрически эквивалентны 0). Однако для внутреннего рендерера платформы 1С любое ненулевое значение этого свойства служит триггером для переключения на альтернативный алгоритм вывода текста.
При включении этого альтернативного алгоритма платформа перестает рассчитывать стандартные поля ячейки и позиционирует текст строго по габаритному контейнеру символов. В результате текст прижимается вплотную к левому краю.
Посмотрим на пример кода, с помощью которого можно программно применить это свойство к конкретной ячейке табличного документа:
// Получаем область макета печатной формы
ОбластьМакета = ПолучитьМакет("Макет").ПолучитьОбласть("Шапка");
// Задаем параметры крупного текста
ЯчейкаЗаголовка = ОбластьМакета.Области.ЗаголовокВыпуска;
ЯчейкаЗаголовка.Текст = "ПРАЙС-ЛИСТ";
ЯчейкаЗаголовка.Шрифт = Новый Шрифт("Arial", 72, Истина);
// Применяем хак с ориентацией текста для сброса левого отступа
ЯчейкаЗаголовка.ОриентацияТекста = 360;
// Выводим область в результирующий табличный документ
ТабличныйДокумент.Вывести(ОбластьМакета);
Важное предупреждение! Несмотря на свою простоту и эффективность, данный метод является недокументированной особенностью работы платформы. При его использовании вы берете на себя следующие риски:
Если вам требуется стопроцентная гарантия стабильности печатной формы при любых обновлениях платформы и корректный экспорт во все внешние форматы, рассмотрим более надежный подход. Мы можем отказаться от вывода надписи непосредственно в сетку ячеек и воспользоваться графическим слоем табличного документа.
Разберем по шагам, как программно создать рисунок-надпись и спозиционировать его без отступов:
// Добавляем текстовый рисунок поверх сетки ячеек
НовыйРисунок = ОбластьМакета.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Текст);
// Настраиваем позиционирование и размеры рисунка
НовыйРисунок.Верх = 2; // Смещение сверху в миллиметрах
НовыйРисунок.Лево = 0; // Прижимаем вплотную к левой границе
НовыйРисунок.Ширина = 150;
НовыйРисунок.Высота = 30;
// Задаем параметры текста и шрифта
НовыйРисунок.Текст = "АКЦИЯ";
НовыйРисунок.Шрифт = Новый Шрифт("Verdana", 72, Истина);
НовыйРисунок.ВыравниваниеПоГоризонтали = ВыравниваниеПоГоризонталиТабличногоДокумента.Лево;
// Делаем границы рисунка невидимыми, чтобы он казался частью таблицы
НовыйРисунок.Линия = Новый Линия(ТипЛинииРисункаТабличногоДокумента.НетЛинии);
НовыйРисунок.Узор = СистемныеУзорыТабличногоДокумента.БезУзора;
Использование объектов типа Рисунок предоставляет разработчику гораздо более гибкий контроль над геометрией размещения текста. Границы рисунка можно выносить за пределы физических колонок, накладывать надписи друг на друга и добиваться безупречного визуального соответствия самым строгим макетам дизайнеров.
В тех случаях, когда печатные формы выводятся на конкретных рабочих местах (например, специализированные принтеры этикеток и ценников на складах или в торговых точках), отличным решением станет подбор или редактирование шрифта.
Вы можете использовать бесплатные редакторы шрифтов (такие как FontForge), чтобы импортировать стандартный шрифт (например, Arial или Roboto), вручную сдвинуть глифы букв влево, полностью обнулив левые полуапроши, и сохранить этот шрифт под уникальным именем (например, MyArialTight). После установки этого шрифта на локальные компьютеры пользователей, любой текст, выведенный им в 1С, будет прижиматься строго к левой границе ячейки без каких-либо ухищрений в коде.
Подведем итог нашего анализа. Выбор метода зависит от архитектурных требований к вашей задаче:
ОриентацияТекста = 360.Рисунок. Это застрахует вас от неожиданных жалоб пользователей на «поехавшую» верстку.