Приветствую, уважаемое сообщество !
Пришло время оприлюдить очередную часть наших разработок по платформе Ленкодо.
В этой статье я хочу поведать о родной компоненте Прямоток для выполнения прямых запросов в mssql или postgresql субд.
Данная статья является письменным описанием экрозаписи, которая находится на видео-размещении ютуба.
Посмотреть можно здесь.
Сразу должен оговориться, что 1С не рекомендует работать с базой через прямые запросы.
Применение прямых запросов требует особой внимательности и достаточной квалификации и находится вне способ работы с бд, которые "описаны в сопроводительной документации".
Приступим !
Многие лучшие умы нашего сообщества размышляют о вопросах скорости работы 1Ски с субд.
Как известно, 1Ска берет на себя большую часть работ по преобразованию строки таблицы в субд в 1Сные объекты.
Это удобно писать и поддерживать, только за это приходится платить скоростью работы.
Для наших задач работы с вебом нам нужна скорость. Потому мы пошли по пути прямых запросов к субд.
Для примера опишем случай из нашей практики создания веб-морд для 1Ски где прямые запросы к субд ускорили работу.
Случай "Без Прямотока"
На веб-морду заходит гость, опознается под своей учеткой, открывает карточку товара и указателем мыши щелкает иконку "Любо".
Обозреватель отправляет в 1Ску ИдУчетки и ИдТовара с командой добавления щелкнутого товара в ТЧ "Избранное" для учетки гостя.
1Ска по идУчетки находит ссылку учетки, по ссылке делается объект справочника "Учетки", по ссылке ИдТовара ищется элемент справочника "Товары", в объект "Учетки" добавляется строка таб.части "Избранное" с товаром, объект учетки записывается, клиенту в обозреватель уходит сообщение "АГА, Запись выполнена", в обозревателе щелкнутая иконка зрительно отмечается цветом.
Сложно и долго.
В защиту такого случая могу сказать, что это рекомендованный способ от 1С.
Случай "С Прямотоком"
На веб-морду заходит гость, опознается под своей учеткой, открывает карточку товара и указателем мыши щелкает иконку "Любо".
Обозреватель отправляет в 1Ску ИдУчетки и ИдТовара с командой добавления щелкнутого товара в ТЧ "Избранное" для учетки.
1Ска отправляет на выполнение запрос помещения:
Поместить Справочник.Учетки.Избранное
(
Ссылка
Товар
)ЗНАЧЕНИЯ (
ИдУчетки,
ИдТовара
)
клиенту в обозреватель уходит сообщение "АГА, Запись выполнена",
в обозревателе щелкнутая зрительно иконка отмечается цветом.
Быстро и просто.
Описание СУЧИ Прямотока
С - Создание
У - Удаление
Ч - Чтение
И - Изменение
Прямоток это внешняя родная компонента, которая может выполнять следующее:
* Разбор пред_sql текстов в json формат;
* Выполнение запросов в mssql через драйвер, который пользует 1Сный сервер (ставится автоматически при установке mssql сервера);
* Выполнение запросов в pg через встроенный в компоненту драйвер;
* Обработка результатов запроса (двоичники в булево для mssql, смещение дат для mssql, приведение данных типа Дата к 1Сному формату);
* Возврат данных в 1С в виде json строки.
Прямоток может применяться для:
* Создания строк, постоянных или временных таблиц;
* Удаления строк и таблиц
* Чтения данных из субд;
* Изменения строк;
Через Прямоток можно создавать хранимые процедуры и выполнять код на языке субд.
Технически возможность есть, однако в нашей работе такое не применяется.
Для Прямотока есть две обертки: ПриказчикЗапросов и КонсольЗапросов.
Обертка "ПриказчикЗапросов"
Задачи ПриказчикаЗапросов это собрать sql текст на основании json результата разбора и таблицы со структурой субд.
Хранить кешированные ранее собранные sql тексты для быстрого доступа.
Предоставлять морду для работы с Прямотоком как с обычной обработкой.
Подставлять параметры в текст запроса.
Обертка "КонсольЗапросовПрямоток"
КонсольЗапросов это обертка для написания и отладки sql запросов в режиме Предприятия.
В КонсолиЗапросов есть встроенные помощники для того, чтобы автор мог писать пред_sql тексты без нужности запоминания функций.
В качестве правщика пользуется поле текстового документа с расширением "Язык запросов" для подсветки и возможности вызова 1Сного конструктора запросов.
Как я говорил в экрозаписи в свертке "Отступление 1" в базовом виде Прямоток может принимать 1Сные тексты запросов и успешно их отрабатывать.
[Экроснимок1. КонсольЗапросовПрямоток]
Описание принципа работы Прямотока
Работа Прямотока основана на табличке, которую предоставляет метод ПолучитьСтруктуруХраненияБазыДанных().
После разбора пред_sql текст в json, этот json будет собираться в запрос по данным этой таблички.
[Экроснимок2. Жизненный цикл разбора]
Табличка структуры может запрашиваться при каждом запуске системы.
Это позволяет всегда работать с насущной текущей правильной структурой, что почти исключает риски того, что прямые запросы сломаются.
Каждый раз при запуске системы будет обновлена табличка структуры, тексты пред_sql будут разобраны и заново собраны.
Собранные sql тексты можно хранить в ПриказчикеЗапросов по имени и доставать их по имени в уже готовом виде.
Подставил параметры и запустил на выполнение.
Тесты скорости и больше информации можно посмотреть в экрозаписи.
Работа с функциями субд
Для каждой субд существует свой набор встроенных функций и их можно применять совместно с пред_sql синтаксисом.
Например, функция coalesce() как более широкий межсубдшный вариант isnull() функции.
При разборе пред_sql текстов Прямоток автоматически определяет функцию и передает ее в json строку результата для включения в итоговый sql текст.
При этом в Прямотоке нет списка встроенных функций, можно пользовать хоть co1al2es3ce() имя функции.
[Экрозапись3. Перевод пред_sql в sql с функциями]
При построении sql текста в ПриказчикеЗапросов можно добавить самодельную замену своим текстом вместо указанной функции.
[Экроснимок4. Замена самодельных функций на этапе сборки]
На этом принципе подмены при составлении построена работа функций для работы с составными типами.
Поддержка СУБД
Прямоток имеет встроенную поддержку работы с mssql и pg субд.
Выбор субд зависит от строки подключения.
Для подключения к mssql строка подключения должна начинаться с "mssql"
mssql://st:000@bases1srazr/priamotok
Для подключения к pg строка подключения должна начинаться с "postgresql"
postgresql://sa:000@bases1srazr:5432/test_postgre
В Прямоток уже встроена поддержка различий между субд.
Например, автоматическое смещение дат и преобразование двоичников '0x00' или '0x01' в булево при получении данных из mssql субд.
---
Данная статья является сжатым и кратким описанием экрозаписи с ютуба из "Свертки 1" выше.
Данная статья носит исключительно информационно-развлекательный характер для возможной пищи многим пытливым умам.
Это описание того, как сделали мы. Возможно, некоторым это даст некоторую подсказку направления в их задачах.
В любом случае, буду надеяться что информация будет полезна или интересна.
Если у вас появились некоторые вопросы или вы хотите лично написать что-то умное, доброе или светлое, то прошу писать в личку учетки.
Оставайтесь на связи, у нас еще много неоприлюдненного интересного !