Каждый разработчик 1С рано или поздно сталкивается с досадной ситуацией: в коде внешней обработки или отчета детально прописываются настройки печатной формы — задаются поля, принудительный масштаб, альбомная или портретная ориентация страницы. Однако при выводе документа на экран или отправке на принтер платформа 1С напрочь игнорирует все эти параметры, за исключением, разве что, ориентации страницы. Табличный документ упорно выводится со стандартными полями или некорректным масштабом.
В этой статье мы подробно разберем внутренние механизмы работы платформы 1С:Предприятие с параметрами печати, выясним причины такого поведения системы и рассмотрим надежные способы решения этой проблемы.
Первое, на что следует обратить внимание, — это логическое противоречие в кодовой логике настройки табличного документа. Разработчики часто пытаются использовать свойства Автомасштаб и МасштабПечати одновременно в надежде, что программа «сама разберется». Это критическая ошибка.
Проанализируем, как эти свойства ведут себя на уровне платформы:
Автомасштаб = Истина заставляет 1С автоматически сжимать или растягивать документ таким образом, чтобы он полностью уместился на один лист по ширине.МасштабПечати задает фиксированный процент масштабирования (например, 80 или 100) независимо от физических границ листа.Правило платформы: Если свойству Автомасштаб присвоено значение Истина, свойство МасштабПечати полностью игнорируется системой. Чтобы применить жестко заданный масштаб, необходимо обязательно отключать автоматический масштаб в коде.
Посмотрим на пример правильной настройки масштабирования:
// Настройка фиксированного масштаба документа
ТабДок.Автомасштаб = Ложь;
ТабДок.МасштабПечати = 80; // Теперь масштаб 80% гарантированно применится
Самая распространенная и неочевидная ошибка программистов связана со свойствами КлючПараметровПечати (в новых версиях платформы) или ИмяПараметровПечати (в устаревших редакциях). Эти свойства отвечают за сохранение индивидуальных настроек печати (выбранный принтер, поля, масштаб) для каждого пользователя в системной базе данных.
Давайте разберем по шагам, что происходит в момент выполнения кода, написанного в неверном порядке:
// НЕПРАВИЛЬНЫЙ ВАРИАНТ
ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
ТабДок.ПолеСлева = 5;
ТабДок.КлючПараметровПечати = "Параметры_МойОтчет";
При таком подходе происходит следующее:
КлючПараметровПечати.Для решения этой проблемы мы должны четко разделить логику работы программы на два возможных сценария: установка значений «по умолчанию» и «принудительная жесткая» установка.
Если мы хотим предложить пользователю оптимальные настройки (например, ландшафт и минимальные поля), но сохранить за ним право один раз настроить печатную форму под себя (чтобы при следующих открытиях применялся именно его выбор), код должен выглядеть так:
// Сначала настраиваем дефолтные параметры страницы
ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
ТабДок.ПолеСлева = 10;
ТабДок.ПолеСправа = 10;
// И только в самом конце привязываем ключ параметров печати
// Если у пользователя есть сохраненный кэш, он перекроет дефолты
ТабДок.КлючПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_МойУникальныйОтчет";
В случае, когда макет отчета технологически сложный и должен выводиться строго с определенными полями и масштабом (например, регламентированная отчетность или специализированные этикетки), мы обязаны проигнорировать прошлые манипуляции пользователя. Для этого свойства нужно устанавливать строго ПОСЛЕ инициализации ключа параметров печати:
// Сначала привязываем ключ и загружаем сохраненные настройки пользователя
ТабДок.КлючПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_МойСложныйОтчет";
// Теперь принудительно поверх пользовательских настроек накладываем жесткие правила
ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;
ТабДок.ПолеСлева = 0;
ТабДок.ПолеСправа = 0;
ТабДок.ПолеСверху = 5;
ТабДок.ПолеСнизу = 5;
ТабДок.Автомасштаб = Истина; // Масштаб подгонится автоматически
В процессе разработки и тестирования отчета структура макета может меняться. Пользователь (или сам разработчик) мог один раз сохранить некорректные параметры печати (например, огромные поля или микроскопический масштаб), и теперь этот кэш применяется постоянно, ломая вывод новой версии отчета.
Рассмотрим, как можно полностью сбросить зависшие настройки печати:
Мы можем принудительно удалить сохраненные настройки для конкретного ключа печати прямо в кодовой базе. Для этого используется глобальный объект ХранилищеСистемныхНастроек. Разместим этот код, например, в процедуре инициализации или в специальной административной обработке:
ИмяКлюча = "Общее/НастройкиПечатиТабличногоДокумента/ПАРАМЕТРЫ_ПЕЧАТИ_МойОтчет";
ХранилищеСистемныхНастроек.Удалить(ИмяКлюча, "", ИмяПользователя());
Если конфигурация построена на базе Библиотеки Стандартных Подсистем (БСП), администратор или сам пользователь может очистить проблемные настройки без внесения изменений в конфигурацию:
Иногда код написан абсолютно верно, но поля и масштаб все равно искажаются. Это происходит из-за внешних факторов, связанных с системной средой печати:
redirected) часто некорректно передают свои физические характеристики обратно на сервер в сессию 1С. В таких сценариях рекомендуется использовать специализированные решения для проброса печати (например, TSPrint) или явно указывать сетевые пути к принтерам.
ТабДок.ИмяПринтера = "\\BuhServer\TSC_TDP-225";
ТабДок.ПолеСлева = 0;
ТабДок.ПолеСправа = 0;
ТабДок.ПолеСверху = 0;
ТабДок.ПолеСнизу = 0;
Для закрепления материала спроектируем правильный, отказоустойчивый шаблон функции формирования табличного документа. Данный код учитывает все особенности работы кэша платформы и гарантирует корректное масштабирование:
Функция СформироватьПечатнуюФорму() Экспорт
ТабДок = Новый ТабличныйДокумент;
// Получаем макет отчета
Макет = ПолучитьМакет("Макет");
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
// Выводим области в табличный документ
ТабДок.Вывести(ОбластьШапка);
ТабДок.Вывести(ОбластьСтрока);
// --- НАСТРОЙКА ПАРАМЕТРОВ СТРАНИЦЫ ---
// Шаг 1. Инициализируем ключ параметров печати.
// С этого момента платформа подгружает сохраненные пользователем настройки.
ТабДок.КлючПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_УНИКАЛЬНЫЙ_КЛЮЧ_ОТЧЕТА";
// Шаг 2. Принудительно переопределяем критически важные для макета свойства.
// Настройки ниже гарантированно сработают поверх кэша пользователя.
ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
// Устанавливаем точные поля страницы в миллиметрах
ТабДок.ПолеСлева = 5;
ТабДок.ПолеСправа = 5;
ТабДок.ПолеСверху = 10;
ТабДок.ПолеСнизу = 10;
// Настраиваем корректное масштабирование:
// Если нам нужен фиксированный масштаб (например, 90%):
ТабДок.Автомасштаб = Ложь;
ТабДок.МасштабПечати = 90;
// Если бы нам требовалось вписать документ в ширину страницы, мы бы написали:
// ТабДок.Автомасштаб = Истина; // Автомасштаб = Истина проигнорирует МасштабПечати
Возврат ТабДок;
КонецФункции
Применение этой структуры в повседневной разработке сбережет ваше время и нервы ваших пользователей, гарантируя предсказуемое и качественное отображение любых отчетов и печатных форм в системе 1С:Предприятие.