Как организовать открытие подотчета или списка документов по двойному клику в СКД

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Разберем ситуацию, когда в запросе СКД используется поле с программно сформированным представлением через конструкцию ВЫБОР. Основная сложность здесь заключается в том, что обычная строка текста не обладает свойствами ссылки, и система "не понимает", какой объект открывать. Рассмотрим, как правильно настроить расшифровку, чтобы получить данные текущей строки и выполнить необходимые действия.

Метод 1. Правильная подготовка данных в схеме СКД

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

Вместо того чтобы просто выводить строку, рекомендуется выбирать в запросе поле Документ (ссылку). Чтобы пользователь видел красивое название вместо стандартного представления, выполним следующие шаги:

  1. В схеме СКД на закладке "Наборы данных" выберем поле ссылки.
  2. В колонке "Выражение представления" укажем формулу, например: ТипЗнч(Документ) или воспользуемся тем же условием ВЫБОР..., которое было в запросе.
  3. Это позволит нам сохранить в ячейке "невидимую" ссылку для расшифровки, при этом отображая пользователю нужный текст.

Метод 2. Программная обработка расшифровки на форме

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

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

Рассмотрим пример кода для получения данных конкретной строки:


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

КонецПроцедуры

В данном примере мы используем объект ДанныеРасшифровки. Важно помнить, что в управляемых формах этот объект при формировании отчета автоматически помещается во временное хранилище, и его адрес доступен через реквизит формы ДанныеРасшифровки.

Метод 3. Получение всех значений строки для фильтрации

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

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


&НаКлиенте
Процедура ОткрытьПодотчет(СсылкаНаОбъект)
    
    ПараметрыФормы = Новый Структура;
    
    // Формируем отбор для нового отчета
    Отбор = Новый Структура;
    Отбор.Вставить("ОсновнойДокумент", СсылкаНаОбъект);
    
    // Передаем настройки в новый отчет
    ПараметрыФормы.Вставить("Отбор", Отбор);
    ПараметрыФормы.Вставить("СформироватьПриОткрытии", Истина);
    
    ОткрытьФорму("Отчет.ДетальныйАнализДокументов.Форма", ПараметрыФормы);
    
КонецПроцедуры

Метод 4. Использование вложенных схем компоновки

Существует еще один "чистый" способ реализации подотчетов без написания большого объема кода — использование механизма вложенных отчетов в СКД. Рассмотрим этот вариант подробнее.

В основной схеме компоновки данных на закладке "Настройки" в структуре отчета можно добавить новую группировку и в качестве ее типа выбрать "Вложенный отчет". При этом:

  1. Вы указываете другую схему СКД, которая будет выступать подотчетом.
  2. Настраиваете "Связи параметров", где указываете, какие поля из основной схемы должны передаваться в параметры вложенной схемы.
  3. В результате при клике на расшифровку система предложит пользователю развернуть данные в разрезе вложенного отчета.

Важные нюансы при работе с расшифровкой

Проанализируем типичные ошибки, с которыми сталкиваются разработчики:

1. Потеря данных расшифровки. Если отчет формируется программно (через ПроцессорКомпоновкиДанных), необходимо явно заполнять объект данных расшифровки и передавать его адрес в форму. В противном случае коллекция Данные.Элементы в обработчике будет пустой.

2. Использование навигационных ссылок. Если ваша цель — просто открыть форму объекта, то вместо ОбработкаРасшифровки можно использовать "Навигационную ссылку" в оформлении поля, но это менее гибкий механизм для сложных подотчетов.

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

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

← На главную