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