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