Расшифровка одного отчета на СКД с помощью другого

Довольно часто возникает необходимость расшифровать некоторые показатели одного отчета, написанного на СКД, с помощью другого отчета. Фактически это означает, что при попытке пользователя расшифровать какой-то показатель, нужно открыть второй отчет с уже заданными отборами и параметрами и автоматически его сформировать. Отборы, как правило, должны соответствовать значениям колонок из расшифровываемой строки отчета. Типовой механизм расшифровки этого не сделает, поэтому нам нужно его изменить. Для этого нужно выполнить следующие действия:

Создание формы отчета

Нужно создать форму расшифровываемого отчета, в которой мы потом пропишем процедуру-обработчик расшифровки. Если отчет делается для одной из типовых конфигураций, то в отчет можно скопировать Общую форму ФормаОтчета. При этом форму настроек отчета можно оставить общую.

Расшифровка одного отчета на СКД с помощью другого

Создание процедуры-обработчика расшифровки

На форме отчета должен быть создан реквизит с типом ТабличныйДокумент и соответствующий ему элемент управления. На типовой форме отчета этот реквизит и элемент управления называется ОтчетТабличныйДокумент. У элемента управления есть обработчик события ОбработкаРасшифровки. Необходимо создать процедуру на клиенте для этого обработчика (если используете типовую форму отчета, то процедура там уже есть, нужно ее модифицировать).

Содержимое процедуры следующее:

В первую очередь отключаем стандартный механизм обработки расшифровки. Затем создаем структуру со значениями отбора, которая будет передана во второй отчет. Важно, чтобы имена ключей этой структуры совпадали с именами полей и параметров второго отчета. После этого заполняем значения этой структуры с помощью серверной процедуры ПолучитьРасшифровкуНаСервере, которую мы рассмотрим позже. Далее, создаем еще одну структуру с ПараметрыФормыРасшифровки, которая будет определять поведение формы второго отчета при ее открытии. И открываем форму второго отчета, передав в нее необходимые параметры.

Рассмотрим подробнее структуру ПараметрыФормыРасшифровки:

  • Ключ СформироватьПриОткрытии отвечает за автоматическое формирование отчета. Пользователю не придется нажимать кнопку Сформировать.
  • Ключ Отбор содержит значения отбора и параметров открываемого отчета, которые мы определили ранее.
  • Ключ КлючВарианта должен содержать имя варианта второго отчета. Важно, чтобы этот вариант не содержал параметров, которые должен ввести пользователь, иначе отчет не сформируется автоматически. Все значения отбора и параметры должны быть переданы в ключе Отбор.

Получение значений расшифровки на сервере

Конкретные значения полей для расшифровки нужно получать на сервере. Для этого вызывается процедура ПолучитьРасшифровкуНаСервере, в которую передается структура с именами полей, значения которых нужно получить, и переменная Расшифровка  из клиентской процедуры обработки расшифровки. Переменная Расшифровка содержит индекс расшифровываемого поля.

Сначала получаем данные расшифровки из временного хранилища. Переменная ОтчетДанныеРасшифровки  — это реквизит формы с типом Строка (неограниченная). Если такого реквизита на форме нет, его нужно создать.

После этого в цикле обходим все поля до того, по которому пользователь запустил расшифровку. В данном случае сделано предположение, что расшифровываемое поле — самое правое в отчете. Если это не так, то код можно изменить соответствующим образом. Например, чтобы получить общее количество всех полей расшифровки, можно использовать функцию ДанныеОтчета.Элементы.Количество(); и запустить цикл по всем полям.

На каждой итерации цикла проверяем, является ли поле именно полем, а не, например, группировкой. Если является, получаем имя этого поля, ищем такое поле в структуре ЗначенияОтбора. Если такое поле есть, то записываем в структуру значение этого поля.

Таким образом, мы получили структуру, содержащую интересующие нас значения отбора, которые мы передадим во второй отчет при открытии формы.

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *