Как установить альбомную ориентацию страницы в отчете на СКД?

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

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

Способ 1. Настройка через Схему компоновки данных (без программирования)

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

Рассмотрим пошагово, как это сделать:

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

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

Способ 2. Программная установка в модуле объекта (ПриКомпоновкеРезультата)

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

Выясним важный нюанс: если мы просто напишем установку свойств для ДокументРезультат, но оставим параметр СтандартнаяОбработка = Истина, платформа может переинициализировать табличный документ после завершения процедуры, и наши настройки «слетят».

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


Процедура ПриКомпоновкеРезультата(ДанныеРасшифровки, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    
    // Сформируем макет компоновки
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.ПолучитьНастройки(), ДанныеРасшифровки);
    
    // Инициализируем процессор компоновки
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);
    
    // Очистим и подготовим табличный документ
    ДокументРезультат.Очистить();
    
    // Выводим результат в табличный документ
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);
    
    // Важно: настройки страницы устанавливаем ПОСЛЕ вывода данных
    ДокументРезультат.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
    ДокументРезультат.АвтоМасштаб = Истина;
    
КонецПроцедуры

В данном примере мы берем управление процессом на себя. Обратите внимание, что обращение к свойствам ОриентацияСтраницы происходит в самом конце. Это гарантирует, что никакие внутренние механизмы СКД не перезапишут эти значения при наполнении ячеек.

Способ 3. Установка через модуль формы отчета

Если отчет используется в конфигурации на базе БСП (Библиотеки стандартных подсистем), управление выводом часто берет на себя общая форма отчета. В таких случаях изменения в модуле объекта могут игнорироваться подсистемой «Варианты отчетов».

Посмотрим, как можно решить задачу через форму:

  1. Создадим форму отчета (если она еще не создана).
  2. Найдем событие, которое вызывается после формирования отчета. В управляемых формах это может быть процедура, вызываемая после команды Сформировать.
  3. Обратимся к реквизиту формы, который связан с табличным документом (обычно он называется Результат).

Пример кода в модуле формы:


&НаСервере
Процедура УстановитьПараметрыПечатиНаСервере()
    // Результат - это стандартный реквизит формы типа ТабличныйДокумент
    Результат.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
    Результат.АвтоМасштаб = Истина;
КонецПроцедуры

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

Почему настройки могут не срабатывать? Разберем причины

Проанализируем основные ситуации, когда код написан, но результат остается «книжным»:

  1. Влияние настроек пользователя. 1С запоминает последние параметры печати для каждого конкретного отчета и пользователя. Если пользователь хотя бы раз вручную зашел в «Файл — Параметры страницы» и сохранил их, платформа будет подставлять именно эти настройки, игнорируя программные установки в коде. Решение: проверить настройки через меню «Таблица — Настройки печати» или программно очистить настройки пользователя.
  2. Подсистема «Варианты отчетов» БСП. В современных конфигурациях (ERP, УТ 11, БП 3.0) отчеты открываются в типовой форме. Эта форма сама управляет выводом и может перезаписывать свойства табличного документа своими значениями, хранящимися в хранилище настроек данных форм.
  3. СтандартнаяОбработка. Как уже было отмечено выше, если в процедуре ПриКомпоновкеРезультата не установить СтандартнаяОбработка = Ложь, ваши манипуляции с ДокументРезультат могут быть аннулированы последующей стандартной процедурой вывода, которую выполнит платформа.

Использование расширений для типовых отчетов

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

Проанализируем пример расширения для модуля объекта отчета:


&После("ПриКомпоновкеРезультата")
Процедура Расш_ПриКомпоновкеРезультата(ДанныеРасшифровки, СтандартнаяОбработка)
    // Данный код выполнится после того, как отчет сформирован стандартно
    ДокументРезультат.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
    ДокументРезультат.АвтоМасштаб = Истина;
КонецПроцедуры

Однако помните, что аннотация &После сработает только в том случае, если СтандартнаяОбработка не была установлена в Ложь в основном коде. Если же типовой отчет формируется полностью вручную, вам придется искать место в коде, где заполняется табличный документ, и внедряться туда.

В заключение отметим, что наиболее стабильным и «чистым» решением является установка параметров через Прочие настройки в схеме СКД. Это минимизирует конфликты с БСП и платформенными механизмами формирования отчетов.

← На главную