Как программно задать параметры в отчете СКД на управляемых формах 1С?

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

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

Разберем основы: Компоновщик настроек

Для начала проанализируем, где именно хранятся параметры в 1С. Основным объектом для работы с настройками отчета является КомпоновщикНастроек (иногда требуется использовать Две разных схемы в отчете СКД). У него есть два ключевых свойства, которые мы будем использовать:

  1. Настройки (Settings): Это основные настройки схемы, которые заданы в конфигураторе.
  2. ПользовательскиеНастройки (UserSettings): Это те настройки, которые пользователь видит и может изменять непосредственно на форме отчета (например, даты периода в шапке).

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

Способ 1: Установка параметров в модуле отчета

Наиболее правильным местом для программного вмешательства в процесс формирования отчета является процедура ПриКомпоновкеРезультата в модуле объекта отчета (как в публикации Простой пример отчета СКД с выводом другого внешнего отчета в один табличный документ на УФ). Рассмотрим пример, когда нам нужно программно заполнить параметр на основании другого параметра или внешних данных.

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


Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    
    // 1. Создаем идентификатор параметра, как он назван в схеме СКД
    ПараметрСКД = Новый ПараметрКомпоновкиДанных("МассивГрупп");
    
    // 2. Получаем данные для установки (например, из функции)
    ЗначениеПараметра = ПолучитьМассивГруппДляФильтра();
    
    // 3. Устанавливаем значение через метод компоновщика
    КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра(ПараметрСКД, ЗначениеПараметра);
    
КонецПроцедуры

Метод УстановитьЗначениеПараметра хорош тем, что он автоматически устанавливает флаг Использование в значение Истина, избавляя нас от лишних строк кода.

Способ 2: Установка параметров в форме отчета

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

Рассмотрим подробнее сценарий в обработчике ПриСозданииНаСервере. Допустим, нам нужно установить «Дату начала» на 60 дней меньше текущей даты, а «Дату окончания» — равной текущему моменту.


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Получаем текущую дату
    ТекущийМомент = ТекущаяДата();
    
    // Находим параметры в компоновщике настроек
    ПараметрНачало = КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ДатаНачала"));
    ПараметрКонец  = КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ДатаОкончания"));
    
    Если ПараметрНачало <> Неопределено Тогда
        ПараметрНачало.Значение = ТекущийМомент - (60 * 60 * 24 * 60); // минус 60 дней
        ПараметрНачало.Использование = Истина;
    КонецЕсли;
    
    Если ПараметрКонец <> Неопределено Тогда
        ПараметрКонец.Значение = ТекущийМомент;
        ПараметрКонец.Использование = Истина;
    КонецЕсли;
    
КонецПроцедуры

Работа с пользовательскими настройками

Проанализируем ситуацию: что делать, если параметр выведен на форму и пользователь должен видеть изменения? В управляемых формах для этого нужно найти элемент в ПользовательскиеНастройки. Мы можем использовать вспомогательную функцию для поиска элемента по его идентификатору из основных настроек.


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

Альтернатива: Использование выражений в СКД

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

  1. Откройте вкладку Параметры в схеме компоновки данных.
  2. Выберите нужный параметр (например, ДатаНачала).
  3. В колонке Выражение напишите формулу. Например: ДобавитьКДате(ТекущаяДата(), "День", -60).
  4. Если один параметр зависит от другого, убедитесь, что они стоят в правильном порядке. Однако помните, что прямая ссылка на другой параметр (например, &Дата1) в выражении &Дата2 работает не всегда стабильно. Лучше использовать функции типа ТекущаяДата() или вызовы Общих модулей.

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

Использование фиксированных настроек

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

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

Итоги

Мы рассмотрели различные подходы к программному управлению параметрами. Подведем итог:

Совместное использование этих техник позволит вам создавать гибкие и удобные отчеты любой сложности — для отладки и тестирования схем компоновки пригодится инструменты разработчика для отладки СКД.

← На главную