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