Как программно установить значение параметра в отчете на СКД?

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

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

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

Почему параметр не устанавливается?

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

Проанализируем структуру объекта КомпоновщикНастроек. Он управляет всеми настройками отчета и имеет две важные коллекции:

  1. КомпоновщикНастроек.Настройки — дерево настроек, сформированное разработчиком.
  2. КомпоновщикНастроек.ПользовательскиеНастройки — список настроек, доступных для редактирования пользователем.

Разберем два варианта решения задачи.

Вариант 1. Установка параметра, если он НЕ выведен пользователю

Если параметр является "техническим" и скрыт от пользователя (галочка "Включать в пользовательские настройки" снята), то достаточно обратиться к коллекции ПараметрыДанных в основных настройках.

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


// Устанавливаем значение параметра "Период"
КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("Период", Новый СтандартныйПериод(НачалоДня(ТекущаяДата()), КонецДня(ТекущаяДата())));

Этот метод УстановитьЗначениеПараметра находит параметр по имени, присваивает ему значение и автоматически устанавливает признак использования.

Вариант 2. Правильная установка пользовательских параметров

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

Давайте составим алгоритм действий:

  1. Находим параметр в основных настройках по имени.
  2. Получаем его ИдентификаторПользовательскойНастройки.
  3. Используя этот идентификатор, ищем элемент в коллекции ПользовательскиеНастройки.
  4. Если элемент найден, устанавливаем ему Значение и Использование.

Реализуем этот алгоритм в коде. Рассмотрим универсальную функцию или процедуру, которую можно использовать в модуле формы или объекта:


// Определяем имя параметра, который хотим установить
ИмяПараметра = "ДатаОтчета";
НужноеЗначение = ТекущаяДата();

// 1. Ищем параметр в основных настройках, чтобы получить его ID
ПараметрВНастройках = КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных(ИмяПараметра));

Если ПараметрВНастройках <> Неопределено Тогда
    
    // Всегда полезно установить значение и в основных настройках тоже
    ПараметрВНастройках.Значение = НужноеЗначение;
    ПараметрВНастройках.Использование = Истина;
    
    // 2. Проверяем, связан ли параметр с пользовательскими настройками
    Если ЗначениеЗаполнено(ПараметрВНастройках.ИдентификаторПользовательскойНастройки) Тогда
        
        // 3. Ищем элемент в пользовательских настройках по ID
        ЭлементПользНастроек = КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти(ПараметрВНастройках.ИдентификаторПользовательскойНастройки);
        
        // 4. Если нашли - устанавливаем значение и там
        Если ЭлементПользНастроек <> Неопределено Тогда
            ЭлементПользНастроек.Значение = НужноеЗначение;
            ЭлементПользНастроек.Использование = Истина;
        КонецЕсли;
        
    КонецЕсли;
    
КонецЕсли;

Обратите внимание на использование объекта ПараметрКомпоновкиДанных при поиске. Это обязательно, так как метод поиска ожидает именно этот тип, а не строку.

Важные нюансы

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

Если вы работаете с расширением формы отчета, этот код обычно помещают в обработчик ПриСозданииНаСервере или перед вызовом метода СкомпоноватьРезультат, если вы формируете табличный документ полностью вручную.

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

← На главную