При формировании печатных форм, этикеток, ценников или бланков со строгой разметкой разработчики нередко сталкиваются с ситуацией, когда даже при установке всех полей и колонтитулов в ноль отступы по краям листа все равно остаются. Выясним причину такого поведения платформы 1С и разберем практические способы решения этой задачи.
Проанализируем ситуацию: визуально в параметрах страницы заданы нулевые значения, однако при выводе на печать или в предварительном просмотре документ смещается. Такое поведение обычно обусловлено тремя факторами: логикой программного кода, кэшированием пользовательских настроек печати и аппаратными ограничениями конкретного печатающего устройства.
Рассмотрим подробнее механизм работы платформы с параметрами страницы. В платформе 1С существует свойство КлючПараметровПечати (или ИмяПараметровПечати). Если пользователь хотя бы один раз изменил параметры печати вручную через диалог или если система сохранила настройки для формы, платформа переопределяет программные установки значениями из системного хранилища настроек пользователя. В результате заданные в коде нулевые поля игнорируются.
Чтобы исключить влияние сохраненных настроек и гарантированно применить нулевые отступы, разберем программный способ подготовки документа:
// Сбрасываем привязку к сохраненным пользовательским настройкам
ТабличныйДокумент.КлючПараметровПечати = "";
// Принудительно обнуляем поля страницы
ТабличныйДокумент.ПолеСлева = 0;
ТабличныйДокумент.ПолеСправа = 0;
ТабличныйДокумент.ПолеСверху = 0;
ТабличныйДокумент.ПолеСнизу = 0;
// Обнуляем размеры колонтитулов
ТабличныйДокумент.РазмерКолонтитулаСверху = 0;
ТабличныйДокумент.РазмерКолонтитулаСнизу = 0;
Обратите внимание: платформа 1С не поддерживает отрицательные значения для свойств ПолеСверху, ПолеСнизу, ПолеСлева и ПолеСправа. При попытке передать отрицательное число возникнет исключение: Значение должно быть неотрицательным. Скомпенсировать физический сдвиг отрицательными полями в коде невозможно.
Также важно учитывать порядок инициализации. Если в коде принудительно назначается принтер через свойство ИмяПринтера, указывать его необходимо до задания полей и колонтитулов, иначе перерасчет геометрии документа сначала произойдет по метрикам принтера по умолчанию:
ТабличныйДокумент.ИмяПринтера = "ИмяЦелевогоПринтера";
ТабличныйДокумент.КлючПараметровПечати = "";
ТабличныйДокумент.ПолеСлева = 0;
ТабличныйДокумент.ПолеСправа = 0;
ТабличныйДокумент.ПолеСверху = 0;
ТабличныйДокумент.ПолеСнизу = 0;
Если требуется очистить старые параметры вручную без изменения конфигурации, перейдем в администрирование пользователей и прав, найдем настройки нужного пользователя и очистим пункт Настройки печати табличных документов.
Посмотрим на поведение драйверов печати. При инициализации табличного документа 1С опрашивает драйвер текущего принтера через системный интерфейс GDI. Подавляющее большинство офисных лазерных и струйных принтеров имеют физическую непечатаемую область, необходимую механизму протяжки бумаги (обычно от 3 до 6 мм с каждой стороны). Драйвер сообщает операционной системе о наличии так называемого Physical Offset.
Именно поэтому при выборе виртуального принтера (например, Microsoft Print to PDF) поля мгновенно пропадают: виртуальное устройство рапортует об отсутствии физических ограничений. Но как только мы возвращаемся к физическому принтеру, драйвер снова накладывает аппаратный буфер.
Разберем по шагам, как минимизировать влияние драйвера:
Если принтер физически поддерживает печать без полей, но драйвер при прямой печати из 1С все равно добавляет отступ, рассмотрим обходной путь с промежуточным сохранением. Платформа 1С формирует PDF-документ со строгим соблюдением нулевых отступов, не привязываясь к аппаратным границам текущего устройства вывода:
// Формируем PDF-файл с абсолютными нулевыми границами
ТабличныйДокумент.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.PDF);
После формирования файл отправляется на печать через внешнюю системную утилиту в фоновом режиме с параметром печати в масштабе 100% (Actual Size). Это позволяет избежать принудительного добавления системных полей платформой при отправке на печать через стандартный диалог.