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