Произвольный источник данных запроса на основе коллекции
Язык запросов поддерживает работу с произвольными источниками данных на основе коллекций встроенного языка. В качестве элементов коллекций могут использоваться любые экземпляры, у которых есть свойства, также могут использоваться соответствия.
Коллекция передается в язык запросов через параметр. В самом языке запросов имя параметра используется в качестве таблицы — источника данных. Свойства и строковые ключи соответствий отображаются на поля такой «таблицы». Можно использовать только значения типов, которые поддерживаются в языке запросов.
Язык запросов не меняет коллекции — то есть можно передавать «читаемые» варианты (ЧитаемыйМассив, ЧитаемоеМножество и пр.).
Структура источника данных
Для описания структуры источника данных используется тип ОписаниеИсточникаДанныхЗапроса. Колонка должна присутствовать во всех элементах коллекции в качестве одноименного свойства или строкового ключа соответствия.
Можно использовать коллекции и без явного описания, т. е. передавать в качестве значения параметра непосредственно саму коллекцию, а не экземпляр ОписаниеИсточникаДанныхЗапроса.
При использовании коллекций без явного описания есть следующие особенности:
- В качестве полей источника будут доступны свойства, присутствующие во всех элементах коллекции, и/или одноименные строковые ключи структур.
- Тип данных определяется по объединению типов всех значений свойства (в т. ч. и описатели типов — длины строк и т. п.). Это может быть неэффективно для больших коллекций.
- При исполнении запроса с таким источником отключается кеширование части внутренней информации в языке запросов. Повторное исполнение запросов с такими источниками будут осуществляться медленнее;
- Выборка из пустых коллекций не поддерживается.
Примеры
Явное описание источника данных:
...
структура КодИНаименование
пер Код: Число
пер Наименование: Строка
;
...
// Создать данные для вставки.
знч Значения = новый Массив<КодИНаименование>()
для Ит = 1 по 10000
Значения.Добавить(новый КодИНаименование(Ит, "Элемент " + Ит.ВСтроку()))
;
// Создать описание источника.
знч Источник = новый ОписаниеИсточникаДанныхЗапроса(Значения, {
"Код": ТипДанныхБазыДанных.Число(9, 0),
"Наименование": ТипДанныхБазыДанных.Строка(150)
})
// Создать и заполнить временную таблицу.
Запрос = Запрос{ВЫБРАТЬ
Код,
Наименование
ПОМЕСТИТЬ
ВременнаяТаблица
ИЗ
%Источник}
исп ОбластьВидимостиВременныхТаблиц.Открыть()
Запрос.Выполнить()
Неявное описание источника данных:
...
структура КодИНаименование
пер Код: Число
пер Наименование: Строка
;
...
// Создать данные для вставки.
знч Значения = новый Массив<КодИНаименование>()
для Ит = 1 по 10000
Значения.Добавить(новый КодИНаименование(Ит, "Элемент " + Ит.ВСтроку()))
;
// Создать и заполнить временную таблицу.
// Описатели типов у колонок временной таблицы будут зависеть от данных!
Запрос = Запрос{ВЫБРАТЬ
Код,
Наименование
ПОМЕСТИТЬ
ВременнаяТаблица
ИЗ
%Значения}
исп ОбластьВидимостиВременныхТаблиц.Открыть()
Запрос.Выполнить()