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