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