При разработке внешних печатных форм (ВПФ) на базе системы компоновки данных (СКД) программисты часто сталкиваются с ситуацией, когда настройки табличного документа, заданные в коде, корректно отображаются в режиме "Предварительного просмотра", но полностью игнорируются или искажаются при отправке на физический принтер. Типичный симптом — установка масштаба в 100% или, наоборот, неадекватное сжатие макета до 30-40%. Рассмотрим подробно, как взять процесс печати под полный контроль и заставить систему соблюдать заданные параметры.
По умолчанию 1С выполняет компоновку результата автоматически. Даже если мы пропишем настройки в процедуре ПриКомпоновкеРезультата, платформа может переинициализировать ТабличныйДокумент в процессе окончательного вывода, что приведет к сбросу программно установленных свойств. Для решения этой проблемы необходимо перехватить управление, установив флаг СтандартнаяОбработка = Ложь.
Разберем алгоритм работы в модуле объекта внешней печатной формы. Нам необходимо вручную выполнить все этапы компоновки: от создания макета до вывода в результирующий документ. Проанализируем следующий программный код:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
// Отключаем автоматический вывод платформой
СтандартнаяОбработка = Ложь;
// Получаем текущие настройки из компоновщика
Настройки = КомпоновщикНастроек.Настройки;
// Формируем макет компоновки
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
// Инициализируем процессор компоновки
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
// Устанавливаем настройки печатной страницы ДО вывода данных
ДокументРезультат.АвтоМасштаб = Ложь;
ДокументРезультат.МасштабПечати = 95;
ДокументРезультат.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
// Устанавливаем поля (рекомендуется не использовать 0)
ДокументРезультат.ПолеСлева = 5;
ДокументРезультат.ПолеСправа = 5;
ДокументРезультат.ПолеСверху = 5;
ДокументРезультат.ПолеСнизу = 5;
// Выводим результат в табличный документ
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
КонецПроцедуры
Рассмотрим подробнее критические моменты, которые могут привести к ошибкам при реализации данного метода:
Период или Должность), при ручном вызове метода Выполнить() может возникнуть ошибка "Не установлено значение параметра". Это происходит потому, что параметры из пользовательских настроек не всегда автоматически попадают в КомпоновщикМакета. Перед выполнением убедитесь, что значения параметров заполнены в КомпоновщикНастроек.Настройки.ПараметрыДанных.АвтоМасштаб и МасштабПечати. Если АвтоМасштаб установлен в значение Истина, система будет пытаться уместить документ по ширине страницы, игнорируя числовое значение масштаба. Если же вы хотите строго задать, например, 95%, свойство АвтоМасштаб обязательно должно быть Ложь.ПолеСлева = 0 и других в значение ноль часто является причиной некорректного поведения драйвера принтера. У большинства физических устройств есть аппаратная "непечатная зона". Когда 1С передает документ с нулевыми полями, драйвер может принудительно сжать весь макет, чтобы гарантированно не выйти за границы печати. Выясним опытным путем: установка минимальных полей в 5 мм обычно решает проблему "масштаба 30%".Выясним еще одну неочевидную причину: 1С запоминает настройки печати для каждого конкретного документа для конкретного пользователя. Если клиент один раз вручную изменил масштаб в окне печати, эти настройки сохраняются в его профиле и имеют приоритет над тем, что написано в коде. Чтобы гарантированно применить новые программные настройки, рекомендуется использовать свойство ИмяПараметровПечати:
ДокументРезультат.ИмяПараметровПечати = "УНИКАЛЬНЫЙ_ИДЕНТИФИКАТОР_ПЕЧАТИ";
Замена этого идентификатора заставит систему рассматривать документ как новый и применить параметры из кода, а не из кэша пользователя.
Для проверки корректности формирования документа без перевода бумаги воспользуемся виртуальным принтером (например, NovaPDF или стандартным Microsoft Print to PDF). Если в PDF-файле макет выглядит идеально с вашими полями и масштабом, а на бумаге — нет, значит, проблему следует искать в настройках самого драйвера принтера (параметры типа "Fit to page" или "Scale to fit").
Таким образом, сочетание управления СтандартнаяОбработка = Ложь, корректной передачи параметров в КомпоновщикМакета и установки ненулевых полей позволяет добиться стабильного результата печати внешних форм любой сложности.