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