Почему не работает программная установка ландшафтной ориентации страницы в 1С и как это исправить?

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

Каждый разработчик 1С рано или поздно сталкивается с задачей настройки печатных форм. Казалось бы, что может быть проще: если табличный документ не помещается по ширине на стандартный лист формата А4, достаточно программно развернуть его в альбомный формат. Однако на практике стандартная строка кода ТабДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт; часто игнорируется системой, и документ все равно выводится в портретной (книжной) ориентации.

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

Выясняем причину: конфликт ОриентацияСтраницы и ИмяПараметровПечати

Главный виновник того, что программно заданная ориентация «слетает» при выводе на печать или экран — это свойство табличного документа ИмяПараметровПечати (в управляемых формах на современных версиях платформы оно называется КлючПараметровПечати).

Давайте проанализируем ситуацию и разберем внутренний алгоритм работы платформы «1С:Предприятие»:

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

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


ТабДокумент = Новый ТабличныйДокумент;

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

// Присвоение имени параметров печати
Если Тип = "ЗаказПоДаннымПоставщика" Тогда
    ТабДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_ЗаказПоставщику_СчетЗаказПоДаннымПоставщика";
Иначе
    ТабДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_ЗаказПоставщику_СчетЗаказ";
КонецЕсли;

Так как пользователи ранее уже печатали этот документ в портретном режиме под указанными ключами параметров печати, платформа игнорировала строчку с ландшафтом и возвращала книжный вид.


Вариант 1. Сброс кэша параметров печати (Рекомендуемый способ)

Если ваша задача — сделать так, чтобы у всех пользователей при первом открытии печатной формы применился ландшафтный режим, но при этом у них осталась возможность в будущем самостоятельно менять настройки страницы, то лучшим решением будет изменение ключа параметров печати.

Рассмотрим подробнее, как это реализовать. Нам нужно изменить строковое значение, присваиваемое свойству ИмяПараметровПечати (или КлючПараметровПечати), добавив к нему уникальный постфикс, например, _Ландшафт или _v2. Платформа не найдет старых пользовательских настроек для нового ключа и применит настройки из кода по умолчанию.

Посмотрим на пример скорректированного кода:


ТабДокумент = Новый ТабличныйДокумент;

// Задаем ландшафтную ориентацию
ТабДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;

// Включаем авто-масштабирование по ширине листа (очень полезно для широких документов)
ТабДокумент.АвтоМасштаб = Истина;

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

После этого изменения при формировании печатной формы у всех пользователей гарантированно откроется альбомный вариант.


Вариант 2. Принудительный ландшафт (Без возможности изменения пользователем)

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

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

Проанализируем пример кода для жесткой фиксации параметров:


ТабДокумент = Новый ТабличныйДокумент;

// Принудительно отключаем привязку к сохраненным параметрам печати
ТабДокумент.ИмяПараметровПечати = ""; 

// Устанавливаем свойства отображения страницы
ТабДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
ТабДокумент.АвтоМасштаб = Истина;

При таком подходе при каждом открытии печатной формы документ всегда будет ландшафтным.


Вариант 3. Анализ общих модулей и механизмов печати (на примере УТ 10.3)

В старых конфигурациях, таких как «Управление торговлей 10.3», «Управление производственным предприятием 1.3» или «Комплексная автоматизация 1.1», вывод печатных форм на экран осуществляется через централизованную процедуру УниверсальныеМеханизмы.НапечататьДокумент.

Если вы установили ориентацию внутри своей функции печати, но документ все равно выводится некорректно, обязательно нужно отследить стек вызовов в отладчике. Проблема может заключаться в том, что в общем модуле УниверсальныеМеханизмы переданный табличный документ обрабатывается повторно, инициализируя настройки заново.

Разберем по шагам, как локализовать проблему в общем модуле:

  1. Откройте процедуру Печать в модуле вашего документа.
  2. Найдите строку вызова общего модуля:
    
    УниверсальныеМеханизмы.НапечататьДокумент(ТабДокумент, КоличествоЭкземпляров, НаПринтер, ...);
    
  3. Установите точку останова (F9) на этой строке и войдите внутрь процедуры (F11).
  4. Посмотрите, не переопределяются ли свойства ОриентацияСтраницы и ИмяПараметровПечати внутри механизмов печати общего модуля. Если там происходит пересоздание или очистка табличного документа, пропишите установку ландшафта непосредственно перед выводом формы на экран в общей форме печати.

Особенности настройки в современных конфигурациях (на базе БСП)

Если вы работаете в современных конфигурациях 1С (УТ 11, ERP 2, Бухгалтерия предприятия 3) на базе БСП (Библиотеки стандартных подсистем), то механизмы работы немного отличаются:

При работе с БСП для установки ландшафта по умолчанию рекомендуется использовать следующий шаблон кода:


ТабличныйДокумент = Новый ТабличныйДокумент;
ТабличныйДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
ТабличныйДокумент.АвтоМасштаб = Истина;

// Задаем современный КлючПараметровПечати для управления кэшем
ТабличныйДокумент.КлючПараметровПечати = "КЛЮЧ_ПЕЧАТИ_МОЯ_ПЕЧАТНАЯ_ФОРМА_v2";

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

← На главную