К статье
Практический материал

Отчеты и Аналитика · 13 мин

Как сделать расшифровку в отчете на СКД в 1С

Как сделать расшифровку в отчете на СКД в 1С: настройка полей расшифровки, обработчиков, передача параметров, типичные ошибки и проверка результата.

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

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

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

Как устроен механизм расшифровки в СКД

При формировании отчета компоновщик макета может одновременно построить вторую структуру — данные расшифровки. Это иерархия элементов, где каждой группировке и ресурсу соответствует узел со значениями полей: например, для ячейки «Продажи по контрагенту» в расшифровке хранятся значения «Контрагент», «Период» и набор связанных полей.

Когда пользователь дважды кликает по ячейке табличного документа, платформа находит элемент расшифровки по ключу (свойство «Расшифровка» области табличного документа) и предлагает стандартные действия: открыть значение, расшифровать по полю, отфильтровать, оформить. Если отчет формируется программно без данных расшифровки, этого меню не будет — это самая частая причина «неработающей» расшифровки.

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

Включение расшифровки при программном формировании отчета

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

bsl
Схема = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
Настройки = Схема.НастройкиПоУмолчанию;

КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
Макет = КомпоновщикМакета.Выполнить(Схема, Настройки, ДанныеРасшифровки);

ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(Макет, , ДанныеРасшифровки);

Результат = Новый ТабличныйДокумент;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(Результат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);

Ключевой момент — переменная ДанныеРасшифровки должна быть объявлена заранее (обычно как реквизит формы с типом ДанныеРасшифровкиКомпоновкиДанных) и передаваться и в Выполнить компоновщика макета, и в Инициализировать процессора. Если передать её только в одно место, ячейки либо не получат ключи расшифровки, либо ключи не найдут данных.

Для отчетов, построенных на основе типовой формы отчета (ФормаОтчета с автоматической генерацией), платформа делает это сама — там расшифровка включена по умолчанию. Проблемы возникают именно в самописных формах и программных сценариях.

Настройка полей расшифровки в схеме компоновки

Что именно увидит пользователь в меню расшифровки, определяется настройками схемы. На закладке «Наборы данных» и «Настройки» важны выбранные поля: каждое поле, включенное в выборку группировки или доступное как ресурс, может участвовать в расшифровке. Чтобы пользователь мог открыть документ-регистратор, поле «Ссылка» (или «Регистратор») должно быть добавлено в поля соответствующей группировки.

Для управления составом расшифровки у полей есть свойство, доступное в настройках поля группировки: можно указать, какие поля будут предлагаться при расшифровке конкретной группировки. Это удобно, когда в наборе данных много служебных полей, которые не должны «засорять» меню пользователя.

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

Порядок действий
  1. 1
    Откройте схему компоновки данных отчета и в запросе набора данных добавьте поля, нужные для расшифровки (ссылки на документы, контрагентов, периоды).
  2. 2
    На закладке «Настройки» включите нужные поля в выбранные поля соответствующих группировок.
  3. 3
    Убедитесь, что при формировании отчета создаются данные расшифровки (для типовой формы — автоматически, для своей — через параметр ДанныеРасшифровки).
  4. 4
    Сформируйте отчет и дважды кликните по ячейке с ресурсом: должно появиться меню «Расшифровать» со списком полей и действием «Открыть».
  5. 5
    Если меню не появилось — проверьте, что ячейка содержит ключ расшифровки и что реквизит данных расшифровки не очищается между вызовами.

Собственный обработчик расшифровки

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

Логика обработчика обычно такая: по ключу расшифровки извлекается элемент из объекта ДанныеРасшифровки, из него читаются значения полей через ПолучитьПоля(). Затем эти значения подставляются в отборы открываемого отчета или используются для открытия объекта. Обязательно установите параметр СтандартнаяОбработка = Ложь, иначе после вашего кода платформа покажет ещё и своё меню.

bsl
&НаКлиенте
Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка, ДополнительныеПараметры)
    СтандартнаяОбработка = Ложь;
    Поля = ПолучитьПоляРасшифровки(Расшифровка);
    Если Поля.Свойство("Регистратор") Тогда
        ПоказатьЗначение(, Поля.Регистратор);
    КонецЕсли;
КонецПроцедуры

&НаСервере
Функция ПолучитьПоляРасшифровки(КлючРасшифровки)
    Элемент = ДанныеРасшифровки.Элементы.Получить(КлючРасшифровки);
    Возврат Элемент.ПолучитьПоля();
КонецФункции

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

Обработчик расшифровки удобно делать универсальным: вместо жесткой привязки к именам полей перебирайте ПолучитьПоля() и ищите первое поле-ссылку. Тогда обработчик не сломается, если в схему добавят новую группировку.
ПЗ
Практическое замечание

Расшифровка отчета другим отчетом и передача отборов

Самый востребованный сценарий — «проваливание» из сводного отчета в детальный: из продаж по менеджерам в список документов конкретного менеджера за период. Реализуется это передачей параметров и отборов во второй отчет. Период берется из параметров исходного отчета, а значения группировок — из элементов расшифровки, включая родительские элементы (их нужно обходить вверх по иерархии через ПолучитьРодителей()).

Типичная ошибка на этом этапе — забыть про родительские группировки. Если отчет сгруппирован по «Организация → Менеджер → Месяц», то элемент расшифровки ячейки месяца содержит только месяц; организацию и менеджера нужно собрать из родительских элементов. Иначе детальный отчет откроется с неполным отбором и покажет лишние данные.

Альтернативный подход — вложенные схемы компоновки: в схеме отчета можно задать связь, при которой для расшифровки группировки используется другая схема с автоматической передачей отборов. Это снижает объем кода, но менее гибко: нестандартные действия (открыть документ, выполнить команду) всё равно потребуют программного обработчика.

Сравнение вариантов

Стандартное меню платформы

Подходит, когда достаточно открыть значение или отфильтровать по полю. Не требует кода, но не открывает другой отчет с готовыми отборами.

Свой обработчик ОбработкаРасшифровки

Полный контроль: открытие любого отчета, объекта, выполнение команд. Требует кода и аккуратной работы с родительскими элементами расшифровки.

Вложенные схемы компоновки

Декларативная передача отборов в детальный отчет без кода. Ограничение — только сценарий «отчет открывает отчет», сложно отлаживать.

Проверка результата и типичные ошибки

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

Контрольные точки

Как проверить результат

Двойной клик по ячейке ресурса
Норма

Появляется меню расшифровки или выполняется заданное действие

Тревожный признак

Ничего не происходит — нет данных расшифровки или не назначен обработчик

Сумма в детальном отчете
Норма

Совпадает со значением ячейки сводного отчета

Тревожный признак

Расходится — потеряны отборы родительских группировок или параметры периода

Открытие документа из расшифровки
Норма

Открывается именно тот документ, что формирует показатель

Тревожный признак

Открывается пустая форма — поле ссылки нет в выборке набора данных

Типичные ошибки
01
Не передан объект ДанныеРасшифровки в компоновщик макета — ячейки не содержат ключей, меню расшифровки не появляется вовсе.
02
Не установлено СтандартнаяОбработка = Ложь в своем обработчике — после нужного действия платформа показывает ещё и стандартное меню.
03
Не собраны родительские элементы расшифровки — детальный отчет открывается с неполным отбором и показывает лишние строки.
04
Поле-ссылка не добавлено в набор данных — расшифровать до документа невозможно, приходится переделывать запрос.
05
Реквизит данных расшифровки очищается при повторном формировании, а обработчик ссылается на старые ключи — ошибка «Элемент расшифровки не найден».

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

FAQ

Почему при двойном клике по ячейке ничего не происходит?

Чаще всего при формировании отчета не создавались данные расшифровки: проверьте, что объект ДанныеРасшифровки передается и в компоновщик макета, и в процессор компоновки. Вторая причина — у табличного документа отключено событие обработки расшифровки или результат выведен в режиме «только просмотр» без ключей.

Как открыть документ по двойному клику вместо меню?

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

Можно ли расшифровать итог до документов, если в отчете нет группировки по регистратору?

Стандартно — нет: расшифровка опирается на поля, реально участвующие в компоновке. Решения: добавить группировку по регистратору в настройки, добавить поле регистратора в набор данных и обрабатывать расшифровку программно, либо открывать детальный отчет с отборами по значениям текущих группировок.

Как передать период отчета в расшифровывающий отчет?

Период не хранится в элементах расшифровки — его нужно взять из параметров компоновки исходного отчета. В обработчике на сервере прочитайте значения параметров «НачалоПериода» и «КонецПериода» из настроек компоновщика и передайте их в открываемую форму отчета вместе с отборами из полей расшифровки.

Расшифровка работает в тонком клиенте, но не работает в веб-клиенте. В чем причина?

Обычно дело в коде обработчика: методы, недоступные в веб-клиенте (например, работа с файловой системой или модальные вызовы без асинхронных аналогов), приводят к ошибке. Проверьте директивы компиляции обработчика и замените модальные вызовы на асинхронные аналоги.

Влияет ли расшифровка на скорость формирования отчета?

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

Итог

Что важно запомнить

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