Отчеты и Аналитика · 13 мин
Как сделать расшифровку в отчете на СКД в 1С
Как сделать расшифровку в отчете на СКД в 1С: настройка полей расшифровки, обработчиков, передача параметров, типичные ошибки и проверка результата.
Расшифровка — это возможность «провалиться» из итоговой цифры отчета в детальные данные: документы, контрагентов, проводки, которые сформировали показатель. В отчетах на системе компоновки данных (СКД) расшифровка работает из коробки для типовых настроек, но часто требует доработки, когда нужен переход в другой отчет, открытие объекта или нестандартная логика.
Понимание механизма расшифровки важно, потому что именно она превращает отчет из статичной таблицы в аналитический инструмент. Пользователь видит сумму продаж за месяц, дважды кликает по ячейке — и получает список накладных, которые её сформировали. Без корректной настройки расшифровки пользователь вынужден вручную искать данные в других отчетах.
Механизм расшифровки в СКД построен на объекте ДанныеРасшифровки, который платформа заполняет параллельно с формированием результата. Каждая ячейка отчета связана с элементом расшифровки, хранящим значения полей и отборы. Дальше эти данные можно использовать стандартно (через меню платформы) или обработать программно в собственном обработчике.
Как устроен механизм расшифровки в СКД
При формировании отчета компоновщик макета может одновременно построить вторую структуру — данные расшифровки. Это иерархия элементов, где каждой группировке и ресурсу соответствует узел со значениями полей: например, для ячейки «Продажи по контрагенту» в расшифровке хранятся значения «Контрагент», «Период» и набор связанных полей.
Когда пользователь дважды кликает по ячейке табличного документа, платформа находит элемент расшифровки по ключу (свойство «Расшифровка» области табличного документа) и предлагает стандартные действия: открыть значение, расшифровать по полю, отфильтровать, оформить. Если отчет формируется программно без данных расшифровки, этого меню не будет — это самая частая причина «неработающей» расшифровки.
Важно понимать: расшифровка работает только в том случае, если поле, по которому нужно «провалиться», реально присутствует в выборке компоновки. Если в отчете выведен только итог по месяцу, а ссылка на документ в наборе данных не запрашивается, получить список документов стандартным способом не выйдет — придется менять запрос или строить расшифровку через вложенную схему.
Включение расшифровки при программном формировании отчета
Если отчет формируется из кода (внешний отчет, команда, регламентная операция), расшифровку нужно явно запросить у компоновщика. Типовая последовательность выглядит так: создается компоновщик макета, в метод Выполнить передается тип генератора, а в процессор вывода — объект данных расшифровки.
Схема = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
Настройки = Схема.НастройкиПоУмолчанию;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
Макет = КомпоновщикМакета.Выполнить(Схема, Настройки, ДанныеРасшифровки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(Макет, , ДанныеРасшифровки);
Результат = Новый ТабличныйДокумент;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(Результат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);Ключевой момент — переменная ДанныеРасшифровки должна быть объявлена заранее (обычно как реквизит формы с типом ДанныеРасшифровкиКомпоновкиДанных) и передаваться и в Выполнить компоновщика макета, и в Инициализировать процессора. Если передать её только в одно место, ячейки либо не получат ключи расшифровки, либо ключи не найдут данных.
Для отчетов, построенных на основе типовой формы отчета (ФормаОтчета с автоматической генерацией), платформа делает это сама — там расшифровка включена по умолчанию. Проблемы возникают именно в самописных формах и программных сценариях.
Настройка полей расшифровки в схеме компоновки
Что именно увидит пользователь в меню расшифровки, определяется настройками схемы. На закладке «Наборы данных» и «Настройки» важны выбранные поля: каждое поле, включенное в выборку группировки или доступное как ресурс, может участвовать в расшифровке. Чтобы пользователь мог открыть документ-регистратор, поле «Ссылка» (или «Регистратор») должно быть добавлено в поля соответствующей группировки.
Для управления составом расшифровки у полей есть свойство, доступное в настройках поля группировки: можно указать, какие поля будут предлагаться при расшифровке конкретной группировки. Это удобно, когда в наборе данных много служебных полей, которые не должны «засорять» меню пользователя.
Ещё один практический прием — добавить в запрос набора данных поля, которые не выводятся в отчет, но нужны для расшифровки. Например, в отчете показывается только контрагент и сумма, но в выборку добавлены «Договор» и «Организация». Тогда стандартное меню расшифровки позволит отфильтровать или развернуть данные по этим измерениям без перегрузки визуальной части отчета.
- 1Откройте схему компоновки данных отчета и в запросе набора данных добавьте поля, нужные для расшифровки (ссылки на документы, контрагентов, периоды).
- 2На закладке «Настройки» включите нужные поля в выбранные поля соответствующих группировок.
- 3Убедитесь, что при формировании отчета создаются данные расшифровки (для типовой формы — автоматически, для своей — через параметр ДанныеРасшифровки).
- 4Сформируйте отчет и дважды кликните по ячейке с ресурсом: должно появиться меню «Расшифровать» со списком полей и действием «Открыть».
- 5Если меню не появилось — проверьте, что ячейка содержит ключ расшифровки и что реквизит данных расшифровки не очищается между вызовами.
Собственный обработчик расшифровки
Стандартное меню не всегда подходит: часто нужно, чтобы по двойному клику открывался другой отчет с уже установленными отборами. Для этого в модуле формы отчета реализуется обработчик события табличного документа ОбработкаРасшифровки, внутри которого анализируется элемент расшифровки и выполняется нужное действие.
Логика обработчика обычно такая: по ключу расшифровки извлекается элемент из объекта ДанныеРасшифровки, из него читаются значения полей через ПолучитьПоля(). Затем эти значения подставляются в отборы открываемого отчета или используются для открытия объекта. Обязательно установите параметр СтандартнаяОбработка = Ложь, иначе после вашего кода платформа покажет ещё и своё меню.
&НаКлиенте
Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка, ДополнительныеПараметры)
СтандартнаяОбработка = Ложь;
Поля = ПолучитьПоляРасшифровки(Расшифровка);
Если Поля.Свойство("Регистратор") Тогда
ПоказатьЗначение(, Поля.Регистратор);
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ПолучитьПоляРасшифровки(КлючРасшифровки)
Элемент = ДанныеРасшифровки.Элементы.Получить(КлючРасшифровки);
Возврат Элемент.ПолучитьПоля();
КонецФункцииЕсли нужно открыть другой отчет с отборами, используется открытие формы отчета с параметром Отбор или с передачей пользовательских настроек. В типовых конфигурациях для этого есть общие механизмы (например, программный интерфейс подсистемы отчетов), но базовый прием одинаков: сформировать структуру отборов из полей расшифровки и передать её в открываемую форму.
Обработчик расшифровки удобно делать универсальным: вместо жесткой привязки к именам полей перебирайте ПолучитьПоля() и ищите первое поле-ссылку. Тогда обработчик не сломается, если в схему добавят новую группировку.
Расшифровка отчета другим отчетом и передача отборов
Самый востребованный сценарий — «проваливание» из сводного отчета в детальный: из продаж по менеджерам в список документов конкретного менеджера за период. Реализуется это передачей параметров и отборов во второй отчет. Период берется из параметров исходного отчета, а значения группировок — из элементов расшифровки, включая родительские элементы (их нужно обходить вверх по иерархии через ПолучитьРодителей()).
Типичная ошибка на этом этапе — забыть про родительские группировки. Если отчет сгруппирован по «Организация → Менеджер → Месяц», то элемент расшифровки ячейки месяца содержит только месяц; организацию и менеджера нужно собрать из родительских элементов. Иначе детальный отчет откроется с неполным отбором и покажет лишние данные.
Альтернативный подход — вложенные схемы компоновки: в схеме отчета можно задать связь, при которой для расшифровки группировки используется другая схема с автоматической передачей отборов. Это снижает объем кода, но менее гибко: нестандартные действия (открыть документ, выполнить команду) всё равно потребуют программного обработчика.
Сравнение вариантов
Подходит, когда достаточно открыть значение или отфильтровать по полю. Не требует кода, но не открывает другой отчет с готовыми отборами.
Полный контроль: открытие любого отчета, объекта, выполнение команд. Требует кода и аккуратной работы с родительскими элементами расшифровки.
Декларативная передача отборов в детальный отчет без кода. Ограничение — только сценарий «отчет открывает отчет», сложно отлаживать.
Проверка результата и типичные ошибки
После настройки проверьте расшифровку на контрольном примере: сформируйте отчет за период с известными данными, выберите ячейку с ненулевым ресурсом и сравните детализацию с первичными документами. Сумма детального отчета должна сходиться с ячейкой сводного — расхождение означает, что отборы переданы не полностью или в детальном отчете другой запрос.
Как проверить результат
Появляется меню расшифровки или выполняется заданное действие
Ничего не происходит — нет данных расшифровки или не назначен обработчик
Совпадает со значением ячейки сводного отчета
Расходится — потеряны отборы родительских группировок или параметры периода
Открывается именно тот документ, что формирует показатель
Открывается пустая форма — поле ссылки нет в выборке набора данных
Отдельный риск — производительность. Формирование данных расшифровки увеличивает потребление памяти, особенно на отчетах с большим числом группировок и детальных записей. Если отчет выводится в файл или по расписанию без интерактивного анализа, данные расшифровки лучше не формировать — это заметно ускорит выполнение.
FAQ
Почему при двойном клике по ячейке ничего не происходит?
Чаще всего при формировании отчета не создавались данные расшифровки: проверьте, что объект ДанныеРасшифровки передается и в компоновщик макета, и в процессор компоновки. Вторая причина — у табличного документа отключено событие обработки расшифровки или результат выведен в режиме «только просмотр» без ключей.
Как открыть документ по двойному клику вместо меню?
Реализуйте обработчик ОбработкаРасшифровки табличного документа: установите СтандартнаяОбработка = Ложь, получите поля элемента расшифровки через ПолучитьПоля(), найдите поле со ссылкой на документ и вызовите ПоказатьЗначение(). Поле ссылки должно присутствовать в выборке набора данных схемы.
Можно ли расшифровать итог до документов, если в отчете нет группировки по регистратору?
Стандартно — нет: расшифровка опирается на поля, реально участвующие в компоновке. Решения: добавить группировку по регистратору в настройки, добавить поле регистратора в набор данных и обрабатывать расшифровку программно, либо открывать детальный отчет с отборами по значениям текущих группировок.
Как передать период отчета в расшифровывающий отчет?
Период не хранится в элементах расшифровки — его нужно взять из параметров компоновки исходного отчета. В обработчике на сервере прочитайте значения параметров «НачалоПериода» и «КонецПериода» из настроек компоновщика и передайте их в открываемую форму отчета вместе с отборами из полей расшифровки.
Расшифровка работает в тонком клиенте, но не работает в веб-клиенте. В чем причина?
Обычно дело в коде обработчика: методы, недоступные в веб-клиенте (например, работа с файловой системой или модальные вызовы без асинхронных аналогов), приводят к ошибке. Проверьте директивы компиляции обработчика и замените модальные вызовы на асинхронные аналоги.
Влияет ли расшифровка на скорость формирования отчета?
Да, построение дерева данных расшифровки требует дополнительной памяти и времени, особенно на отчетах с глубокой иерархией группировок и большим объемом строк. Если отчет формируется по расписанию или выгружается в файл без интерактивного анализа, данные расшифровки можно не формировать — это ускорит выполнение.
Что важно запомнить
Расшифровка в СКД работает через объект ДанныеРасшифровки, который нужно формировать вместе с результатом. Стандартное меню дает базовые действия, а нестандартные сценарии — открытие документа или другого отчета с отборами — реализуются в обработчике ОбработкаРасшифровки с обязательным сбором полей родительских группировок. Проверяйте результат сверкой суммы детального отчета с исходной ячейкой.