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

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

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

Рассмотрим подробно причины возникновения этой проблемы и разберем проверенные способы ее решения.

Суть проблемы и ограничения платформы 1С

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

При настройке отбора группировки для одиночных значений (вид сравнения Равно, Не равно, Больше, Меньше) интерактивный конструктор позволяет нажать кнопку смены типа (букву «Т») в правом значении и выбрать ПараметрКомпоновкиДанных. Но как только мы меняем вид сравнения на В списке, Не в списке, В группе из списка или В иерархии из списка, возможность выбрать параметр в качестве правого значения пропадает.

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

Способ 1. Условие в тексте запроса с объединением выборок

Если необходимо жестко привязать таблицы к соответствующим спискам, проанализируем возможность переноса условий непосредственно в текст запроса. В этом случае мы обходим настройки отборов группировок.

Рассмотрим вариант с использованием конструкции ОБЪЕДИНИТЬ ВСЕ в одном запросе. В запрос добавляется искусственное поле-идентификатор (например, НомерТаблицы), а условия накладываются в секции ГДЕ для каждой части выборки:


ВЫБРАТЬ
	Ссылка КАК Ссылка,
	1 КАК НомерТаблицы
ИЗ
	Справочник.Номенклатура
ГДЕ
	Ссылка В (&Параметр1)

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	Ссылка,
	2
ИЗ
	Справочник.Номенклатура
ГДЕ
	Ссылка В (&Параметр2)

Пошагово настроим структуру СКД для данного запроса:

  1. В структуре отчета создаем две группировки первого уровня (детальные записи или группировки по полям).
  2. Для первой группировки в окне отбора устанавливаем условие: НомерТаблицы Равно 1.
  3. Для второй группировки устанавливаем условие: НомерТаблицы Равно 2.

Так как вид сравнения Равно работает с простым числом, ограничение платформы не возникает, а выборки разделяются по соответствующим параметрам-спискам.

Способ 2. Использование вычисляемых полей

Разберем еще один способ, позволяющий обходным путем использовать выпадающее меню с типом сравнения Равно.

Посмотрим, как настраивается данное решение:

  1. На вкладке Вычисляемые поля схемы компоновки данных создаем новое поле, например ВходитВСписок1.
  2. В выражении вычисляемого поля или в пользовательском поле прописываем проверку вхождения элемента в параметр-список.
  3. В настройках отбора соответствующей группировки указываем отбор: ВходитВСписок1 Равно Истина.

Поскольку в отборе используется вид сравнения Равно, кнопка выбора типа «Т» работает штатно, и ограничение платформы обходится без изменения логики запроса.

Способ 3. Использование пользовательских отборов вместо параметров

Выясним, обязаны ли мы использовать именно параметры отчета. Очень часто функциональные требования позволяют заменить параметры на пользовательские отборы.

Для реализации этого варианта выполним следующие шаги:

  1. Отказываемся от создания отдельных параметров &Параметр1 и &Параметр2 в схеме компоновки данных.
  2. В структуре отчета создаем две параллельные группировки.
  3. В отборе первой группировки добавляем поле Ссылка с видом сравнения В группе из списка или В списке и выводим его в пользовательские настройки (быстрый отбор).
  4. Аналогичный отбор настраиваем для второй группировки.

Для конечного пользователя разница между заполнением параметра и установкой пользовательского отбора практически незаметна, однако этот вариант нативно поддерживается платформой без написания кода.

Способ 4. Программная передача значений параметров в отбор

Проанализируем программный способ решения задачи, который подходит для сложных отчетов с динамической настройкой.

В модуле объекта отчета в обработчике события ПриКомпоновкеРезультата мы можем считать значения параметров-списков, выбранные пользователем, и программно заполнить правые значения элементов отбора группировок:


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

КонецПроцедуры

Этот способ позволяет сохранить гибкость интерфейса и обойти визуальные ограничения конструктора СКД на этапе выполнения отчета.

← На главную