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