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

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

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




