Возникла необходимость загрузки данных из ТабличногоДокумента в ТаблицуЗначений для последующей обработки ее в запросе.
ТабличныйДокумент выглядит так:
Загрузку решено было сделать с использованием СКД. Был создан следующий макет:
В объекте "Область" передается ОбластьЯчеекТабличногоДокумента содержащая исходные данные.
Для получения ТаблицыЗначений использовалась следующая функция:
Функция ПолучитьТаблицуИзМакета(ИмяМакета, НаборДанных, Параметры = Неопределено)
СхемаКомпоновкиДанных = ПолучитьМакет(ИмяМакета);
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
Если Параметры <> Неопределено Тогда
КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных;
КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);
Для Каждого Параметр Из Параметры Цикл
КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра(Новый ПараметрКомпоновкиДанных(Параметр.Ключ), Параметр.Значение);
КонецЦикла;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.ПолучитьНастройки(), , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
Иначе
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, СхемаКомпоновкиДанных.НастройкиПоУмолчанию, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
КонецЕсли;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, НаборДанных, , Истина);
Результат = ПроцессорВывода.Вывести(ПроцессорКомпоновки);
Возврат Результат;
КонецФункции
Полученная ТаблицаЗначений далее использовалась в запросе:
Запрос = Новый Запрос(
"ВЫБРАТЬ
| ДанныеТабличногоДокумента.КодВнешнейСистемы КАК КодВнешнейСистемы,
| ДанныеТабличногоДокумента.КодERP КАК КодERP
|ПОМЕСТИТЬ ВТ_ДанныеТабличногоДокумента
|ИЗ
| &ДанныеТабличногоДокумента КАК ДанныеТабличногоДокумента");
В процессе разработки возникла необходимость дополнить значения колонки "КодERP" лидирующими нулями, что бы в дальнейшем получить ссылки на номенклатуру. Для этого был переделан макет компоновки данных. На закладке "Наборы данных" путь к колонке "КодERP" был изменен на "КраткийКодERP", на закладке "Вычисляемые поля" было добавлено ВычисляемоеПоле "КодERP" с выражением содержащим вызов функции общего модуля:
СтроковыеФункцииКлиентСервер.ДополнитьСтроку(КраткийКодERP, 11, "0", "Слева")
Настройки макета компоновки при этом не изменились.
Однако, при использовании полученной ТаблицыЗначений в запросе, стала появляться ошибка:
Причиной был тип колонки "КодERP", вернее его отсутствие. Напомню, что данная колонка была получена из вычисляемого поля.
Так выглядит колонка "КодERP" до использования ВычисляемогоПоля:
Так выглядит колонка "КодERP" после использования ВычисляемогоПоля:
Попытки использовать условное оформление и оформление ВычислямогоПоля ни к чему не привели. Это разъяснено на ИТС. Однако там не сказано, что если у объекта ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений вызвать метод УстановитьОбъект(), то при заполнении полей установленного объекта значения будут приведены к типу соответствующей колонки объекта.
Процедура получения таблицы значений была переделана:
Функция ПолучитьТаблицуИзМакета(ИмяМакета, НаборДанных, Параметры = Неопределено, Результат = Неопределено)
СхемаКомпоновкиДанных = ПолучитьМакет(ИмяМакета);
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
Если Параметры <> Неопределено Тогда
КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных;
КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);
Для Каждого Параметр Из Параметры Цикл
КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра(Новый ПараметрКомпоновкиДанных(Параметр.Ключ), Параметр.Значение);
КонецЦикла;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.ПолучитьНастройки(), , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
Иначе
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, СхемаКомпоновкиДанных.НастройкиПоУмолчанию, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
КонецЕсли;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, НаборДанных, , Истина);
Если Результат <> Неопределено Тогда
ПроцессорВывода.УстановитьОбъект(Результат);
КонецЕсли;
Результат = ПроцессорВывода.Вывести(ПроцессорКомпоновки);
Возврат Результат;
КонецФункции
В качестве параметра Результат передается таблица значений с типизированными колонками.
А так выглядит колонка КодERP после использования ВычисляемогоПоля и вызова метода УстановитьОбъект():
Полученная в итоге ТаблицаЗначений может использоваться в запросе.