Выпущена новая версия языка запросов 1QL.
Скачать дистрибутив и документацию можно здесь.
Данная статья является продолжением моего выступления на Infostart 2019 Inception. В этой статье я расскажу о развитии проекта и его новых возможностях. Для того, чтобы не нарушать права фирмы 1С на её торговый знак, проект переименован на DaJet.
Название DaJet (даджет) образовано от слов data (данные) и jet (реактивный).
Кроме этого является модификацией слова gadget (гаджет) и может быть интерпретировано как "приспособление для работы с данными".
Новые возможности.
1. Добавлена возможность обращаться в одном запросе не только к разным базам данным, расположенным на одном экземпляре SQL Server, но и к связанным (linked) серверам.
2. Реализован сервер web api, позволяющий переводить запросы в терминах 1С в запросы на T-SQL, а также выполнять эти запросы при помощи любого web api клиента.
3. Используется новый парсер языка запросов, поддерживающий практически полный синтаксис SQL Server 2005-2016. Это означает, что поддерживаются как DDL, так и DML инструкции. Также возможно использование DMV, табличных переменных, оконных функций, табличных указаний (хинтов) и т.д. и т.п.
4. Использование нового парсера в перспективе позволяет добавлять в синтаксис языка запросов собственные функции, собственную логику выполнения запроса, а также выполнять программный анализ запроса по заданным критериям.
Как это работает.
1. Выгружаем метаданные 1С при помощи специальной обработки в XML.
2. Настраиваем web сервер DaJet QL, который реализован на базе web сервера Kestrel (в основном описываем структуру каталогов сервера СУБД и указываем URL).
3. Выполняем запросы к web серверу DaJet QL при помощи web api.
В целях ознакомления с функционалом DaJet QL web api в качестве клиента можно использовать Postman. Коллекция вызовов web api для импорта в Postman прилагается.
Кроме этого, к данной статье прилагается демонстрационный web api клиент в виде обработки 1С.
Репозиторий DaJet QL на GitHub
Продолжение: "JSON в запросах DaJet QL".
Описание web api сервера DaJet QL.
GET metadata/use
Пример:
http://localhost:5000/metadata/use
Показывает текущий сервер и базу данных, которые используются web сервером DaJet QL в данный момент.
POST metadata/use/{server}/{database}
Пример:
http://localhost:5000/metadata/use/mysrv/mydb
Устанавливает текущий сервер и базу данных для web сервера DaJet QL, в контексте которых выполняются последующие запросы к СУБД. Аналог команды USE [database] SQL Server.
Вызов этого метода обязателен до того, как выполнять запросы.
POST script/translate
Пример:
http://localhost:5000/script/translate
Тело запроса:
{
"script": "SELECT Ссылка FROM Документ.ПоступлениеТоваровУслуг"
}
Тело ответа:
{
"script" : "SELECT _IDRRef FROM _Document123"
}
Этот метод позволяет посмотреть какой запрос SQL формирует web сервис DaJet QL перед его выполнением.
POST script/execute
Пример:
http://localhost:5000/script/execute
Тело запроса:
{
"script": "SELECT Ссылка FROM Документ.ПоступлениеТоваровУслуг"
}
Тело ответа:
[
{ "_IDRRef" : "{123:da142d98-b1e9-489a-11e5-cfdd69e2ce6c}" },
{ "_IDRRef" : "{123:da142d98-b1e9-489a-11e5-cfdd69e2ce73}" }
]
Метод выполняет запрос и возвращает результат его выполнения в формате JSON (массив структур записей).
Ограничения языка запросов.
1. Работа с составными типами данных 1С, содержащими простые типы данных, не поддерживается. Поддерживается только работа с составными ссылочными типами данных.
2. Обращение к реквизитам объектов через точку (операция разыменования) с автоматической генерацией LEFT JOIN в запросах SQL не поддерживается. Подробнее о работе с реквизитами ссылочного типа будет рассказано ниже.
Обращение к объектам в запросах.
1. Обращение к объекту в контексте текущей базы данных:
Документ.ПоступлениеТоваровУслуг
2. Обращение к табличной части объекта в контексте текущей базы данных:
Документ.ПоступлениеТоваровУслуг.Товары
3. Обращение к объекту из другой базы данных:
[torg_db].Документ.ПоступлениеТоваровУслуг
4. Обращение к табличной части объекта из другой базы данных:
[torg_db].Документ.ПоступлениеТоваровУслуг.Товары
5. Обращение к объекту связанного сервера:
[bi_server].[torg_db].Документ.ПоступлениеТоваровУслуг
6. Обращение к табличной части объекта связанного сервера:
[bi_server].[torg_db].Документ.[ПоступлениеТоваровУслуг+Товары]
В последнем случае использование шаблона вида [{Объект}+{ТЧ}] обязательно, так как парсер языка запросов умеет работать только с идентификаторами таблиц, имеющими 4 составных части. Использование квадратных скобок и символа "+" также обязательно.
При этом можно также обращаться к таблицам СУБД по их настоящим именам, заданным на уровне СУБД, например, так: SELECT _IDRRef FROM _Document123.
Это даёт возможность обращения в одном запросе к таблицам других СУБД, выгрузки данных во внешние источники или их загрузки из них. Например, это может выглядеть так:
SELECT
РТУ.СуммаДокумента AS СуммаРеализации,
CO.OrderSum AS СуммаЗаказа
FROM
Документ.РеализацияТоваровУслуг AS РТУ
LEFT JOIN [orders_db].CustomerOrders AS CO
ON РТУ.Номер = CO.DocNumber
Обращение к ссылочным реквизитам в запросах.
Язык запросов DaJet QL работает с ссылочными типами данных не так как 1С. Для работы с такими внутренними значениями ссылки как код типа данных объекта (TRef) и уникальным идентификатором объекта (RRef)в языке запросов DaJet QL на уровне парсера реализована работа с такими специализированными свойствами ссылки как uuid, type и TYPE.
Например выполним следующий запрос:
SELECT TOP 1
Ссылка,
Вступайте в нашу телеграмм-группу Инфостарт