Почему не работают параметры страницы при печати отчета в 1С и как это исправить?

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей IT и автоматизация бизнеса
← На главную

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

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

Причина 1. Скрытый конфликт свойств масштабирования

Первое, на что следует обратить внимание, — это логическое противоречие в кодовой логике настройки табличного документа. Разработчики часто пытаются использовать свойства Автомасштаб и МасштабПечати одновременно в надежде, что программа «сама разберется». Это критическая ошибка.

Проанализируем, как эти свойства ведут себя на уровне платформы:

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

Посмотрим на пример правильной настройки масштабирования:


// Настройка фиксированного масштаба документа
ТабДок.Автомасштаб = Ложь;
ТабДок.МасштабПечати = 80; // Теперь масштаб 80% гарантированно применится

Причина 2. Опасный порядок инициализации Ключа параметров печати

Самая распространенная и неочевидная ошибка программистов связана со свойствами КлючПараметровПечати (в новых версиях платформы) или ИмяПараметровПечати (в устаревших редакциях). Эти свойства отвечают за сохранение индивидуальных настроек печати (выбранный принтер, поля, масштаб) для каждого пользователя в системной базе данных.

Давайте разберем по шагам, что происходит в момент выполнения кода, написанного в неверном порядке:


// НЕПРАВИЛЬНЫЙ ВАРИАНТ
ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
ТабДок.ПолеСлева = 5;
ТабДок.КлючПараметровПечати = "Параметры_МойОтчет"; 

При таком подходе происходит следующее:

  1. Программа устанавливает ландшафтную ориентацию и левое поле в 5 мм.
  2. Платформа доходит до строки инициализации свойства КлючПараметровПечати.
  3. В этот же миг 1С обращается к внутреннему хранилищу системных настроек текущего пользователя.
  4. Если пользователь ранее уже открывал этот отчет и как-то изменял параметры печати (или даже просто нажимал «ОК» в диалоге печати), платформа считывает старые настройки и полностью перезаписывает ими все свойства табличного документа, которые были установлены строками выше. Ваши программные настройки затираются старым кэшем.

Для решения этой проблемы мы должны четко разделить логику работы программы на два возможных сценария: установка значений «по умолчанию» и «принудительная жесткая» установка.

Сценарий А: Установка настроек по умолчанию (с приоритетом выбора пользователя)

Если мы хотим предложить пользователю оптимальные настройки (например, ландшафт и минимальные поля), но сохранить за ним право один раз настроить печатную форму под себя (чтобы при следующих открытиях применялся именно его выбор), код должен выглядеть так:


// Сначала настраиваем дефолтные параметры страницы
ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
ТабДок.ПолеСлева = 10;
ТабДок.ПолеСправа = 10;

// И только в самом конце привязываем ключ параметров печати
// Если у пользователя есть сохраненный кэш, он перекроет дефолты
ТабДок.КлючПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_МойУникальныйОтчет";

Сценарий Б: Жесткая программная установка параметров страницы

В случае, когда макет отчета технологически сложный и должен выводиться строго с определенными полями и масштабом (например, регламентированная отчетность или специализированные этикетки), мы обязаны проигнорировать прошлые манипуляции пользователя. Для этого свойства нужно устанавливать строго ПОСЛЕ инициализации ключа параметров печати:


// Сначала привязываем ключ и загружаем сохраненные настройки пользователя
ТабДок.КлючПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_МойСложныйОтчет";

// Теперь принудительно поверх пользовательских настроек накладываем жесткие правила
ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;
ТабДок.ПолеСлева = 0;
ТабДок.ПолеСправа = 0;
ТабДок.ПолеСверху = 5;
ТабДок.ПолеСнизу = 5;
ТабДок.Автомасштаб = Истина; // Масштаб подгонится автоматически

Причина 3. Сбои кэша и «зависшие» старые настройки

В процессе разработки и тестирования отчета структура макета может меняться. Пользователь (или сам разработчик) мог один раз сохранить некорректные параметры печати (например, огромные поля или микроскопический масштаб), и теперь этот кэш применяется постоянно, ломая вывод новой версии отчета.

Рассмотрим, как можно полностью сбросить зависшие настройки печати:

Способ 1. Программная точечная очистка настроек

Мы можем принудительно удалить сохраненные настройки для конкретного ключа печати прямо в кодовой базе. Для этого используется глобальный объект ХранилищеСистемныхНастроек. Разместим этот код, например, в процедуре инициализации или в специальной административной обработке:


ИмяКлюча = "Общее/НастройкиПечатиТабличногоДокумента/ПАРАМЕТРЫ_ПЕЧАТИ_МойОтчет";
ХранилищеСистемныхНастроек.Удалить(ИмяКлюча, "", ИмяПользователя());

Способ 2. Очистка настроек через интерфейс программы

Если конфигурация построена на базе Библиотеки Стандартных Подсистем (БСП), администратор или сам пользователь может очистить проблемные настройки без внесения изменений в конфигурацию:

  1. Перейдем в раздел Администрирование (или НСИ и администрирование).
  2. Откроем пункт Настройки пользователей и прав, далее перейдем по ссылке Персональные настройки пользователей.
  3. Выберем нужного пользователя и нажмем кнопку Настройки.
  4. На вкладке Прочие настройки развернем дерево настроек и найдем ветку Настройки печати табличных документов.
  5. Найдем в списке имя нашего отчета или обработки, выделим его и нажмем кнопку Очистить.

Причина 4. Влияние операционной системы и драйверов принтеров

Иногда код написан абсолютно верно, но поля и масштаб все равно искажаются. Это происходит из-за внешних факторов, связанных с системной средой печати:


ТабДок.ИмяПринтера = "\\BuhServer\TSC_TDP-225";
ТабДок.ПолеСлева = 0;
ТабДок.ПолеСправа = 0;
ТабДок.ПолеСверху = 0;
ТабДок.ПолеСнизу = 0;

Универсальный шаблон формирования печатной формы

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


Функция СформироватьПечатнуюФорму() Экспорт

    ТабДок = Новый ТабличныйДокумент;
    
    // Получаем макет отчета
    Макет = ПолучитьМакет("Макет");
    ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
    ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
    
    // Выводим области в табличный документ
    ТабДок.Вывести(ОбластьШапка);
    ТабДок.Вывести(ОбластьСтрока);
    
    // --- НАСТРОЙКА ПАРАМЕТРОВ СТРАНИЦЫ ---
    
    // Шаг 1. Инициализируем ключ параметров печати.
    // С этого момента платформа подгружает сохраненные пользователем настройки.
    ТабДок.КлючПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_УНИКАЛЬНЫЙ_КЛЮЧ_ОТЧЕТА";
    
    // Шаг 2. Принудительно переопределяем критически важные для макета свойства.
    // Настройки ниже гарантированно сработают поверх кэша пользователя.
    ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
    
    // Устанавливаем точные поля страницы в миллиметрах
    ТабДок.ПолеСлева = 5;
    ТабДок.ПолеСправа = 5;
    ТабДок.ПолеСверху = 10;
    ТабДок.ПолеСнизу = 10;
    
    // Настраиваем корректное масштабирование:
    // Если нам нужен фиксированный масштаб (например, 90%):
    ТабДок.Автомасштаб = Ложь;
    ТабДок.МасштабПечати = 90;
    
    // Если бы нам требовалось вписать документ в ширину страницы, мы бы написали:
    // ТабДок.Автомасштаб = Истина; // Автомасштаб = Истина проигнорирует МасштабПечати
    
    Возврат ТабДок;

КонецФункции

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

← На главную