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