При разработке внешних печатных форм программисты часто сталкиваются с ситуацией, когда в коде явно указана ландшафтная ориентация страницы, но при выводе на экран или на печать документ все равно отображается в портретном (книжном) варианте. Рассмотрим причины этого поведения и разберем по шагам, как заставить систему слушаться программных установок.
Основная причина кроется в механизме сохранения параметров печати. В платформе 1С существует свойство КлючПараметровПечати (в старых версиях — ИмяПараметровПечати), которое отвечает за запоминание настроек, сделанных пользователем в окне печати (принтер, количество копий, поля и, главное, ориентация страницы).
Проанализируем логику работы платформы: когда вы присваиваете табличному документу определенный КлючПараметровПечати, система первым делом проверяет, нет ли в хранилище настроек уже сохраненных данных для этого ключа у текущего пользователя. Если пользователь ранее хотя бы один раз открыл эту форму и распечатал ее в портретном режиме, эти настройки сохраняются. При следующем формировании отчета сохраненные настройки пользователя имеют приоритет над установками в коде.
Выясним, как обойти этот приоритет. Самый быстрый и эффективный способ — изменить идентификатор в свойстве КлючПараметровПечати. Как только мы меняем строку ключа на новую, платформа перестает находить старые «залипшие» настройки и применяет те, что прописаны в коде.
Посмотрим на пример правильной инициализации табличного документа в функции Печать():
ТабДок = Новый ТабличныйДокумент;
// Указываем новый уникальный ключ, чтобы сбросить старый кэш
ТабДок.КлючПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_Промежуточный_V2";
// Только после этого (или вместе с этим) задаем ориентацию
ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
ТабДок.АвтоМасштаб = Истина;
Важный нюанс: если вы хотите, чтобы ландшафт применился гарантированно у всех пользователей, у которых форма уже «запомнилась» как портретная, просто добавьте символ или цифру к строковому идентификатору ключа. Например, замените "ПЕЧАТЬ_ДОКУМЕНТА" на "ПЕЧАТЬ_ДОКУМЕНТА_ЛАНДШАФТ".
Проанализируем последовательность действий в коде. Рекомендуется сначала настраивать параметры самого ТабличныйДокумент, а затем заполнять его данными. Хотя технически свойства можно установить и в конце, хорошей практикой считается инициализация параметров страницы сразу после создания объекта.
Рассмотрим структуру кода внешней печатной формы:
ТабличныйДокумент.КлючПараметровПечати.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт.АвтоМасштаб = Истина (это критично для ландшафта, чтобы широкая таблица вписалась в лист).Помимо настройки ориентации, важно обратить внимание на производительность и чистоту кода. В исходном примере автора темы использовались два раздельных запроса: один для шапки, другой для табличной части. Это не совсем оптимально. Разберем, как сделать лучше.
Профессиональнее объединить получение данных в один запрос или использовать обращение к табличной части документа с получением реквизитов шапки через точку. Также напомним, что в типовых конфигурациях лучше обращаться к данным через менеджеры временных таблиц или специализированные функции печати, но если мы пишем простой запрос, он должен выглядеть примерно так:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТЧ.НомерСтроки КАК Номер,
| ТЧ.Номенклатура.НаименованиеПолное КАК Товар,
| ТЧ.Количество,
| ТЧ.Ссылка.Номер КАК НомерДока,
| ТЧ.Ссылка.Дата КАК ДатаДока,
| ТЧ.Ссылка.СкладОтправитель.Представление КАК Поставщик
|ИЗ
| Документ.ПеремещениеТоваров.Товары КАК ТЧ
|ГДЕ
| ТЧ.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", СсылкаНаОбъект);
РезультатЗапроса = Запрос.Выполнить();
Использование одного запроса снижает нагрузку на сервер базы данных и делает код более читаемым. Обратите внимание, что реквизиты шапки (например, Номер или СкладОтправитель) доступны через поле Ссылка табличной части.
Чтобы ландшафтная форма выглядела профессионально, рекомендуем использовать дополнительные свойства объекта ТабличныйДокумент:
ТабДок.АвтоМасштаб = Истина; — позволяет системе автоматически уменьшить масштаб, если колонки не помещаются по ширине.ТабДок.ПолеСлева = 5; ТабДок.ПолеСправа = 5;.Если вы не хотите менять КлючПараметровПечати в коде, можно очистить кэш настроек конкретного пользователя вручную. Для этого в режиме «1С:Предприятие» перейдите в меню Администрирование — Обслуживание — Удаление настроек пользователей. Там можно найти настройки печати для конкретного объекта и удалить их. После этого 1С снова обратится к коду и применит ОриентацияСтраницы.Ландшафт, заданный программно.
Подводя итог: если ваша печатная форма «упрямо» открывается в книжной ориентации — проверьте КлючПараметровПечати. Смена этого ключа решает проблему в 99% случаев.