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

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

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

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

Расшифровка (drill-down) — одна из главных причин, по которой отчеты в 1С строят на системе компоновки данных. Пользователь кликает на цифру в отчете и видит, из каких документов, контрагентов или номенклатурных позиций она сложилась. СКД умеет формировать такую расшифровку автоматически, но чтобы она работала корректно и показывала именно нужные данные, настройку нужно понимать и контролировать.

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

Как работает механизм расшифровки в СКД

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

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

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

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

Самый простой способ добавить расшифровку — правильно заполнить настройки в конструкторе схемы компоновки. Откройте схему компоновки данных отчета и перейдите на закладку «Настройки». Здесь определяется структура: группировки, выбранные поля, отборы.

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

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

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

Порядок настройки расшифровки в конструкторе СКД
  1. 1
    Откройте схему компоновки данных отчета
  2. 2
    На закладке «Наборы данных» убедитесь, что в запросе есть поля для расшифровки (Регистратор, детальные измерения)
  3. 3
    На закладке «Настройки» добавьте вложенную группировку с нужными полями
  4. 4
    На закладке «Выбранные поля» проверьте, что поля расшифровки доступны
  5. 5
    Сохраните схему и сформируйте отчет
  6. 6
    Дважды кликните по ячейке с итогом и проверьте список доступных действий расшифровки

Расшифровка при программном формировании отчета

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

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

bsl
Процедура СформироватьОтчет()

	Схема = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
	Настройки = Схема.НастройкиПоУмолчанию;

	ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;

	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки, ДанныеРасшифровки);

	ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);

	Результат.Очистить();
	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
	ПроцессорВывода.УстановитьДокумент(Результат);
	ПроцессорВывода.Вывести(ПроцессорКомпоновки);

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

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

Типичная ошибка на этом шаге — вызвать ПоместитьВоВременноеХранилище без второго параметра (УникальныйИдентификатор формы). Тогда данные удалятся после завершения серверного вызова, и при клике пользователь получит пустую или неработающую расшифровку. Всегда привязывайте хранилище к времени жизни формы.

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

Собственные действия расшифровки: открытие объекта и нестандартные сценарии

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

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

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

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

	ЗначениеПоля = ПолучитьЗначениеРасшифровки(Расшифровка, "Регистратор");
	Если ЗначениеЗаполнено(ЗначениеПоля) Тогда
		ПоказатьЗначение(, ЗначениеПоля);
	КонецЕсли;

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

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

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

Обработка расшифровки в модуле объекта отчета

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

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

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

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

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

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

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

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

Типичные ошибки
01
Не передать ДанныеРасшифровки в процессор компоновки — клик по ячейке ничего не дает
02
Поместить данные расшифровки в хранилище без УникальныйИдентификатор формы — расшифровка ломается после первого вызова
03
Забыть добавить поле (например, Регистратор) в запрос — расшифровка до документов невозможна
04
Разрешить детальные записи без отборов на больших регистрах — отчет зависает
05
Править типовую схему в рабочей базе без копии — расшифровка ломается у всех пользователей

Проверка результата и выбор подхода

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

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

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

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

Открывается меню с действиями расшифровки

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

Ничего не происходит или меню пустое

Сумма в расшифровке
Норма

Совпадает с исходной ячейкой

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

Сумма отличается — проверяйте отборы и связи наборов

Расшифровка до документа
Норма

В списке полей есть Регистратор, документ открывается

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

Поля нет — его не хватает в запросе набора данных

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

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

Как выбрать действие

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

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

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

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

Почему при двойном клике по ячейке расшифровка не работает?

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

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

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

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

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

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

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

Работает ли расшифровка в отчетах на обычных формах?

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

Как добавить расшифровку в типовой отчет без снятия конфигурации с поддержки?

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