Ниже приводится небольшой кусок кода, позволяющий получить значение расшифровки и значения всех вышестоящих группировок расшифровки в отчете построенном на СКД при использовании обычных форм. Имя поля и значение просто выводится пользователю в сообщении. Соответственно, вы можете вставить свой алгоритм вместо вывода сообщений.
Реализовано с помощью рекурсивного вызова процедуры, получающей значения вышестоящей группировки.
В форме для поля «Результат» определим для события «ОбработкаРасшифровки» процедуру «РезультатОбработкиРасшифровки». И, соответствено, тело процедуры будет следующим:
Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
//Значение текущего поля
Поле = ДанныеРасшифровки.Элементы[Расшифровка].ПолучитьПоля()[0];
Сообщить("Поле: " + Поле.Поле + ", значение: " + Поле.Значение);
//Значения всех вышестоящих группировок
ВывестиЗначениеГруппировки(Расшифровка);
КонецПроцедуры
Где процедура «ВывестиЗначениеГруппировки» имеет следующее содержание:
Процедура ВывестиЗначениеГруппировки(ТекРасшифровка)
МассивРодителей = ДанныеРасшифровки.Элементы[ТекРасшифровка].ПолучитьРодителей();
Для СчРодителей = 1 По МассивРодителей.Количество() Цикл
ПолеРодитель = МассивРодителей[СчРодителей-1];
Если Число(ПолеРодитель.Идентификатор) > 0 Тогда
//Получим текущее поле
Если ТипЗнч(ПолеРодитель) = Тип("ЭлементРасшифровкиКомпоновкиДанныхПоля") Тогда
МассивПолей = ПолеРодитель.ПолучитьПоля();
ИначеЕсли ТипЗнч(ПолеРодитель) = Тип("ЭлементРасшифровкиКомпоновкиДанныхГруппировка") Тогда
МассивПолей = ПолеРодитель.ПолучитьРодителей()[0].ПолучитьПоля();
КонецЕсли;
Для СчПолей = 1 По МассивПолей.Количество() Цикл
Поле = МассивПолей[СчПолей-1];
//Выведем значения текущей расшифровки
Сообщить("Поле: " + Поле.Поле + ", значение: " + Поле.Значение);
//Рекурсивный вызов процедуры.
РасшифровкиВыше = ПолеРодитель.ПолучитьРодителей()[0].Идентификатор;
ВывестиЗначениеГруппировки(РасшифровкиВыше);
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Пример работы данных процедур можно посмотреть здесь




Автор спасибо — после 5 часов поисков твой код подошел. Только немного модифицировал — так как не отрабатывал группировки:
Процедура ВывестиЗначениеГруппировки(ТекРасшифровка)
МассивРодителей = ДанныеРасшифровки.Элементы[ТекРасшифровка].ПолучитьРодителей();
Для Сч = 1 По МассивРодителей.Количество() Цикл
ПолеРодитель = МассивРодителей[Сч-1];
Если ТипЗнч(ПолеРодитель) = Тип(«ЭлементРасшифровкиКомпоновкиДанныхПоля») Тогда
//Выведем значения текущей расшифровки
Поле = ПолеРодитель.ПолучитьПоля()[0];
Сообщить(«Поле: » + Поле.Поле + «, значение: » + Поле.Значение);
//Рекурсивный вызов процедуры.
РасшифровкиВыше = ПолеРодитель.ПолучитьРодителей()[0].Идентификатор;
ВывестиЗначениеГруппировки(РасшифровкиВыше);
ИначеЕсли ТипЗнч(ПолеРодитель) = Тип(«ЭлементРасшифровкиКомпоновкиДанныхГруппировка») тогда
Попытка
Поле = ПолеРодитель.ПолучитьРодителей()[0].ПолучитьПоля()[0] ;
Сообщить(«Поле: » + Поле.Поле + «, значение: » + Поле.Значение);
//Рекурсивный вызов процедуры.
РасшифровкиВыше = ПолеРодитель.ПолучитьРодителей()[0].Идентификатор;
ВывестиЗначениеГруппировки(РасшифровкиВыше);
Исключение
КонецПопытки;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Спасибо. В статье исправил и тоже немного оптимизировал 🙂
Поле = ДанныеРасшифровки.Элементы[Расшифровка].ПолучитьПоля()[0],
А если ДанныеРасшифровки = Неопределено, тогда будет ошибка…
Нашел: нужно было в типовой процедуре добавить «ДанныеРасшифровки», по умолчанию там Неопределено!
Процедура ОбновитьОтчет() Экспорт
СформироватьОтчет(ЭтаФорма.ЭлементыФормы.Результат, ДанныеРасшифровки, Ложь);
КонецПроцедуры
Я правильно понимаю, что это фактически универсальный шаблонный код (если можно так выразиться), который можно в много где использовать )) ?
(4) xten,
Да, конечно. Код будет работать в любом отчете на СКД.
ты просто супер! то что нужно! спасибо!
А кто знает, как получать значения ресурса из расшифровки?
А если родителей несколько на одном уровне ( когда расшифровка и по столбцам и по колонкам), то выберутся только первые группировки, вот мой вариант
Показать
А использую процедуру так
но не могу получить значение ресурса, м.б. кто-нибудь подскажет?
(8) ig0rec,
Спасибо за комментарий.
Столкнулся с подобной проблемой. Оптимизировал код в публикации для вывода всех группировочных полей на каждом уровне группировки.
Автор, огромное спасибо! Просто не представляете, как выручил Ваш код)!
Спасибо за статью! очень выручило
Спасибо за полезный код!
Доработал ваш код, добавил возможность получения значений полей детальных записей (до этого получалось только значение текущего поля, откуда вызывалась расшифровка):
Показать
Спасибо за статью. Очень полезная.
Только вот столкнулся с одной проблемкой. Почему-то «Поле.Значение» всегда null, при этом имя поля выводится правильно.
Что это может быть?
Пытаюсь расшифровку таблицы сделать из строки ВСЕГО и вот в этой строке получается ошибка
т.к. ПолучитьРодителей() возвращает пустой массив.
(13) Забыли вставить функцию ПреобразоватьИмяПоляГруппировки, но это ладно. В любом случае все значения ресурсов возвращаются с Null’ом.
Спасибо. Очень помогло
Автору спасибо!
(14) Добрый день та же проблема, что то удалось выяснить?
(19) Тоже самое. Как вылечить?