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









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

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

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

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

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


 

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

Функция ПолучитьТаблицуИзМакета(ИмяМакета, НаборДанных, Параметры = Неопределено)

СхемаКомпоновкиДанных = ПолучитьМакет(ИмяМакета);
КомпоновщикМакета     = Новый КомпоновщикМакетаКомпоновкиДанных;
ПроцессорКомпоновки   = Новый ПроцессорКомпоновкиДанных;
ПроцессорВывода       = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;

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

Возврат Результат;

КонецФункции

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

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

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

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

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

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

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

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

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

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

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

Функция ПолучитьТаблицуИзМакета(ИмяМакета, НаборДанных, Параметры = Неопределено, Результат = Неопределено)

СхемаКомпоновкиДанных = ПолучитьМакет(ИмяМакета);
КомпоновщикМакета   = Новый КомпоновщикМакетаКомпоновкиДанных;
ПроцессорКомпоновки   = Новый ПроцессорКомпоновкиДанных;
ПроцессорВывода    = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;

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

Если Результат <> Неопределено Тогда
ПроцессорВывода.УстановитьОбъект(Результат);
КонецЕсли;

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

Возврат Результат;

КонецФункции

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

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

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

5 Comments

  1. pm74

    любопытно конечно

    только я не понял в чем плюс скд в сравнении с простым перебором строк/колонок

    Reply
  2. kasper076

    (1) Да больше из любопытства. Но и универсальность тоже. скормил функции область, а она те ТЗ, да еще и с отборами, если необходимо.

    Reply
  3. echo77

    (0) Если я правильно понял — публикация о том, что можно СКД скормить область табличного документа и по ней скомпоновать результат. Если это так, то лучше в заголовке статьи отразить именно то, что вы хотите показать компоновку СКД по данным табличного документа.

    Как вывести данные из СКД в табличный документ или в коллекцию значений описано уже здесь: https://infostart.ru/public/80164/

    Reply
  4. kasper076

    (3) Публикация про то, что если ПроцессоруВывода установить объект (ТаблицаЗначений. ДеревоЗначений), то выгружаемые данные будут приведены к типам соответствующих колонок.

    Reply
  5. Olenevod

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

    Reply

Leave a Comment

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