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

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

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

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

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

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

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

Как работает стандартная расшифровка СКД

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

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

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

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

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

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

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

Типичные ошибки
01
Программный вывод отчета без сохранения объекта ДанныеРасшифровки в реквизите формы — двойной щелчок ничего не дает
02
В настройках варианта отсутствует нужная группировка — пользователь не может детализировать итог до документов
03
Поле исключено из доступных полей настройки на уровне схемы — его нельзя добавить даже в режиме 1С:Предприятие
04
Использование автоотображения табличного документа без привязки расшифровки к ячейкам

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

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

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

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

Программная обработка расшифровки: событие ОбработкаРасшифровки

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

Типовой каркас обработчика выглядит так:

&НаКлиенте

Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)

СтандартнаяОбработка = Ложь;

Поля = ПолучитьПоляРасшифровки(Расшифровка);

Если Поля.Свойство("Контрагент") Тогда

ПоказатьЗначение(, Поля.Контрагент);

КонецЕсли;

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

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

&НаСервере

Функция ПолучитьПоляРасшифровки(Расшифровка)

Результат = Новый Структура;

Данные = ПолучитьИзВременногоХранилища(АдресДанныхРасшифровки);

Элемент = Данные.Элементы.Получить(Расшифровка);

ЗаполнитьЗначенияПолей(Результат, Элемент, Данные);

Возврат Результат;

КонецФункции

Порядок настройки собственной расшифровки
  1. 1
    Убедитесь, что данные расшифровки сохраняются в реквизите формы или во временном хранилище при формировании отчета
  2. 2
    Добавьте в модуль формы обработчик события ОбработкаРасшифровки поля табличного документа
  3. 3
    Установите СтандартнаяОбработка = Ложь, чтобы заменить стандартное меню
  4. 4
    Извлеките из ДанныеРасшифровки значения полей текущего элемента и его родителей
  5. 5
    Выполните нужное действие: откройте объект, сформируйте другой отчет с отбором
  6. 6
    Проверьте поведение на ячейках разных уровней группировки и на итогах

Открытие другого отчета по щелчку на ячейке

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

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

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

Расшифровка в отчетах на обычных формах и в типовых конфигурациях

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

В современных типовых конфигурациях (ERP, УТ 11, БП 3.0) отчеты построены на подсистеме «Варианты отчетов» БСП. Там расшифровка уже обрабатывается библиотекой, и вмешиваться в нее нужно через программный интерфейс отчета: события ПриКомпоновкеРезультата и переопределяемые модули. Прямое добавление обработчика в форму отчета БСП может конфликтовать с механизмами библиотеки.

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

Способы реализации расшифровки

Стандартная расшифровка платформы

Подходит для открытия объектов и раскрытия группировок. Не требует кода, но набор действий фиксирован

Обработчик в форме отчета

Полный контроль над действиями по щелчку. Требует аккуратной работы с данными расшифровки и проверки типов

Открытие другого отчета с отбором

Лучший вариант для глубокой аналитики. Требует согласования параметров и отборов между отчетами

Механизмы БСП в типовых конфигурациях

Правильный путь для ERP/УТ/БП. Ограничение — нужно работать через программный интерфейс библиотеки

Проверка результата и ограничения механизма

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

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

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

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

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

Двойной щелчок по детальной строке
Норма

Открывается объект или выполняется заданное действие

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

Нет реакции или ошибка обращения к данным расшифровки

Двойной щелчок по общему итогу
Норма

Обработчик корректно обрабатывает пустые поля

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

Ошибка «Поле не найдено» или открытие пустой формы

Отчет под пользователем с ограниченными правами
Норма

Понятное сообщение или корректный отказ

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

Необработанное нарушение прав доступа

Формирование в фоновом режиме
Норма

Расшифровка работает после завершения задания

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

Расшифровка пустая — данные не переданы из фона

Часто задаваемые вопросы

Почему в отчете СКД двойной щелчок по ячейке ничего не делает?

Чаще всего данные расшифровки не сохранены: при программном выводе отчета нужно передать объект ДанныеРасшифровкиКомпоновкиДанных в процессор вывода и сохранить его в реквизите формы или временном хранилище. Также проверьте, что результат выведен в поле табличного документа, а не скопирован в другой документ.

Как расшифровать сумму до конкретных документов?

Добавьте в настройки варианта отчета группировку по полю «Регистратор» (или «Документ») либо группировку «Детальные записи». После этого двойной щелчок по итоговой сумме покажет строки документов, а по ссылке документа можно будет открыть сам объект.

Можно ли по щелчку открыть другой отчет с отбором по текущей строке?

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

Сохраняется ли расшифровка при сохранении отчета в файл?

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

Как отключить стандартное меню расшифровки и оставить только свое действие?

В обработчике события ОбработкаРасшифровки установите параметр СтандартнаяОбработка в Ложь — тогда платформа не покажет свое контекстное меню. Далее выполните собственное действие или покажите пользователю собственный список выбора через ПоказатьВыборИзМеню.

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

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

Итог

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

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