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

20.07.16

Разработка - СКД

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

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

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

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

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

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

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

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

См. также

SALE! 15%

Инструментарий разработчика Роли и права Запросы СКД Программист Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

10000 руб.

02.09.2020    159451    874    399    

861

Запросы СКД Программист Стажер Система компоновки данных Россия Бесплатно (free)

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

15.05.2024    8684    implecs_team    6    

47

Инструментарий разработчика СКД Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

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

3 стартмани

05.02.2024    6996    56    obmailok    21    

79

Запросы СКД Программист Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Есть список полей в виде текста, или запрос - закидываем в набор СКД.

1 стартмани

31.01.2024    3148    5    Yashazz    1    

34

СКД WEB-интеграция Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

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

2 стартмани

11.12.2023    10807    23    John_d    25    

124

СКД Программист Платформа 1С v8.3 Система компоновки данных Конфигурации 1cv8 Бесплатно (free)

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

05.12.2023    8017    PROSTO-1C    15    

68
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Chernov_Dmitriy 89 12.12.13 11:39 Сейчас в теме
Автор спасибо - после 5 часов поисков твой код подошел. Только немного модифицировал - так как не отрабатывал группировки:
Процедура ВывестиЗначениеГруппировки(ТекРасшифровка)

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

ПолеРодитель = МассивРодителей[Сч-1];
Если ТипЗнч(ПолеРодитель) = Тип("ЭлементРасшифровкиКомпоновкиДанныхПоля") Тогда

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

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

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

Исключение

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

КонецЦикла;

КонецПроцедуры
2. Tavalik 3409 20.12.13 13:12 Сейчас в теме
Спасибо. В статье исправил и тоже немного оптимизировал :)
3. AndrewVVS 07.02.14 16:26 Сейчас в теме
Поле = ДанныеРасшифровки.Элементы[Расшифровка].ПолучитьПоля()[0],
А если ДанныеРасшифровки = Неопределено, тогда будет ошибка...
Нашел: нужно было в типовой процедуре добавить "ДанныеРасшифровки", по умолчанию там Неопределено!

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

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

КонецПроцедуры
4. xten 49 22.04.14 13:14 Сейчас в теме
Я правильно понимаю, что это фактически универсальный шаблонный код (если можно так выразиться), который можно в много где использовать )) ?
5. Tavalik 3409 23.04.14 07:14 Сейчас в теме
(4) xten,
Да, конечно. Код будет работать в любом отчете на СКД.
6. katunya88 19 15.05.14 06:12 Сейчас в теме
ты просто супер! то что нужно! спасибо!
7. Cyberhawk 135 27.10.14 18:54 Сейчас в теме
А кто знает, как получать значения ресурса из расшифровки?
BenDigget; VickWood; echo77; +3 Ответить
22. GG_Dots 41 18.02.20 08:43 Сейчас в теме
(7) Привет. Недавно столкнулся с такой задачей. Достаточно поле ресурса описать в макете и указать у него параметр расшифровки с выражением. И тогда программно сможешь получить значение ресурса: www.craft1c.ru
8. ig0rec 17.11.14 13:22 Сейчас в теме
А если родителей несколько на одном уровне ( когда расшифровка и по столбцам и по колонкам), то выберутся только первые группировки, вот мой вариант

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


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

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


но не могу получить значение ресурса, м.б. кто-нибудь подскажет?
9. Tavalik 3409 23.05.15 12:23 Сейчас в теме
(8) ig0rec,

Спасибо за комментарий.
Столкнулся с подобной проблемой. Оптимизировал код в публикации для вывода всех группировочных полей на каждом уровне группировки.
10. Oleg-and-reevich 6 29.01.16 17:15 Сейчас в теме
Автор, огромное спасибо! Просто не представляете, как выручил Ваш код)!
11. rif-nrr 15 16.02.16 23:01 Сейчас в теме
Спасибо за статью! очень выручило
12. Vika260740 14.08.16 10:53 Сейчас в теме
Спасибо за полезный код!
13. TreeDogNight 22 16.02.17 09:56 Сейчас в теме
Доработал ваш код, добавил возможность получения значений полей детальных записей (до этого получалось только значение текущего поля, откуда вызывалась расшифровка):
&НаКлиенте
Функция ПолучитьСтруктуруРасшифровки(Расшифровка)
	
	СтруктураРасшифровки = Новый Структура;	    
	ЗаполнитьСтруктуруПолейРасшифровки(Расшифровка, СтруктураРасшифровки); 
	
	Возврат СтруктураРасшифровки;
	
КонецФункции 

&НаСервере
Процедура ЗаполнитьСтруктуруПолейРасшифровки(Знач Расшифровка, СтруктураПолей, Знач Данные = "")
	
	Если Данные = "" Тогда
		Данные = ПолучитьИзВременногоХранилища(ДанныеРасшифровки);
		
		Если ТипЗнч(Данные.Элементы[Расшифровка]) = Тип("ЭлементРасшифровкиКомпоновкиДанныхПоля") Тогда
			Поля = Данные.Элементы[Расшифровка].ПолучитьПоля();                   
			Для каждого Поле Из Поля Цикл
				СтруктураПолей.Вставить(ПреобразоватьИмяПоляГруппировки(Поле.Поле), Поле.Значение);
			КонецЦикла;
			
			Индекс = Число(Расшифровка);
			Пока Индекс Цикл
				ЭлементРасшифровки = Данные.Элементы[Индекс];
				Если ТипЗнч(ЭлементРасшифровки) = Тип("ЭлементРасшифровкиКомпоновкиДанныхГруппировка") Тогда
					Прервать;	
				КонецЕсли;
				
				Индекс = Индекс + 1;
			КонецЦикла;
			
			Индекс = Индекс - 1;
			Пока Индекс Цикл
				ЭлементРасшифровки = Данные.Элементы[Индекс];
				Если ТипЗнч(ЭлементРасшифровки) = Тип("ЭлементРасшифровкиКомпоновкиДанныхПоля") Тогда
					Поля = ЭлементРасшифровки.ПолучитьПоля();                   
					Для каждого Поле Из Поля Цикл
						Если Не ТипЗнч(Поле.Значение) = Тип("Число") Тогда
							СтруктураПолей.Вставить(ПреобразоватьИмяПоляГруппировки(Поле.Поле), Поле.Значение);
						КонецЕсли; 	
					КонецЦикла;
					
					Индекс = Индекс - 1;
				Иначе 
					Прервать;
				КонецЕсли; 
			КонецЦикла; 
		КонецЕсли;
		
		ЗаполнитьСтруктуруПолейРасшифровки(Данные.Элементы[Расшифровка], СтруктураПолей, Данные);
	Иначе 
		МассивРодителей = Расшифровка.ПолучитьРодителей();
		Для каждого ПолеРодитель из МассивРодителей Цикл
			Если Число(ПолеРодитель.Идентификатор) > 0 Тогда
				Если ТипЗнч(ПолеРодитель) = Тип("ЭлементРасшифровкиКомпоновкиДанныхПоля") Тогда
					МассивПолей = ПолеРодитель.ПолучитьПоля();
				ИначеЕсли ТипЗнч(ПолеРодитель) = Тип("ЭлементРасшифровкиКомпоновкиДанныхГруппировка") Тогда
					МассивПолей = ПолеРодитель.ПолучитьРодителей()[0].ПолучитьПоля();
				КонецЕсли; 
				
				Для каждого Поле из МассивПолей Цикл
					СтруктураПолей.Вставить(ПреобразоватьИмяПоляГруппировки(Поле.Поле), Поле.Значение);
					
					РасшифровкиВыше = ПолеРодитель.ПолучитьРодителей();
					Для каждого РодительВыше Из РасшифровкиВыше Цикл
						ЗаполнитьСтруктуруПолейРасшифровки(РодительВыше, СтруктураПолей, Данные);              
					КонецЦикла; 
				КонецЦикла;    
			КонецЕсли;        
		КонецЦикла;
	КонецЕсли; 
		
КонецПроцедуры
Показать
16. Westbound 21.11.17 13:49 Сейчас в теме
(13) Забыли вставить функцию ПреобразоватьИмяПоляГруппировки, но это ладно. В любом случае все значения ресурсов возвращаются с Null'ом.
AlexKoso; eeeio; TreeDogNight; +3 Ответить
14. queit 65 13.04.17 07:56 Сейчас в теме
Спасибо за статью. Очень полезная.
Только вот столкнулся с одной проблемкой. Почему-то "Поле.Значение" всегда null, при этом имя поля выводится правильно.
Что это может быть?
eeeio; COMPER; Ignatov_mu; romku; +4 Ответить
19. dmitrii665 22 10.10.19 16:38 Сейчас в теме
(14) Добрый день та же проблема, что то удалось выяснить?
eeeio; COMPER; +2 Ответить
21. COMPER 341 06.11.19 12:17 Сейчас в теме
(19) Тоже самое. Как вылечить?
15. sulfur17 66 23.05.17 22:05 Сейчас в теме
Пытаюсь расшифровку таблицы сделать из строки ВСЕГО и вот в этой строке получается ошибка
МассивПолей = ПолеРодитель.ПолучитьРодителей()[0].ПолучитьПоля();

т.к. ПолучитьРодителей() возвращает пустой массив.
17. kanat1 29 21.02.18 15:03 Сейчас в теме
Спасибо. Очень помогло
18. zsergey_ 6 30.07.18 05:31 Сейчас в теме
20. mars30ob 15.10.19 10:03 Сейчас в теме
Очень помогло, спасибо!
Добавил вывод пути к полю, вариант для УФ
&НаКлиенте
Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка, ДополнительныеПараметры)
	СтандартнаяОбработка = Ложь;
	РезультатОбработкаРасшифровкиНаСервере(Расшифровка);
КонецПроцедуры

&НаСервере
Процедура РезультатОбработкаРасшифровкиНаСервере(Расшифровка)
	ДанныеРасшифровкиНаСервере = ПолучитьИзВременногоХранилища(ДанныеРасшифровки);
	ВывестиЗначениеГруппировки(ДанныеРасшифровкиНаСервере, Расшифровка, "");
КонецПроцедуры

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


Получается типа: "Поле: Касса, значение: Основная касса, путь = .ПолучитьРодителей()[0].ПолучитьПоля()[1]"
и путь можно использовать для прямого получения поля в коде:

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

	Попытка
		Касса = ДанныеРасшифровкиНаСервере.Элементы[Расшифровка].ПолучитьРодителей()[0].ПолучитьПоля()[1].Значение;
		//открыть расшифровку по кассе ...
	Исключение
	КонецПопытки;
КонецПроцедуры
Показать


путь, конечно, зависит от группировки, в которой находится выбранная пользователем ячейка. Способ не супер, но работает, когда надо сделать расшифровку только для определенной группировки
dammit666; +1 Ответить
26. user864894 23.11.23 11:11 Сейчас в теме
(20) тоже воспользовался кодом, но исправил ошибку когда рекурсивная процедура доходит до самой верхней группировки и добавил входящий параметр МассивУровней:


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

	ДанныеРасшифровкиОтчета = ПолучитьИзВременногоХранилища(ОтчетДанныеРасшифровки);

	МассивУровней = Новый Массив; //если пустой, то высший уровень - ИТОГО по отчету
	ВывестиЗначениеГруппировки(ДанныеРасшифровкиОтчета,Расшифровка,"",МассивУровней);
	
	Если МассивУровней.Количество() > 0 Тогда
		ДополнительныеПараметры.УровеньГруппировки  	= МассивУровней.Количество();
		ДополнительныеПараметры.ПолеГруппировки 	 	= МассивУровней[0].ПолеГруппировки;
		ДополнительныеПараметры.ЗначениеГруппировки 	= МассивУровней[0].ЗначениеГруппировки;
	Иначе	 
		ДополнительныеПараметры.УровеньГруппировки  	= 0;//итоги по отчету
	КонецЕсли;                                

.......
Показать


&НаСервере
Процедура ВывестиЗначениеГруппировки(ДанныеРасшифровкиНаСервере, ТекРасшифровка, Путь,мМУровней)
    
    МассивРодителей = ДанныеРасшифровкиНаСервере.Элементы[ТекРасшифровка].ПолучитьРодителей();
    Путь = Путь + ".ПолучитьРодителей()";
    Для СчРодителей = 0 По МассивРодителей.Количество()-1 Цикл
        
        ПолеРодитель = МассивРодителей[СчРодителей];
        Если Число(ПолеРодитель.Идентификатор) > 0 Тогда
            
            //Получим текущее поле
            Если ТипЗнч(ПолеРодитель) = Тип("ЭлементРасшифровкиКомпоновкиДанныхПоля") Тогда
                МассивПолей = ПолеРодитель.ПолучитьПоля();
                ЭтоГруппировка = Ложь;
            ИначеЕсли ТипЗнч(ПолеРодитель) = Тип("ЭлементРасшифровкиКомпоновкиДанныхГруппировка") Тогда
                МассивПолей = ПолеРодитель.ПолучитьРодителей(); 
				Если МассивПолей.Количество() > 0 Тогда
					 МассивПолей = МассивПолей[0].ПолучитьПоля();
                	 ЭтоГруппировка = Истина;
				 Иначе	                     
					 ЭтоГруппировка = Ложь;
				КонецЕсли;	 
            КонецЕсли; 
            
            Для СчПолей = 0 По МассивПолей.Количество()-1 Цикл
                
                Поле = МассивПолей[СчПолей];
                
                //Выведем значения текущей расшифровки
                //Сообщить("Поле: " + Поле.Поле + ", значение: " + Поле.Значение+", путь = "+Путь+"["+СчРодителей+"]"+?(ЭтоГруппировка,".ПолучитьРодителей()[0].ПолучитьПоля()",".ПолучитьПоля()")+"["+СчПолей+"]");
				мМУровней.Добавить(Новый Структура("ПолеГруппировки,ЗначениеГруппировки",Поле.Поле,Поле.Значение));
				
                //Рекурсивный вызов процедуры. 
                РасшифровкиВыше = ПолеРодитель.ПолучитьРодителей()[0].Идентификатор;
                ВывестиЗначениеГруппировки(ДанныеРасшифровкиНаСервере, РасшифровкиВыше, Путь+"["+СчРодителей+"]"+?(ЭтоГруппировка,".ПолучитьРодителей()[0].ПолучитьПоля()",".ПолучитьПоля()")+"["+СчПолей+"]",мМУровней);
                
            КонецЦикла;    
            
        КонецЕсли;        
    КонецЦикла;
    
КонецПроцедуры
Показать
23. user640247 03.07.20 17:27 Сейчас в теме
Спасибо большое!!!
это то что надо!
24. delat 32 15.07.20 16:35 Сейчас в теме
25. Неопределено 91 18.12.20 07:56 Сейчас в теме
Переменная ДанныеРасшифровки является строкой и имеет вид "e1cib/tempstorage/ff474301-f927-4908-868e-38d2416a115c?seanceId=71b2f942-a665-4245-b2c1-a07b183269e3".
27. Andrekaa 02.04.24 11:15 Сейчас в теме
А как получилось все таки Ресурс?
28. ig0rec 13.05.24 23:57 Сейчас в теме
(27) я получал запросом, подобным запросу отчета, но уже с указанием всех группировок в качестве параметров
29. G_109481006739202833089 11.07.24 15:51 Сейчас в теме
(28) Здравствуйте. А можно подробнее пожалуйста.
30. ig0rec 11.07.24 16:02 Сейчас в теме
(29) Напишите текст запроса, которым формируете отчет, добавьте в него доп условия по полям группировок, на выходе получите искомый набор строк, а дальше смотря чтотв ресурсе было. Не уверен, что так правильно, но 11 лет назад нашел только такой способ)
31. fixin 4273 16.08.24 15:13 Сейчас в теме
Спасибо, помогло.

Я вот такую функцию сделал:

Функция ИнформацияОТекущейРасшифровке(ДанныеРасшифровки, Расшифровка) Экспорт
	
	//https://infostart.ru/1c/articles/195432/    
	Р = Новый Структура("Поле, Значение");             
	Р.Вставить("Поля", Новый Соответствие());
	
	Поля = ДанныеРасшифровки.Элементы[Расшифровка].ПолучитьПоля();
	Если Поля.Количество() > 0 Тогда
		//ВывестиЗначениеГруппировки(ДанныеРасшифровки, Поля[0]);
		Поле = ДанныеРасшифровки.Элементы[Расшифровка].ПолучитьПоля()[0];
		Р.Поле = Поле.Поле; Р.Значение = Поле.Значение;
	КонецЕсли;                                                           
	
	ЗаполнитьПоляРасшифровки(Р.Поля, ДанныеРасшифровки, Расшифровка);
	
	Возврат Р;
	
КонецФункции

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

Показать


Пример:

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

Функция БС_ПолучитьИнформациюРасшифровки(Расшифровка)
	ДанныеРасшифровки = ПолучитьИзВременногоХранилища(ОтчетДанныеРасшифровки);
	
	Инфо = БС_С.ИнформацияОТекущейРасшифровке(ДанныеРасшифровки, Расшифровка);
	Возврат Инфо;
КонецФункции 

Показать


Хотя можно сразу адрес строкой передавать данных расшифровки.
Оставьте свое сообщение