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