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

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

Как работает расшифровка в СКД 1С

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

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

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

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

Что физически представляет собой расшифровка

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

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

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

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

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

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

Чтобы стандартная расшифровка работала корректно, поля, по которым она строится, должны быть доступны в настройках СКД. Если поле исключено из выбранных полей или отключено на закладке «Поля» в настройках варианта, платформа не сможет передать его значение в отбор расшифровывающего отчёта.

Обработчик ОбработкаРасшифровки: где и как его писать

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

В обработчик передаются ключевые параметры: идентификатор расшифровки (ЭлементРасшифровки), данные расшифровки (адрес или объект), стандартная обработка (флаг, который нужно сбросить в Ложь при собственной логике) и дополнительные параметры. Типовой каркас обработчика выглядит так:

bsl
&НаКлиенте
Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка, ДополнительныеПараметры)
    СтандартнаяОбработка = Ложь;
    ОбработкаРасшифровки = Новый ОбработкаРасшифровкиКомпоновкиДанных(
        ДанныеРасшифровки,
        Новый ИсточникДоступныхНастроекКомпоновкиДанных(Отчет.КомпоновщикНастроек));
    Настройки = ОбработкаРасшифровки.Расшифровать(Расшифровка, Неопределено);
    // далее — открытие формы отчёта с полученными настройками
КонецПроцедуры

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

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

Программное формирование и передача данных расшифровки

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

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

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

Настройка полей, доступных для расшифровки

Какие значения можно получить в обработчике, определяется составом полей настроек. Поле попадает в расшифровку, если оно присутствует в выбранных полях отчёта или группировки, либо явно добавлено в ресурсы/параметры. Если нужное поле (например, ссылка на документ) не выводится в отчёт, но должно участвовать в расшифровке, его добавляют в выбранные поля с отключённым видимостью или в детальные записи.

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

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

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

Как проверить настройку расшифровки

Поле в выбранных полях настроек
Норма

Поле присутствует, его значение доступно в обработчике расшифровки

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

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

Меню по двойному щелчку
Норма

Появляется список действий расшифровки

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

Меню нет — проверьте адрес данных расшифровки и свойство Отображение расшифровки

Отбор в расшифровывающем отчёте
Норма

Отбор соответствует значениям ячейки

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

Отбор пустой или по другому значению — ошибка в цепочке родительских элементов

Типичные ошибки и ограничения

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

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

Типичные ошибки
01
Не сброшен флаг СтандартнаяОбработка — выполняются оба действия, открываются лишние окна
02
Адрес данных расшифровки не передан из фонового задания — меню расшифровки не появляется вообще
03
Обращение к полю по имени колонки запроса вместо пути поля СКД — значение не находится
04
Расшифровка по вычисляемому полю — платформа не может восстановить детальные записи
05
Открытие расшифровывающего отчёта без ключа уникальности — все расшифровки выводятся в одно окно, затирая друг друга

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

Выбор подхода: стандартная расшифровка или свой обработчик

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

Маршрут решения

Как выбрать подход

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

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

Итог

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

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

Частые вопросы

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

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

Как получить в обработчике значение конкретного поля ячейки?

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

Можно ли расшифровать отчёт в другой отчёт с отбором?

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

Почему расшифровка показывает устаревшие данные?

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

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

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

Как отключить расшифровку для отдельных ячеек или всего отчёта?

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