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

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

Как сделать кнопку «Расшифровать» в отчете 1С

Как добавить кнопку «Расшифровать» в отчет 1С: обработка расшифровки СКД, событие ОбработкаРасшифровки, примеры кода для управляемых и обычных форм.

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

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

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

Когда отчет формируется через компоновщик настроек СКД, платформа вместе с табличным документом строит объект «Данные расшифровки». Каждой ячейке результата соответствует идентификатор расшифровки — по нему можно получить значения группировок (контрагент, номенклатура, документ), которые участвовали в формировании именно этой цифры.

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

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

Способ 1. Стандартная расшифровка СКД без программирования

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

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

Способ 2. Собственная кнопка «Расшифровать» с обработчиком события

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

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

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

&НаСервере
Процедура ОбработатьРасшифровкуНаСервере(Расшифровка)
    Данные = ПолучитьИзВременногоХранилища(АдресДанныхРасшифровки);
    Элемент = Данные.Элементы.Получить(Расшифровка);
    Если ТипЗнч(Элемент) = Тип("ЭлементРасшифровкиКомпоновкиДанныхПоля") Тогда
        Для Каждого Поле Из Элемент.ПолучитьПоля() Цикл
            Если Поле.Поле = "Регистратор" Тогда
                ОткрытьЗначениеНаКлиенте(Поле.Значение);
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;
КонецПроцедуры

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

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

Способ 3. Расшифровка в отчете без СКД

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

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

bsl
// При выводе результата
Область = Макет.ПолучитьОбласть("Строка");
Область.Параметры.Сумма = Выборка.Сумма;
Область.Параметры.Расшифровка = Выборка.Ссылка;
ТабДок.Вывести(Область);

// В событии ОбработкаРасшифровки
СтандартнаяОбработка = Ложь;
ОткрытьЗначение(Расшифровка); // Расшифровка = ссылка на документ

Как проверить, что расшифровка работает правильно

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

Частая причина «расшифровка открывает не тот документ» — устаревшие данные расшифровки в хранилище. При каждом формировании отчета перезаписывайте адрес временного хранилища или реквизит с данными расшифровки.

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

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

Клик по ячейке с суммой
Норма

Открывается документ или вложенный отчет с теми же итогами

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

Пустая форма, ошибка «Элемент не найден» или данные прошлого формирования

Повторное формирование отчета
Норма

Расшифровка соответствует новому результату

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

Открываются объекты из предыдущего отчета

Ячейка без расшифровки (заголовок)
Норма

Ничего не происходит или выводится понятное сообщение

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

Ошибка платформы при обращении к элементу расшифровки

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

Самые распространенные проблемы связаны с контекстом выполнения и жизненным циклом данных расшифровки. Разберите их до отладки — это сэкономит время.

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

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

Что выбрать: стандартную или собственную расшифровку

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

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

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

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

Итог

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

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

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

Почему событие ОбработкаРасшифровки не вызывается?

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

Можно ли сделать расшифровку внешнего отчета без изменения конфигурации?

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

Как получить не только регистратор, но и все группировки ячейки?

У элемента расшифровки вызовите метод ПолучитьРодителей() и пройдите по цепочке вверх: у каждого родителя типа «ЭлементРасшифровкиКомпоновкиДанныхГруппировка» берите поля через ПолучитьПоля(). Так собирается полный контекст — например, период, склад и контрагент для конкретной суммы.

Расшифровка открывает документы из старого результата. Что делать?

Данные расшифровки не обновились при переформировании. В коде формирования отчета каждый раз заново помещайте объект ДанныеРасшифровки во временное хранилище и обновляйте реквизит формы с адресом. Старый адрес при этом можно удалить из хранилища.

Работает ли расшифровка в веб-клиенте?

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