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