Отчет на СКД: как программно установить предопределенные параметры?

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

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

Метод 1. Использование выражений в схеме СКД (без программирования)

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

Перейдем на закладку «Параметры» в СКД. В колонке «Выражение» мы можем использовать функции для получения ссылок. Например, если нам нужно установить конкретный счет, которого нет в предопределенных данных, мы прописываем:

ПланыСчетов.Хозрасчетный.НайтиПоКоду("60.01")

Если же нам нужно получить вид субконто, используем конструкцию:

ПредопределенноеЗначение("ПланВидовХарактеристик.ВидыСубконтоХозрасчетные.СтатьиЗатрат")

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

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

Проанализируем ситуацию, когда нам нужно установить параметры непосредственно перед тем, как СКД начнет обрабатывать данные. Самое подходящее место для этого — процедура ПриКомпоновкеРезультата в модуле объекта отчета. Этот метод работает автоматически при нажатии пользователем кнопки «Сформировать».

Разберем пример кода, который позволяет установить значения параметров:


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

КонецПроцедуры

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

Метод 3. Работа с пользовательскими настройками (для БП 3.0 и других современных конфигураций)

Часто разработчики сталкиваются с проблемой: код в ПриКомпоновкеРезультата написан правильно, но в отчете все равно пусто или параметры не меняются. Это происходит потому, что параметры вынесены в Пользовательские настройки. В СКД пользовательские настройки имеют приоритет над основными.

Чтобы гарантированно установить значение, нам нужно найти параметр в коллекции ПользовательскиеНастройки. Рассмотрим, как это сделать правильно:


Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)

    ПараметрОбъект = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("Организация");
    Идентификатор = ПараметрОбъект.ИдентификаторПользовательскойНастройки;
    
    // Ищем этот параметр в пользовательских настройках
    ЭлементПользовательскойНастройки = КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти(Идентификатор);
    
    Если ЭлементПользовательскойНастройки <> Неопределено Тогда
        ЭлементПользовательскойНастройки.Значение = Справочники.Организации.ПустаяСсылка();
        ЭлементПользовательскойНастройки.Использование = Истина;
    КонецЕсли;

КонецПроцедуры

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

Метод 4. Полный программный вывод отчета (Управляемые формы)

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

  1. Получаем схему из макета отчета.
  2. Инициализируем компоновщик настроек.
  3. Устанавливаем значения параметров в настройках.
  4. Создаем макет компоновки с помощью процессора компоновки.
  5. Выводим результат в табличный документ.

Рассмотрим пример кода:


&НаСервере
Процедура СформироватьОтчетНаСервере(ТабДок)
    
    // 1. Получаем объект отчета и схему
    ОтчетОбъект = РеквизитФормыВЗначение("Объект");
    СхемаКД = ОтчетОбъект.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
    
    // 2. Берем настройки по умолчанию или текущие настройки компоновщика
    Настройки = ОтчетОбъект.КомпоновщикНастроек.ПолучитьНастройки();
    
    // 3. Устанавливаем параметры
    ЗначениеПараметра = Настройки.ПараметрыДанных.Элементы.Найти("Период");
    Если ЗначениеПараметра <> Неопределено Тогда
        ЗначениеПараметра.Значение = Новый СтандартныйПериод(НачалоМесяца(ТекущаяДата()), КонецМесяца(ТекущаяДата()));
        ЗначениеПараметра.Использование = Истина;
    КонецЕсли;
    
    // 4. Подготавливаем макет компоновки
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКД, Настройки);
    
    // 5. Процессор компоновки данных
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
    
    // 6. Вывод результата
    ТабДок.Очистить();
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ТабДок);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);
    
КонецПроцедуры

Тонкости и рекомендации

При программной работе с СКД важно помнить о нескольких технических моментах, которые могут повлиять на результат:

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

Таким образом, мы проанализировали основные способы управления параметрами СКД. Выбор конкретного метода зависит от архитектуры вашего решения и того, насколько гибким должен оставаться отчет для конечного пользователя.

← На главную