Получение значения расшифровки и значений вышестоящих группировок расшифровки в отчете СКД

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

Реализовано с помощью рекурсивного вызова процедуры, получающей значения вышестоящей группировки.

В форме для поля «Результат» определим для события «ОбработкаРасшифровки» процедуру «РезультатОбработкиРасшифровки». И, соответствено, тело процедуры будет следующим:

Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)

СтандартнаяОбработка = Ложь;

//Значение текущего поля
Поле = ДанныеРасшифровки.Элементы[Расшифровка].ПолучитьПоля()[0];
Сообщить("Поле: " + Поле.Поле + ", значение: " + Поле.Значение);

//Значения всех вышестоящих группировок
ВывестиЗначениеГруппировки(Расшифровка);

КонецПроцедуры 

Где процедура «ВывестиЗначениеГруппировки» имеет следующее содержание:

Процедура ВывестиЗначениеГруппировки(ТекРасшифровка)

МассивРодителей = ДанныеРасшифровки.Элементы[ТекРасшифровка].ПолучитьРодителей();
Для СчРодителей = 1 По МассивРодителей.Количество() Цикл

ПолеРодитель = МассивРодителей[СчРодителей-1];
Если Число(ПолеРодитель.Идентификатор) > 0 Тогда

//Получим текущее поле
Если ТипЗнч(ПолеРодитель) = Тип("ЭлементРасшифровкиКомпоновкиДанныхПоля") Тогда
МассивПолей = ПолеРодитель.ПолучитьПоля();
ИначеЕсли ТипЗнч(ПолеРодитель) = Тип("ЭлементРасшифровкиКомпоновкиДанныхГруппировка") Тогда
МассивПолей = ПолеРодитель.ПолучитьРодителей()[0].ПолучитьПоля();
КонецЕсли;

Для СчПолей = 1 По МассивПолей.Количество() Цикл

Поле = МассивПолей[СчПолей-1];

//Выведем значения текущей расшифровки
Сообщить("Поле: " + Поле.Поле + ", значение: " + Поле.Значение);

//Рекурсивный вызов процедуры.
РасшифровкиВыше = ПолеРодитель.ПолучитьРодителей()[0].Идентификатор;
ВывестиЗначениеГруппировки(РасшифровкиВыше);

КонецЦикла;

КонецЕсли;
КонецЦикла;

КонецПроцедуры

Пример работы данных процедур можно посмотреть здесь  

21 Comments

  1. Chernov_Dmitriy

    Автор спасибо — после 5 часов поисков твой код подошел. Только немного модифицировал — так как не отрабатывал группировки:

    Процедура ВывестиЗначениеГруппировки(ТекРасшифровка)

    МассивРодителей = ДанныеРасшифровки.Элементы[ТекРасшифровка].ПолучитьРодителей();

    Для Сч = 1 По МассивРодителей.Количество() Цикл

    ПолеРодитель = МассивРодителей[Сч-1];

    Если ТипЗнч(ПолеРодитель) = Тип(«ЭлементРасшифровкиКомпоновкиДанныхПоля») Тогда

    //Выведем значения текущей расшифровки

    Поле = ПолеРодитель.ПолучитьПоля()[0];

    Сообщить(«Поле: » + Поле.Поле + «, значение: » + Поле.Значение);

    //Рекурсивный вызов процедуры.

    РасшифровкиВыше = ПолеРодитель.ПолучитьРодителей()[0].Идентификатор;

    ВывестиЗначениеГруппировки(РасшифровкиВыше);

    ИначеЕсли ТипЗнч(ПолеРодитель) = Тип(«ЭлементРасшифровкиКомпоновкиДанныхГруппировка») тогда

    Попытка

    Поле = ПолеРодитель.ПолучитьРодителей()[0].ПолучитьПоля()[0] ;

    Сообщить(«Поле: » + Поле.Поле + «, значение: » + Поле.Значение);

    //Рекурсивный вызов процедуры.

    РасшифровкиВыше = ПолеРодитель.ПолучитьРодителей()[0].Идентификатор;

    ВывестиЗначениеГруппировки(РасшифровкиВыше);

    Исключение

    КонецПопытки;

    КонецЕсли;

    КонецЦикла;

    КонецПроцедуры

    Reply
  2. Tavalik

    Спасибо. В статье исправил и тоже немного оптимизировал 🙂

    Reply
  3. AndrewVVS

    Поле = ДанныеРасшифровки.Элементы[Расшифровка].ПолучитьПоля()[0],

    А если ДанныеРасшифровки = Неопределено, тогда будет ошибка…

    Нашел: нужно было в типовой процедуре добавить «ДанныеРасшифровки», по умолчанию там Неопределено!

    Процедура ОбновитьОтчет() Экспорт

    СформироватьОтчет(ЭтаФорма.ЭлементыФормы.Результат, ДанныеРасшифровки, Ложь);

    КонецПроцедуры

    Reply
  4. xten

    Я правильно понимаю, что это фактически универсальный шаблонный код (если можно так выразиться), который можно в много где использовать )) ?

    Reply
  5. Tavalik

    (4) xten,

    Да, конечно. Код будет работать в любом отчете на СКД.

    Reply
  6. katunya88

    ты просто супер! то что нужно! спасибо!

    Reply
  7. Cyberhawk

    А кто знает, как получать значения ресурса из расшифровки?

    Reply
  8. ig0rec

    А если родителей несколько на одном уровне ( когда расшифровка и по столбцам и по колонкам), то выберутся только первые группировки, вот мой вариант

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

    Показать

    А использую процедуру так

    Данные = ПолучитьИзВременногоХранилища(ДанныеРасшифровки);
    Структура = Новый Структура;
    РекурсивноПолучитьРодителей(Данные.Элементы.Получить(Расшифровка), Структура);
    

    но не могу получить значение ресурса, м.б. кто-нибудь подскажет?

    Reply
  9. Tavalik

    (8) ig0rec,

    Спасибо за комментарий.

    Столкнулся с подобной проблемой. Оптимизировал код в публикации для вывода всех группировочных полей на каждом уровне группировки.

    Reply
  10. Oleg-and-reevich

    Автор, огромное спасибо! Просто не представляете, как выручил Ваш код)!

    Reply
  11. rif-nrr

    Спасибо за статью! очень выручило

    Reply
  12. Vika260740

    Спасибо за полезный код!

    Reply
  13. TreeDogNight

    Доработал ваш код, добавил возможность получения значений полей детальных записей (до этого получалось только значение текущего поля, откуда вызывалась расшифровка):

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

    Показать

    Reply
  14. queit

    Спасибо за статью. Очень полезная.

    Только вот столкнулся с одной проблемкой. Почему-то «Поле.Значение» всегда null, при этом имя поля выводится правильно.

    Что это может быть?

    Reply
  15. sulfur17

    Пытаюсь расшифровку таблицы сделать из строки ВСЕГО и вот в этой строке получается ошибка

    МассивПолей = ПолеРодитель.ПолучитьРодителей()[0].ПолучитьПоля();

    т.к. ПолучитьРодителей() возвращает пустой массив.

    Reply
  16. Westbound

    (13) Забыли вставить функцию ПреобразоватьИмяПоляГруппировки, но это ладно. В любом случае все значения ресурсов возвращаются с Null’ом.

    Reply
  17. kanat1

    Спасибо. Очень помогло

    Reply
  18. zsergey_

    Автору спасибо!

    Reply
  19. dmitrii665

    (14) Добрый день та же проблема, что то удалось выяснить?

    Reply
  20. mars30ob
    Reply
  21. COMPER

    (19) Тоже самое. Как вылечить?

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *