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