Разберем распространенную и довольно неприятную проблему, с которой часто сталкиваются разработчики при проектировании печатных форм. Представьте ситуацию: у заказчика есть пачка готовых бланков строгой отчетности, напечатанных в типографии. Нам необходимо настроить печать из 1С таким образом, чтобы реквизиты (ФИО, суммы, даты, номера документов) попадали ровно в отведенные для них поля на бумаге.
Мы создаем макет табличного документа, выравниваем ячейки по миллиметрам, отключаем автовысоту и автоширину. Однако при выводе на печать пустые поля начинают непредсказуемо сжиматься, строки «плывут», и текст смещается. Выясним причину такого поведения платформы и подробно рассмотрим три надежных способа решения этой проблемы: от тонкой настройки табличного документа до использования профессиональных шаблонов Microsoft Word.
Перед тем как переходить к решениям, проанализируем ситуацию. Платформа 1С при формировании результирующего документа выполняет оптимизацию его структуры для экономии памяти и корректного отображения на разных экранах и принтерах. Если в строке или колонке отсутствуют видимые данные (нет текста, цвета фона, рамок или параметров), система считает эту область пустой.
Даже если в свойствах ячейки отключен параметр Автовысота или Автоширина, движок печати может «схлопнуть» неиспользуемое пространство. Особенно сильно это проявляется при изменении масштаба страницы в настройках печати или при смене принтера (поскольку у разных принтеров различаются минимальные области незапечатываемых полей).
---
Если по каким-то причинам вы хотите остаться в рамках стандартного табличного документа 1С, вам придется заставить платформу считать пустые ячейки значимыми. Рассмотрим, как это сделать.
1. Использование неразрывных пробелов
Самый простой способ предотвратить «схлопывание» ячейки — поместить в нее невидимый символ. Обычный пробел может игнорироваться системой, поэтому лучше использовать неразрывный пробел Символы.НпП. Программно заполняйте им все пустые ячейки-разделители, которые задают отступы между реквизитами. Наличие этого символа заставит систему отрисовать ячейку строго по заданным размерам.
2. Программная фиксация размеров строк и колонок
Вы можете жестко заблокировать размеры областей сразу после вывода их в результирующий табличный документ. Для этого используется программная установка высоты строк в пунктах.
Посмотрим на пример кода, фиксирующего параметры выведенных строк:
// Создаем результирующий табличный документ
ТабДок = Новый ТабличныйДокумент;
// Получаем и выводим область макета
Макет = ПолучитьМакет("МакетБланка");
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ТабДок.Вывести(ОбластьШапка);
// Жестко фиксируем высоту строк, чтобы они не сжимались
ТабДок.Область("R1").ВысотаСтроки = 25; // Высота первой строки в пунктах
ТабДок.Область("R1").АвтоВысотаСтроки = Ложь;
ТабДок.Область("R2").ВысотаСтроки = 15; // Высота второй строки в пунктах
ТабДок.Область("R2").АвтоВысотаСтроки = Ложь;
3. Проектирование на мелкой координатной сетке
При верстке макета под готовый бланк избегайте создания крупных ячеек. Разбейте весь макет на очень мелкую сетку (например, с шириной колонок и высотой строк по 2–3 миллиметра). Для вывода параметров объединяйте нужные мелкие ячейки. Такая «микросетка» гораздо устойчивее к искажениям масштабирования, а погрешность сдвига при печати уменьшается до долей миллиметра.
---
Если сетка табличного документа все равно деформируется из-за особенностей драйверов конкретного принтера, отличным выходом будет отказ от привязки данных к ячейкам. Мы можем использовать графические объекты поверх сетки табличного документа.
Разберем этот метод по шагам:
ФИОПолучателя).Такие текстовые рисунки жестко фиксируют свои геометрические размеры. Платформа никогда не сожмет и не сдвинет их, даже если внутри не будет данных.
Полезный лайфхак при верстке: Отсканируйте бумажный бланк с разрешением 300 DPI и сохраните как картинку. В макете 1С зайдите в свойства таблицы и установите эту картинку в качестве фонового изображения. Теперь вы можете визуально расставить ваши текстовые рисунки ровно поверх полей отсканированного бланка. Перед сохранением макета просто зайдите в свойства фоновой картинки бланка и снимите флаг Выводить на печать. На принтер будут отправляться только ваши заполненные параметры, идеально попадающие в бумажные поля.
---
Использование шаблонов Microsoft Word (файлов формата .docx) гарантирует стопроцентное сохранение разметки документа. Документ будет выглядеть и печататься одинаково абсолютно на любом компьютере и принтере.
В современных конфигурациях 1С на базе Библиотеки стандартных подсистем (БСП) реализован механизм работы с офисными документами напрямую, без использования медленных COM-объектов (ActiveX). Платформа разбирает файл .docx на уровне двоичных данных как zip-архив с XML-схемами. Это позволяет формировать печатные формы мгновенно и без установленного пакета MS Office на сервере (что особенно актуально для серверов под управлением Linux).
Создайте документ в Word, настройте поля страницы, точно соответствующие вашему бланку. Для вставки данных используйте специальные теги:
{v8 ИмяПараметра}. Например: {v8 НомерДоговора} или {v8 Дата}.{v8 Область.ИмяОбласти} и {/v8 Область.ИмяОбласти}. Все, что находится между ними, система сможет циклически выводить в документ.Загрузите созданный файл .docx в конфигурацию как макет с типом Двоичные данные. Рассмотрим подробнее, как программно заполнить этот шаблон параметрами с использованием механизмов БСП:
// 1. Извлекаем двоичные данные макета из конфигурации
ДвоичныеДанныеМакета = ПолучитьМакет("ПФ_MXL_ДоговорШаблон");
// Инициализируем макет офисного документа через БСП
Макет = УправлениеПечатью.ИнициализироватьМакетОфисногоДокумента(ДвоичныеДанныеМакета, "DOCX");
// 2. Инициализируем структуру будущей печатной формы
ПечатнаяФорма = УправлениеПечатью.ИнициализироватьПечатнуюФорму("DOCX");
// 3. Подготавливаем данные для заполнения шапки документа
ДанныеЗаполнения = Новый Структура;
ДанныеЗаполнения.Вставить("НомерДоговора", "№ 123-ФЗ");
ДанныеЗаполнения.Вставить("Дата", Формат(ТекущаяДата(), "ДЛФ=Д"));
ДанныеЗаполнения.Вставить("Контрагент", "ООО ""Вектор""");
ДанныеЗаполнения.Вставить("Сумма", "150 000 рублей 00 копеек");
// 4. Получаем область "Шапка" из макета Word
ОбластьШапки = УправлениеПечатью.ОбластьМакетОфисногоДокумента(Макет, "Шапка");
// Заполняем параметры в области и присоединяем ее к печатной форме
УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФорма, ОбластьШапки, ДанныеЗаполнения);
// 5. Выводим готовый заполненный файл Word пользователю на экран
УправлениеПечатью.ПоказатьДокумент(ПечатнаяФорма);
Использование этого метода полностью решает проблему сдвига полей. Вы можете быть уверены, что размеры шрифтов, межстрочные интервалы, отступы абзацев и границы таблиц останутся ровно такими, какими вы их настроили в исходном шаблоне Word.