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

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

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

Разбор механизма слияния настроек: Настройки vs ПолучитьНастройки()

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

Проанализируем, почему так происходит. В объекте КомпоновщикНастроек существует три независимых коллекции настроек:

  1. Настройки — это «каркас» отчета, заданный разработчиком.
  2. ПользовательскиеНастройки — это именно те значения, которые пользователь видит и редактирует на форме.
  3. ФиксированныеНастройки — жесткие ограничения, которые нельзя изменить в пользовательском режиме.

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


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

Как найти и прочитать конкретный параметр

После того как мы получили «собранные» настройки, нам нужно вытащить из них значение конкретного параметра. Для этого мы используем метод НайтиЗначениеПараметра(). Выясним, как это реализовать на практике, чтобы передать значение в свой произвольный запрос.


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

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

Важный нюанс: тип СтандартныйПериод очень удобен для пользователя на форме, но обычный объект Запрос его «не понимает». Поэтому всегда проверяйте тип значения и извлекайте из него конкретные даты перед передачей в параметры запроса.

Программное формирование отчета с внешним набором данных

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


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

Передача настроек в отчет из другого места программы

Иногда требуется открыть форму отчета из документа или другого списка, заранее установив в нем определенные параметры или отборы. Посмотрим, как это сделать наиболее элегантно через параметры формы. В этом случае нам не нужно переопределять процедуру в модуле отчета — платформа сама заполнит КомпоновщикНастроек при открытии.

Для этого мы создаем структуру ФиксированныеНастройки или просто передаем структуру Отбор. Рассмотрим вариант с программным заполнением параметра «Организация»:


// Код в форме документа
НастройкиДляОтчета = Новый НастройкиКомпоновкиДанных;
ПараметрДанных = НастройкиДляОтчета.ПараметрыДанных.Элементы.Найти("Организация");

Если ПараметрДанных <> Неопределено Тогда
    ПараметрДанных.Значение = Объект.Организация;
    ПараметрДанных.Использование = Истина;
КонецЕсли;

ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ФиксированныеНастройки", НастройкиДляОтчета);
ПараметрыФормы.Вставить("СформироватьПриОткрытии", Истина);

ОткрытьФорму("Отчет.МойОтчет.Форма.Форма", ПараметрыФормы);

Важные советы по работе с СКД

Проанализируем еще несколько моментов, которые помогут избежать ошибок при программной работе:

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

← На главную