При разработке печатных форм в системе 1С:Предприятие 8 программисты часто сталкиваются с ситуацией, когда заданные программно параметры страницы — такие как МасштабПечати или АвтоМасштаб — упорно игнорируются платформой. Особенно это актуально для версий платформы 8.3.12 и выше, а также при использовании типовых механизмов печати в конфигурациях на обычных формах (например, в «Зарплата и Управление Персоналом для Украины»). Рассмотрим подробнее, почему это происходит и как заставить программу выводить документ с нужным масштабом.
Первым делом проанализируем, как именно вызывается печать. Если в вашей конфигурации используется вызов через УниверсальныеМеханимы.НапечататьДокумент, то именно здесь кроется корень проблемы. Дело в том, что внутри этой типовой процедуры часто заложена логика, которая принудительно устанавливает свойство АвтоМасштаб в значение Истина, если не переданы специфические настройки. Как только АвтоМасштаб становится равным Истина, любое значение, записанное в МасштабПечати, обнуляется или игнорируется платформой.
Выясним причину такого поведения: типовой механизм стремится «помочь» пользователю уместить документ по ширине страницы, но тем самым блокирует возможность жестко задать, например, 50% или 70% от оригинала. Чтобы обойти это ограничение, нам придется отказаться от использования универсального механизма в пользу прямого вывода или написать свою процедуру-обертку.
Разберем по шагам, как правильно подготовить ТабличныйДокумент к печати. Платформа 1С очень чувствительна к порядку установки свойств. Если вы сначала установите масштаб, а потом измените режим масштабирования, настройки могут сброситься. Рекомендуется следующий порядок:
ТабДокумент.АвтоМасштаб = Ложь;ТабДокумент.МасштабПечати = 50;Рассмотрим пример кода, который гарантированно применяет настройки при прямом выводе:
Объект = ДокументПечати.ПолучитьОбъект();
ТабДокумент = Объект.ПечатьБЛ(); // Получаем сформированный табличный документ
ТабДокумент.АвтоМасштаб = Ложь;
ТабДокумент.МасштабПечати = 50;
ТабДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
// Важно использовать НеИспользовать, чтобы диалог не перекрыл программные настройки
ТабДокумент.Напечатать(РежимИспользованияДиалогаПечати.НеИспользовать);
Посмотрим на ситуацию, когда в коде всё прописано верно, но в режиме предварительного просмотра масштаб всё равно отображается некорректно. Это известная особенность некоторых релизов платформы 8.3. В окне предпросмотра платформа может ориентироваться на сохраненные настройки пользователя.
Здесь в игру вступает свойство КлючПараметровПечати. Если вы используете один и тот же ключ для разных отчетов, 1С будет подтягивать последние настройки, которые пользователь выбрал вручную в диалоге печати (например, «По ширине страницы»). Чтобы программный масштаб всегда имел приоритет, проанализируем следующие варианты:
ТабДокумент.КлючПараметровПечати = "";. Это заставит платформу игнорировать старые настройки из реестра Windows и использовать только те, что указаны в коде.Рассмотрим пример, когда необходимо напечатать этикетку или специфический бланк. В этом случае мы часто используем РазмерСтраницы = "Custom". Проанализируем пример кода для работы с принтером этикеток, где важна точность каждого миллиметра:
ТабДок = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("Этикетка");
Область = Макет.ПолучитьОбласть("Строка");
// Заполнение параметров...
ТабДок.Вывести(Область);
ТабДок.РазмерСтраницы = "Custom";
ТабДок.ВысотаСтраницы = 40; // в миллиметрах
ТабДок.ШиринаСтраницы = 58;
ТабДок.ПолеСлева = 0;
ТабДок.ПолеСправа = 0;
ТабДок.ПолеСверху = 0;
ТабДок.ПолеСнизу = 0;
ТабДок.АвтоМасштаб = Ложь;
ТабДок.МасштабПечати = 100;
ТабДок.ИмяПринтера = "Zebra_Label_Printer";
ТабДок.Напечатать(РежимИспользованияДиалогаПечати.НеИспользовать);
Важный нюанс: Обратите внимание на обнуление полей. Платформа 1С суммирует значения свойств ПолеСлева, ПолеСправа и т.д. с физическими непечатными областями, заданными в драйвере принтера. Если ваш масштаб «съезжает», попробуйте установить все поля в 0.
Как отмечают разработчики, метод ТабДокумент.Показать() открывает стандартное окно просмотра, которое может инициализироваться до того, как драйвер принтера передаст информацию о возможных границах печати. В результате визуально мы видим масштаб 100%, хотя при вызове метода Напечатать() с параметром РежимИспользованияДиалогаПечати.НеИспользовать всё выводится корректно. Если для вас критично отображение масштаба именно в окне просмотра, попробуйте сначала вызвать ТабДокумент.Записать() во временный PDF-файл с нужными параметрами, а затем открывать уже его. Это «жесткий» способ фиксации макета, не зависящий от капризов платформы 1С.
Подводя итог нашему анализу, выделим основные правила для успешного управления масштабом:
УниверсальныеМеханимы.НапечататьДокумент, если вам нужен специфический МасштабПечати, так как этот механизм переопределяет АвтоМасштаб.АвтоМасштаб = Ложь непосредственно перед установкой МасштабПечати.КлючПараметровПечати.Соблюдение этой последовательности действий позволит вам добиться предсказуемого поведения печатных форм в любых конфигурациях на платформе 8.3.