Как программно установить параметры СКД при выводе в таблицу значений с учетом отборов на форме?

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

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

Разбор архитектуры решения

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

Проанализируем основные этапы процесса:

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

Инициализация компоновщика и установка параметров

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


// 1. Получаем саму схему
СхемаКД = РеквизитФормыВЗначение("Объект").ПолучитьМакет("СКД");

// 2. Инициализируем компоновщик настроек
КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных;
ИсточникНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКД);
КомпоновщикНастроек.Инициализировать(ИсточникНастроек);

// Загружаем настройки по умолчанию из схемы
КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКД.НастройкиПоУмолчанию);

Теперь, когда компоновщик "видит" параметры схемы, мы можем программно установить их значения. Рассмотрим, как это сделать правильно, обращаясь к коллекции ПараметрыДанных:


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

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

Объединение с пользовательскими отборами

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

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


// Получаем полные настройки с учетом правок пользователя на форме
ИтоговыеНастройки = КомпоновщикНастроек.ПолучитьНастройки();

Компоновка и вывод в Таблицу Значений

Теперь рассмотрим завершающий этап — генерацию макета компоновки и вывод данных в ТаблицаЗначений. Обратите внимание на использование типа ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений. Это критически важно, так как обычный генератор готовит макет для табличного документа (с группировками, цветами и т.д.), а нам нужны "сырые" данные для таблицы.


// Создаем компоновщик макета
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;

// Выполняем компоновку. 
// Вторым параметром передаем ИтоговыеНастройки, которые мы подготовили выше
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКД, ИтоговыеНастройки, , , 
    Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));

// Инициализируем процессор компоновки
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);

// Выводим результат в Таблицу Значений
ТоварыТаблица = Новый ТаблицаЗначений;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ПроцессорВывода.УстановитьОбъект(ТоварыТаблица);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);

// Теперь переменная ТоварыТаблица содержит результат запроса СКД

Важные нюансы и советы

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

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

← На главную