Произвольный источник данных запроса на основе коллекции

Язык запросов поддерживает работу с произвольными источниками данных на основе коллекций встроенного языка. В качестве элементов коллекций могут использоваться любые экземпляры, у которых есть свойства, также могут использоваться соответствия.

Коллекция передается в язык запросов через параметр. В самом языке запросов имя параметра используется в качестве таблицы — источника данных. Свойства и строковые ключи соответствий отображаются на поля такой «таблицы». Можно использовать только значения типов, которые поддерживаются в языке запросов.

Язык запросов не меняет коллекции — то есть можно передавать «читаемые» варианты (ЧитаемыйМассив, ЧитаемоеМножество и пр.).

Структура источника данных

Для описания структуры источника данных используется тип ОписаниеИсточникаДанных. Колонка должна присутствовать во всех элементах коллекции в качестве одноименного свойства или строкового ключа соответствия.

Можно использовать коллекции и без явного описания, т. е. передавать в качестве значения параметра непосредственно саму коллекцию, а не экземпляр ОписаниеИсточникаДанных.

При использовании коллекций без явного описания есть следующие особенности:

  • В качестве полей источника будут доступны свойства, присутствующие во всех элементах коллекции, и/или одноименные строковые ключи структур.
  • Тип данных определяется по объединению типов всех значений свойства (в т. ч. и описатели типов — длины строк и т. п.). Это может быть неэффективно для больших коллекций.
  • При исполнении запроса с таким источником отключается кеширование части внутренней информации в языке запросов. Повторное исполнение запросов с такими источниками будут осуществляться медленнее;
  • Выборка из пустых коллекций не поддерживается.

Примеры

Явное описание источника данных:

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

Неявное описание источника данных:

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