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