Вывод результата компоновки в таблицу и дерево значений

Публикация № 1002582

Программирование - Практика программирования

СКД

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

Возникла необходимость загрузки данных из ТабличногоДокумента в ТаблицуЗначений для последующей обработки ее в запросе.

ТабличныйДокумент выглядит так:

Загрузку решено было сделать с использованием СКД. Был создан следующий макет:

В объекте "Область" передается ОбластьЯчеекТабличногоДокумента содержащая исходные данные.


 

Для получения ТаблицыЗначений использовалась следующая функция:

Функция ПолучитьТаблицуИзМакета(ИмяМакета, НаборДанных, Параметры = Неопределено) 
	
	СхемаКомпоновкиДанных = ПолучитьМакет(ИмяМакета);
	КомпоновщикМакета     = Новый КомпоновщикМакетаКомпоновкиДанных;
	ПроцессорКомпоновки   = Новый ПроцессорКомпоновкиДанных;
	ПроцессорВывода       = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
	
	Если Параметры <> Неопределено Тогда
		КомпоновщикНастроек	= Новый КомпоновщикНастроекКомпоновкиДанных;
		КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);
		Для Каждого Параметр Из Параметры Цикл
			КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра(Новый ПараметрКомпоновкиДанных(Параметр.Ключ), Параметр.Значение);
		КонецЦикла;	
		МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.ПолучитьНастройки(), , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
	Иначе
		МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, СхемаКомпоновкиДанных.НастройкиПоУмолчанию, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
	КонецЕсли;
	ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, НаборДанных, , Истина);
	Результат = ПроцессорВывода.Вывести(ПроцессорКомпоновки);
	
	Возврат Результат;
	
КонецФункции	

Полученная ТаблицаЗначений далее использовалась в запросе:

	Запрос = Новый Запрос(
	"ВЫБРАТЬ
	|	ДанныеТабличногоДокумента.КодВнешнейСистемы КАК КодВнешнейСистемы,
	|	ДанныеТабличногоДокумента.КодERP КАК КодERP
	|ПОМЕСТИТЬ ВТ_ДанныеТабличногоДокумента
	|ИЗ
	|	&ДанныеТабличногоДокумента КАК ДанныеТабличногоДокумента");

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

СтроковыеФункцииКлиентСервер.ДополнитьСтроку(КраткийКодERP, 11, "0", "Слева")

Настройки макета компоновки при этом не изменились. 

Однако, при использовании полученной ТаблицыЗначений в запросе, стала появляться ошибка:

Причиной был тип колонки "КодERP", вернее его отсутствие. Напомню, что данная колонка была получена из вычисляемого  поля.

Так выглядит колонка "КодERP" до использования ВычисляемогоПоля:

Так выглядит колонка "КодERP" после использования ВычисляемогоПоля:

Попытки использовать условное оформление и оформление ВычислямогоПоля ни к чему не привели. Это разъяснено на ИТС. Однако там не сказано, что если у объекта  ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений вызвать метод УстановитьОбъект(), то при заполнении полей установленного объекта значения будут приведены к типу соответствующей колонки объекта.

Процедура получения таблицы значений была переделана:

Функция ПолучитьТаблицуИзМакета(ИмяМакета, НаборДанных, Параметры = Неопределено, Результат = Неопределено) 
	
	СхемаКомпоновкиДанных = ПолучитьМакет(ИмяМакета);
	КомпоновщикМакета	  = Новый КомпоновщикМакетаКомпоновкиДанных;
	ПроцессорКомпоновки   = Новый ПроцессорКомпоновкиДанных;
	ПроцессорВывода		  = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
	
	Если Параметры <> Неопределено Тогда
		КомпоновщикНастроек	= Новый КомпоновщикНастроекКомпоновкиДанных;
		КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);
		Для Каждого Параметр Из Параметры Цикл
			КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра(Новый ПараметрКомпоновкиДанных(Параметр.Ключ), Параметр.Значение);
		КонецЦикла;	
		МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.ПолучитьНастройки(), , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
	Иначе
		МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, СхемаКомпоновкиДанных.НастройкиПоУмолчанию, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
	КонецЕсли;
	ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, НаборДанных, , Истина);
	
	Если Результат <> Неопределено Тогда
		ПроцессорВывода.УстановитьОбъект(Результат);
	КонецЕсли;	

	Результат = ПроцессорВывода.Вывести(ПроцессорКомпоновки);
	
	Возврат Результат;
	
КонецФункции	

В качестве параметра Результат передается таблица значений с типизированными колонками.

А так выглядит колонка КодERP после использования ВычисляемогоПоля и вызова метода УстановитьОбъект():

Полученная в итоге ТаблицаЗначений может использоваться в запросе.

24

См. также

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
1. pm74 138 14.02.19 11:25 Сейчас в теме
любопытно конечно
только я не понял в чем плюс скд в сравнении с простым перебором строк/колонок
2. kasper076 43 14.02.19 13:13 Сейчас в теме
(1) Да больше из любопытства. Но и универсальность тоже. скормил функции область, а она те ТЗ, да еще и с отборами, если необходимо.
3. echo77 1068 18.02.19 14:03 Сейчас в теме
(0) Если я правильно понял - публикация о том, что можно СКД скормить область табличного документа и по ней скомпоновать результат. Если это так, то лучше в заголовке статьи отразить именно то, что вы хотите показать компоновку СКД по данным табличного документа.
Как вывести данные из СКД в табличный документ или в коллекцию значений описано уже здесь: https://infostart.ru/public/80164/
4. kasper076 43 18.02.19 17:04 Сейчас в теме
(3) Публикация про то, что если ПроцессоруВывода установить объект (ТаблицаЗначений. ДеревоЗначений), то выгружаемые данные будут приведены к типам соответствующих колонок.
Olenevod; +1 Ответить
5. Olenevod 23 20.02.19 22:34 Сейчас в теме
Считаю, что статья полезная и со своей полезной особенностью. Чтение области с помощью СКД и вывод в таблицу значений с обходом ошибки сэкономит время любому кто с этим еще не сталкивался.
Оставьте свое сообщение