Установка собственных значений полей при программном выводе отчета СКД по имени поля (по принципу "как в макете")

01.09.20

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

При программном выводе отчета на СКД возникает задача заполнить поля своими значениями. Но при поэлементном выводе отчета параметры "обезличены" как П1, П2, П3, ... Как узнать в какое "П" содержит нужное поле и куда устанавливать значение? Статья поможет программистам начинающим освоение СКД и перешедшим на СКД с "макета" ответить на эти вопросы на примере готового решения.

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

Обычно возникает необходимость присвоить свои значения полям наборов данных и вычисляемым полям при выводе отчета:

Но при выводе через процессор компоновки параметры зашифрованы как "П1", "П2", "П3", ... и информации об именах полей СКД не содержат вовсе:

Информацию о полях можно получить из параметров "Описания области макета области макета компоновки данных" макета компоновки данных. Прекрасно, имена полей там есть в параметрах расшифровки, но разобраться в этой инкапсуляции смерти кащеевой с первого раза быстро не получается.

Для решения этой проблемы создана функция получающая массив имен параметров макета по имени поля СКД.

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

		КонецЦикла;
		
		СтруктураКэшированияПараметров.Вставить(ИмяМакета, ИменаПараметров);
	КонецЕсли;
	
	Возврат ИменаПараметров;
КонецФункции

Пример применения функции при программном выводе отчета: 

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    
	СтандартнаяОбработка = Ложь;
		
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.Настройки, ДанныеРасшифровки,,);
	
	ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;		
	ПроцессорКомпоновки.Инициализировать(МакетКомпоновкиДанных, ,ДанныеРасшифровки);
	
	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
	ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
	ПроцессорВывода.НачатьВывод();

	ЭлементРезультата = ПроцессорКомпоновки.Следующий();

//==Структура для кэширования имен параметров в макете
	КэшИменПараметровМакетов = Новый Структура;
	
	Пока ЭлементРезультата <> Неопределено Цикл

		Если ЭлементРезультата.ЗначенияПараметров.Количество() > 0 Тогда
//==Установка наших значений параметров
			МассивИменПараметров = ПолучитьИменаПараметровВМакетеКомпоновкиПоИмениПоля("ИмяПоляСКД", ЭлементРезультата.Макет, МакетКомпоновкиДанных, КэшИменПараметровМакетов);

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

	КонецЦикла;

	ПроцессорВывода.ЗакончитьВывод()

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

 

Вступайте в нашу телеграмм-группу Инфостарт

СКД

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Инструментарий разработчика Роли и права Запросы СКД Программист Руководитель проекта 1С:Предприятие 8 Платные (руб)

Инструменты для разработчиков 1С 8.3: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.

16500 руб.

02.09.2020    266600    1484    421    

1177

СКД Программист 1С:Предприятие 8 Бесплатно (free)

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

16.06.2026    3658    sapervodichka    45    

49

Инструментарий разработчика СКД Программист 1С 8.3 Бесплатно (free)

В этой статье представлен СКДБилдер — общий модуль-обёртка над объектной моделью СКД, который сокращает код в 3-4 раза и делает его читаемым.

29.01.2026    7650    392    shapa_pro    27    

71

СКД Программист 1С:Предприятие 8 Бесплатно (free)

Статья написана по результатам проведенного внутреннего обучающего вебинара для разработчиков ГК «СофтБаланс». Если осилить 25 000 знаков - задача для вас непосильная, где-то на бескрайних просторах интернета видео есть (или будет). Но здесь информация точнее. Разберем, чем запрос для СКД принципиально отличается от обычного запроса и как модифицируется в зависимости от настроек. Изучим «базовый рецепт» написания запроса для СКД, сформируем чек-лист. Полезно будет всем – от стажеров до тех. лидов. Всем, кто не снимает галку «автозаполнение» и пишет запросы для отчетов в консоли запросов – читать (вдумчиво) обязательно.

29.10.2025    22128    ovetgana    112    

115

СКД Программист 1С:Предприятие 8 Бесплатно (free)

Описан способ заполнения списка доступных значений для полей наборов данных и параметров в схеме компоновки данных для любых конфигураций (с использованием БСП или без).

01.07.2025    12706    krasnoshchekovpavel    7    

68

СКД Программист Стажер 1С:Предприятие 8 Россия Бесплатно (free)

Несколько способов управления формами выбора параметров и отборов СКД.

10.04.2025    12282    Neti    0    

42

СКД Программист 1С:Предприятие 8 Бесплатно (free)

Хорошая отчетная форма - сродни искусству. Есть какое-то невероятное эстетическое удовольствие в том, чтобы разобраться в логике учета и анализируемых показателях, спроектировать архитектуру хранения данных так, чтобы оптимально собрать эти показатели вместе с аналитическими разрезами в запросе, а затем настроить отображение так, чтобы, глядя на результат, сразу было понятно, что это за отчет и какие задачи он призван решать. Система компоновки данных - это моя первая, главная и, наверное, единственная "рабочая" любовь. Ее я использую везде, где только можно и где нельзя тоже. Хочу поделиться с вами некоторыми практическими приемами в работе с отчетами на СКД, которые, надеюсь, будут полезны.

27.02.2025    17647    ovetgana    50    

93

СКД Программист 1С:Предприятие 8 Бесплатно (free)

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

24.12.2024    15439    Akcium    17    

47
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. KilloN 74 15.01.20 11:09 Сейчас в теме
Реально пригодилось, спасибо)
2. lmnlmn 71 16.01.20 09:57 Сейчас в теме
(1) Рад что было полезно. Только один момент, код в статье некорректный, как недавно выяснилось. Нельзя ссылаться на позицию параметра. Чуть позже внесу изменения в статью и отпишусь.
4. KilloN 74 16.01.20 10:31 Сейчас в теме
(2)
было полезно. Только один момент, код в ст


Я такой метод использовал для кэширования запросов из СКД. Но он не работает, если использовать типа генератора "ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений".

Поэтому я придумал универсальный вариант, я установил параметры в виде строк (Номенклатура = "Номенклатура") В результате параметр П1 = "Номенклатура". И дальше все просто.
5. lmnlmn 71 16.01.20 10:37 Сейчас в теме
(4) Для коллекции значений это не подходит, но я понимаю о чем вы. У меня разработан собственный инструмент для выгрузки в коллекции значений по генератору для табличного документа. Он позволяет узнать имена колонок, типы в колонках и умеет выгружать кросс-таблицу с заранее неизвестным числом колонок, чего стандартный генератор не может.
3. lmnlmn 71 16.01.20 10:18 Сейчас в теме
(1) Опубликовал изменения, необходимо заменить код функции ПолучитьИменаПараметровВМакетеКомпоновкиПоИмениПоля()
6. AlexanderP 43 21.08.20 14:27 Сейчас в теме
Переменная объявлена как
КэшИменПараметровМакетов = Новый Структура;

а при вызове метода используется другое имя (КэшМакетов)
МассивИменПараметров = ПолучитьИменаПараметровВМакетеКомпоновкиПоИмениПоля("ИмяПоляСКД", ЭлементРезультата.Макет, МакетКомпоновкиДанных, КэшМакетов);
7. lmnlmn 71 01.09.20 10:15 Сейчас в теме
(6) Спасибо. Исправил.
8. XelOla 19 01.09.20 15:41 Сейчас в теме
(7) здравствуйте! не получается(((
9. XelOla 19 01.09.20 16:28 Сейчас в теме
(7)
Ошибка исполнения отчета
по причине:
Ошибка при выполнении обработчика - 'ПриКомпоновкеРезультата'
по причине:
{ВнешнийОтчет.ДолгиПродажиОплатыСебестоимость.МодульОбъекта(73)}: Поле объекта не обнаружено (Ж15)

поле назвала Ж15

МассивИменПараметров = ПолучитьИменаПараметровВМакетеКомпоновкиПоИмениПоля("Ж15", ЭлементРезультата.Макет, МакетКомпоновкиДанных, КэшИменПараметровМакетов);

Для Каждого ИмяПараметра из МассивИменПараметров Цикл
ЭлементРезультата.ЗначенияПараметров[ИмяПараметра].Значение = "Наше значение поля СКД"
КонецЦикла
10. lmnlmn 71 02.09.20 08:57 Сейчас в теме
(9) А что там в строке 73 на которую ошибка ссылается?
11. XelOla 19 02.09.20 10:31 Сейчас в теме
(10)
ЭлементРезультата.ЗначенияПараметров[ИмяПараметра].Значение = "Наше значение поля СКД"
Кажется, я поняла. "ПХ" - это обязательное имя, а вы присваиватете значение предпоследнему П.
Просто я там Ж15 сразу написала.
12. lmnlmn 71 02.09.20 13:46 Сейчас в теме
(11) Да, имя параметра только в ПолучитьИменаПараметровВМакетеКомпоновкиПоИмениПоля указывается.
Для отправки сообщения требуется регистрация/авторизация