Как настроить точное позиционирование данных при печати на готовых бланках в 1С?

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

Разберем распространенную и довольно неприятную проблему, с которой часто сталкиваются разработчики при проектировании печатных форм. Представьте ситуацию: у заказчика есть пачка готовых бланков строгой отчетности, напечатанных в типографии. Нам необходимо настроить печать из 1С таким образом, чтобы реквизиты (ФИО, суммы, даты, номера документов) попадали ровно в отведенные для них поля на бумаге.

Мы создаем макет табличного документа, выравниваем ячейки по миллиметрам, отключаем автовысоту и автоширину. Однако при выводе на печать пустые поля начинают непредсказуемо сжиматься, строки «плывут», и текст смещается. Выясним причину такого поведения платформы и подробно рассмотрим три надежных способа решения этой проблемы: от тонкой настройки табличного документа до использования профессиональных шаблонов Microsoft Word.

Почему сжимаются пустые ячейки в Табличном документе?

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

Даже если в свойствах ячейки отключен параметр Автовысота или Автоширина, движок печати может «схлопнуть» неиспользуемое пространство. Особенно сильно это проявляется при изменении масштаба страницы в настройках печати или при смене принтера (поскольку у разных принтеров различаются минимальные области незапечатываемых полей).

---

Решение №1: Тонкая настройка и принудительная фиксация табличного документа

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

1. Использование неразрывных пробелов

Самый простой способ предотвратить «схлопывание» ячейки — поместить в нее невидимый символ. Обычный пробел может игнорироваться системой, поэтому лучше использовать неразрывный пробел Символы.НпП. Программно заполняйте им все пустые ячейки-разделители, которые задают отступы между реквизитами. Наличие этого символа заставит систему отрисовать ячейку строго по заданным размерам.

2. Программная фиксация размеров строк и колонок

Вы можете жестко заблокировать размеры областей сразу после вывода их в результирующий табличный документ. Для этого используется программная установка высоты строк в пунктах.

Посмотрим на пример кода, фиксирующего параметры выведенных строк:


// Создаем результирующий табличный документ
ТабДок = Новый ТабличныйДокумент;

// Получаем и выводим область макета
Макет = ПолучитьМакет("МакетБланка");
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ТабДок.Вывести(ОбластьШапка);

// Жестко фиксируем высоту строк, чтобы они не сжимались
ТабДок.Область("R1").ВысотаСтроки = 25; // Высота первой строки в пунктах
ТабДок.Область("R1").АвтоВысотаСтроки = Ложь;

ТабДок.Область("R2").ВысотаСтроки = 15; // Высота второй строки в пунктах
ТабДок.Область("R2").АвтоВысотаСтроки = Ложь;

3. Проектирование на мелкой координатной сетке

При верстке макета под готовый бланк избегайте создания крупных ячеек. Разбейте весь макет на очень мелкую сетку (например, с шириной колонок и высотой строк по 2–3 миллиметра). Для вывода параметров объединяйте нужные мелкие ячейки. Такая «микросетка» гораздо устойчивее к искажениям масштабирования, а погрешность сдвига при печати уменьшается до долей миллиметра.

---

Решение №2: Использование рисунков типа «Текст» (Графический метод)

Если сетка табличного документа все равно деформируется из-за особенностей драйверов конкретного принтера, отличным выходом будет отказ от привязки данных к ячейкам. Мы можем использовать графические объекты поверх сетки табличного документа.

Разберем этот метод по шагам:

  1. Откройте ваш макет табличного документа в конфигураторе.
  2. В меню выберите пункт Таблица — Рисунки — Текст.
  3. Разместите появившуюся текстовую рамку в нужном месте макета. Вы можете позиционировать ее мышкой с точностью до пикселя абсолютно свободно, игнорируя границы ячеек.
  4. В свойствах созданного рисунка перейдите к полю Заполнение и выберите значение Параметр. Задайте имя параметра (например, ФИОПолучателя).
  5. В свойствах рисунка обязательно снимите флаг Линия (выберите «Без линии»), чтобы рамка не выводилась на печать.

Такие текстовые рисунки жестко фиксируют свои геометрические размеры. Платформа никогда не сожмет и не сдвинет их, даже если внутри не будет данных.

Полезный лайфхак при верстке: Отсканируйте бумажный бланк с разрешением 300 DPI и сохраните как картинку. В макете 1С зайдите в свойства таблицы и установите эту картинку в качестве фонового изображения. Теперь вы можете визуально расставить ваши текстовые рисунки ровно поверх полей отсканированного бланка. Перед сохранением макета просто зайдите в свойства фоновой картинки бланка и снимите флаг Выводить на печать. На принтер будут отправляться только ваши заполненные параметры, идеально попадающие в бумажные поля.

---

Решение №3: Шаблоны MS Word через БСП (Современный стандарт)

Использование шаблонов Microsoft Word (файлов формата .docx) гарантирует стопроцентное сохранение разметки документа. Документ будет выглядеть и печататься одинаково абсолютно на любом компьютере и принтере.

В современных конфигурациях 1С на базе Библиотеки стандартных подсистем (БСП) реализован механизм работы с офисными документами напрямую, без использования медленных COM-объектов (ActiveX). Платформа разбирает файл .docx на уровне двоичных данных как zip-архив с XML-схемами. Это позволяет формировать печатные формы мгновенно и без установленного пакета MS Office на сервере (что особенно актуально для серверов под управлением Linux).

Разметка шаблона в MS Word

Создайте документ в Word, настройте поля страницы, точно соответствующие вашему бланку. Для вставки данных используйте специальные теги:

Программная реализация заполнения шаблона в 1С

Загрузите созданный файл .docx в конфигурацию как макет с типом Двоичные данные. Рассмотрим подробнее, как программно заполнить этот шаблон параметрами с использованием механизмов БСП:


// 1. Извлекаем двоичные данные макета из конфигурации
ДвоичныеДанныеМакета = ПолучитьМакет("ПФ_MXL_ДоговорШаблон");

// Инициализируем макет офисного документа через БСП
Макет = УправлениеПечатью.ИнициализироватьМакетОфисногоДокумента(ДвоичныеДанныеМакета, "DOCX");

// 2. Инициализируем структуру будущей печатной формы
ПечатнаяФорма = УправлениеПечатью.ИнициализироватьПечатнуюФорму("DOCX");

// 3. Подготавливаем данные для заполнения шапки документа
ДанныеЗаполнения = Новый Структура;
ДанныеЗаполнения.Вставить("НомерДоговора", "№ 123-ФЗ");
ДанныеЗаполнения.Вставить("Дата", Формат(ТекущаяДата(), "ДЛФ=Д"));
ДанныеЗаполнения.Вставить("Контрагент", "ООО ""Вектор""");
ДанныеЗаполнения.Вставить("Сумма", "150 000 рублей 00 копеек");

// 4. Получаем область "Шапка" из макета Word
ОбластьШапки = УправлениеПечатью.ОбластьМакетОфисногоДокумента(Макет, "Шапка");

// Заполняем параметры в области и присоединяем ее к печатной форме
УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФорма, ОбластьШапки, ДанныеЗаполнения);

// 5. Выводим готовый заполненный файл Word пользователю на экран
УправлениеПечатью.ПоказатьДокумент(ПечатнаяФорма);

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

← На главную