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