Как программно задать настройки печати в СКД, чтобы они не сбрасывались при выводе на принтер?

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

При разработке внешних печатных форм (ВПФ) на базе системы компоновки данных (СКД) программисты часто сталкиваются с ситуацией, когда настройки табличного документа, заданные в коде, корректно отображаются в режиме "Предварительного просмотра", но полностью игнорируются или искажаются при отправке на физический принтер. Типичный симптом — установка масштаба в 100% или, наоборот, неадекватное сжатие макета до 30-40%. Рассмотрим подробно, как взять процесс печати под полный контроль и заставить систему соблюдать заданные параметры.

Проблема стандартного вывода СКД

По умолчанию 1С выполняет компоновку результата автоматически. Даже если мы пропишем настройки в процедуре ПриКомпоновкеРезультата, платформа может переинициализировать ТабличныйДокумент в процессе окончательного вывода, что приведет к сбросу программно установленных свойств. Для решения этой проблемы необходимо перехватить управление, установив флаг СтандартнаяОбработка = Ложь.

Пошаговое решение: Перехват управления компоновкой

Разберем алгоритм работы в модуле объекта внешней печатной формы. Нам необходимо вручную выполнить все этапы компоновки: от создания макета до вывода в результирующий документ. Проанализируем следующий программный код:


Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    
    // Отключаем автоматический вывод платформой
    СтандартнаяОбработка = Ложь;
    
    // Получаем текущие настройки из компоновщика
    Настройки = КомпоновщикНастроек.Настройки;
    
    // Формируем макет компоновки
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
    
    // Инициализируем процессор компоновки
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
    
    // Устанавливаем настройки печатной страницы ДО вывода данных
    ДокументРезультат.АвтоМасштаб = Ложь;
    ДокументРезультат.МасштабПечати = 95;
    ДокументРезультат.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
    
    // Устанавливаем поля (рекомендуется не использовать 0)
    ДокументРезультат.ПолеСлева = 5;
    ДокументРезультат.ПолеСправа = 5;
    ДокументРезультат.ПолеСверху = 5;
    ДокументРезультат.ПолеСнизу = 5;
    
    // Выводим результат в табличный документ
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);
    
КонецПроцедуры

Важные нюансы при программном выводе

Рассмотрим подробнее критические моменты, которые могут привести к ошибкам при реализации данного метода:

  1. Передача параметров: Если в вашей схеме (СКД) используются параметры данных (например, Период или Должность), при ручном вызове метода Выполнить() может возникнуть ошибка "Не установлено значение параметра". Это происходит потому, что параметры из пользовательских настроек не всегда автоматически попадают в КомпоновщикМакета. Перед выполнением убедитесь, что значения параметров заполнены в КомпоновщикНастроек.Настройки.ПараметрыДанных.
  2. Конфликт АвтоМасштаба и Масштаба: Проанализируем поведение свойств АвтоМасштаб и МасштабПечати. Если АвтоМасштаб установлен в значение Истина, система будет пытаться уместить документ по ширине страницы, игнорируя числовое значение масштаба. Если же вы хотите строго задать, например, 95%, свойство АвтоМасштаб обязательно должно быть Ложь.
  3. Проблема нулевых полей: Установка свойств ПолеСлева = 0 и других в значение ноль часто является причиной некорректного поведения драйвера принтера. У большинства физических устройств есть аппаратная "непечатная зона". Когда 1С передает документ с нулевыми полями, драйвер может принудительно сжать весь макет, чтобы гарантированно не выйти за границы печати. Выясним опытным путем: установка минимальных полей в 5 мм обычно решает проблему "масштаба 30%".

Очистка кэша настроек пользователя

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

ДокументРезультат.ИмяПараметровПечати = "УНИКАЛЬНЫЙ_ИДЕНТИФИКАТОР_ПЕЧАТИ";

Замена этого идентификатора заставит систему рассматривать документ как новый и применить параметры из кода, а не из кэша пользователя.

Диагностика с помощью виртуальных принтеров

Для проверки корректности формирования документа без перевода бумаги воспользуемся виртуальным принтером (например, NovaPDF или стандартным Microsoft Print to PDF). Если в PDF-файле макет выглядит идеально с вашими полями и масштабом, а на бумаге — нет, значит, проблему следует искать в настройках самого драйвера принтера (параметры типа "Fit to page" или "Scale to fit").

Таким образом, сочетание управления СтандартнаяОбработка = Ложь, корректной передачи параметров в КомпоновщикМакета и установки ненулевых полей позволяет добиться стабильного результата печати внешних форм любой сложности.

← На главную