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