Однопальцевое преобразование "одинэсного" запроса в запрос на SQL v 1.0

15.09.23

Разработка - Инструментарий разработчика

Обработка предназначена для преобразования "одинэсных" запросов в запросы на SQL средствами встроенного языка. Разработка не претендует на то, чтобы на 100% повторить то, что разработчики видят при трассировке запросов в инструментах вроде Profiler. Но во многих случаях результат преобразования можно будет без дополнительной ручной обработки выполнить, например, в Managment studio. Актуальные ограничения и проблемы преобразователя описаны в статье. Работает с версией платформы не ниже 8.3.10.

Скачать исходный код

Наименование Файл Версия Размер
Однопальцевое преобразование запроса на 1С в запрос на SQL:
.epf 37,08Kb
51
.epf 37,08Kb 51 Скачать

Описание работы

Внешний вид обработки достаточно прост: в левой части помещается текст на встроенном языке 1С. В правой части результат. В центре управляющие кнопки.

Требования к тексту на языке 1С:

 - Он обязательно должен открываться конструктором запросов. Без этого преобразование невозможно т.к парсинг текста происходит средствами этого механизма.

-  Запрос обязательно должен быть отформатирован при помощи конструктора запросов. 

 

Внешний вид обработки

 

Описания команд:

1. При нажатии кнопки происходит непосредственное преобразование запроса на SQL

2. Открывается конструктор запросов

3. Открывается форма задания параметров запроса

4. Происходит разыменование полей через точку.

 

Возможности и "фишки" обработки.

 

1. Преобразование параметров 

 

Обработка имеет возможность задать параметры запроса и преобразовать их в SQL. Внешний вид формы задания представлен на рисунке. После указания значений можно нажать кнопку "Заполнить параметры SQL". В таком случае они подставятся в результат. 

 

Форма параметров

 

Например, для запроса 

ВЫБРАТЬ ПЕРВЫЕ 50
    Контрагенты.Наименование КАК Наименование,
    ВложенныйЗапрос.РУ КАК РУ
ИЗ
    Справочник.Контрагенты КАК Контрагенты
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ ПЕРВЫЕ 150
            РеализацияУслуг.Ссылка КАК РУ,
            РеализацияУслуг.Контрагент КАК Контрагент
        ИЗ
            Документ.РеализацияУслуг КАК РеализацияУслуг
        ГДЕ
            РеализацияУслуг.Дата < &Дата) КАК ВложенныйЗапрос
        ПО (Контрагенты.Ссылка = ВложенныйЗапрос.Контрагент)
ГДЕ
    Контрагенты.Ссылка = &Ссылка

СГРУППИРОВАТЬ ПО
    Контрагенты.Наименование,
    ВложенныйЗапрос.РУ

Результат преобразования будет:

SELECT TOP 50
Контрагенты._Description Наименование,
ВложенныйЗапрос.РУ РУ
FROM
_Reference35 Контрагенты
INNER JOIN (SELECT TOP 150
РеализацияУслуг._IDRRef РУ,
РеализацияУслуг._Fld1114RRef Контрагент
FROM
_Document1109 РеализацияУслуг

WHERE
РеализацияУслуг._Date_Time < {ts '2021-04-16 12:00:00'}) ВложенныйЗапрос
ON Контрагенты._IDRRef = ВложенныйЗапрос.Контрагент
WHERE
Контрагенты._IDRRef = CAST(0xA277CD71A26B4BEA4F311172C8623727  AS binary(16))

GROUP BY
Контрагенты._Description,
ВложенныйЗапрос.РУ

2. Преобразование вложенных запросов

Обработка отлично справляется с вложенными запросами. Количество уровней при этом неважно. Например, запрос для получения "среза последних" без обращения к виртуальной таблице:

ВЫБРАТЬ
    ВложенныйЗапрос1.Подразделение КАК Подразделение,
    ВложенныйЗапрос1.Период КАК Период,
    ВложенныйЗапрос1.Должность КАК Должность
ИЗ
    (ВЫБРАТЬ
        ВложенныйЗапрос.Подразделение КАК Подразделение,
        ВложенныйЗапрос.Период КАК Период,
        ОтветственныеЛица.Должность КАК Должность
    ИЗ
        (ВЫБРАТЬ
            ОтветственныеЛица.Подразделение КАК Подразделение,
            МАКСИМУМ(ОтветственныеЛица.Период) КАК Период
        ИЗ
            РегистрСведений.ОтветственныеЛица КАК ОтветственныеЛица
        ГДЕ
            ОтветственныеЛица.Период <= &Период
        
        СГРУППИРОВАТЬ ПО
            ОтветственныеЛица.Подразделение) КАК ВложенныйЗапрос
            ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ОтветственныеЛица КАК ОтветственныеЛица
            ПО ВложенныйЗапрос.Период = ОтветственныеЛица.Период
                И ВложенныйЗапрос.Подразделение = ОтветственныеЛица.Подразделение) КАК ВложенныйЗапрос1

будет преобразован в 
 

SELECT
ВложенныйЗапрос1.Подразделение Подразделение,
ВложенныйЗапрос1.Период Период,
ВложенныйЗапрос1.Должность Должность

(SELECT
ВложенныйЗапрос.Подразделение Подразделение,
ВложенныйЗапрос.Период Период,
ОтветственныеЛица._Fld7656RRef Должность
FROM
(SELECT
ОтветственныеЛица._Fld7654RRef Подразделение,
MAX(ОтветственныеЛица._Period) Период
FROM
_InfoRg7653 ОтветственныеЛица

WHERE
ОтветственныеЛица._Period <= {ts '2021-04-15 12:00:00'}

GROUP BY
ОтветственныеЛица._Fld7654RRef) ВложенныйЗапрос
INNER JOIN _InfoRg7653 ОтветственныеЛица
ON ВложенныйЗапрос.Период = ОтветственныеЛица._Period
AND ВложенныйЗапрос.Подразделение = ОтветственныеЛица._Fld7654RRef) ВложенныйЗапрос1

2. Разыменование полей "через точку"

Обработка позволяет в автоматическом режиме задать явное левое соединение к таблицам, реквизиты которой получаются через точку. Функция нерекурсивна. Поэтому если точек несколько, то нажать кнопку соответствующее количество раз. Составные типы предусмотрены. Например, запрос

 

ВЫБРАТЬ
    Контрагенты.Родитель.Автор.Код КАК РодительАвторКод,
    Контрагенты.Наименование КАК Наименование
ИЗ
    Справочник.Контрагенты КАК Контрагенты

Преобразуется сначала в 

ВЫБРАТЬ
    КонтрагентыРодительКонтрагенты.Автор.Код КАК РодительАвторКод,
    Контрагенты.Наименование КАК Наименование
ИЗ
    Справочник.Контрагенты КАК Контрагенты
        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК КонтрагентыРодительКонтрагенты
        ПО (Контрагенты.Родитель = КонтрагентыРодительКонтрагенты.Ссылка)

А при повторном нажатии в 

ВЫБРАТЬ
    КонтрагентыРодительКонтрагентыАвторПользователи.Код КАК РодительАвторКод,
    Контрагенты.Наименование КАК Наименование
ИЗ
    Справочник.Контрагенты КАК Контрагенты
        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК КонтрагентыРодительКонтрагенты
            ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Пользователи КАК КонтрагентыРодительКонтрагентыАвторПользователи
            ПО (КонтрагентыРодительКонтрагенты.Автор = КонтрагентыРодительКонтрагентыАвторПользователи.Ссылка)
        ПО Контрагенты.Родитель = КонтрагентыРодительКонтрагенты.Ссылка

 

После того, как все обращения "через точку" будут ликвидированы, можно преобразовать в текст на SQL

 

SELECT
КонтрагентыРодительКонтрагентыАвторПользователи._Code РодительАвторКод,
Контрагенты._Description Наименование
FROM
_Reference35 Контрагенты
LEFT OUTER JOIN _Reference35 КонтрагентыРодительКонтрагенты
ON Контрагенты._ParentIDRRef = КонтрагентыРодительКонтрагенты._IDRRef
LEFT OUTER JOIN _Reference169 КонтрагентыРодительКонтрагентыАвторПользователи
ON КонтрагентыРодительКонтрагенты._Fld10297RRef = КонтрагентыРодительКонтрагентыАвторПользователи._IDRRef

 

3. Временные таблицы

Обработка умеет работать с временными таблицами: создает описание и обеспечивает заполнение. Например, запрос на языке 1С 

ВЫБРАТЬ ПЕРВЫЕ 100
    Контрагенты.Ссылка КАК Ссылка,
    Контрагенты.ИНН КАК ИНН
ПОМЕСТИТЬ ВТ_Контрагенты
ИЗ
    Справочник.Контрагенты КАК Контрагенты

;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    РеализацияУслуг.Номер КАК Номер,
    РеализацияУслуг.Дата КАК Дата,
    РеализацияУслуг.ДокументОснование КАК ДокументОснование,
    ВТ_Контрагенты.ИНН КАК ИНН
ИЗ
    ВТ_Контрагенты КАК ВТ_Контрагенты
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияУслуг КАК РеализацияУслуг
        ПО ВТ_Контрагенты.Ссылка = РеализацияУслуг.Контрагент

 

Будет выглядеть как

 If not exists (select * from tempdb..sysobjects where name =  '##ВТ_Контрагенты') Create table ##ВТ_Контрагенты(Ссылка  binary(16),ИНН  nvarchar(150))
INSERT INTO ##ВТ_Контрагенты WITH(TABLOCK) (Ссылка,ИНН)SELECT TOP 100
Контрагенты._IDRRef Ссылка,
Контрагенты._Fld2119 ИНН
FROM
_Reference35 Контрагенты

SELECT
РеализацияУслуг._Number Номер,
РеализацияУслуг._Date_Time Дата,
РеализацияУслуг._Fld3984_RRRef ДокументОснование,
ВТ_Контрагенты.ИНН ИНН
FROM
##ВТ_Контрагенты ВТ_Контрагенты
INNER JOIN _Document1109 РеализацияУслуг
ON ВТ_Контрагенты.Ссылка = РеализацияУслуг._Fld1114RRef
TRUNCATE TABLE  ##ВТ_Контрагенты

 

4. Виртуальные таблицы.

В текущей версии можно задать только "СрезПоследних" и "Обороты" для регистра накопления. Список планируется расширить в дальнейшем. 

Например, запрос

ВЫБРАТЬ
    ОтветственныеЛицаСрезПоследних.Период КАК Период,
    ОтветственныеЛицаСрезПоследних.Подразделение КАК Подразделение,
    ОтветственныеЛицаСрезПоследних.Должность КАК Должность
ИЗ
    РегистрСведений.ОтветственныеЛица.СрезПоследних(&Период, Подразделение = &Подразделение) КАК ОтветственныеЛицаСрезПоследних


    

Будет преобразован в 

SELECT
ОтветственныеЛицаСрезПоследних.Период Период,
ОтветственныеЛицаСрезПоследних.Подразделение Подразделение,
ОтветственныеЛицаСрезПоследних.Должность Должность
FROM
(SELECT
ВложенныйЗапросМаксПериод.Подразделение Подразделение,
ОтветственныеЛица._Fld7656RRef Должность,
ОтветственныеЛица._Period Период
FROM
(SELECT
ОтветственныеЛица._Fld7654RRef Подразделение,
MAX(ОтветственныеЛица._Period) Период
FROM
_InfoRg7653 ОтветственныеЛица

WHERE
ОтветственныеЛица._Period <= {ts '2021-04-15 12:00:00'} AND 
ОтветственныеЛица._Fld7654RRef = CAST(0x831A001A64963CBD11E06B2D4EAA2070  AS binary(16))

GROUP BY
ОтветственныеЛица._Fld7654RRef
) ВложенныйЗапросМаксПериод
INNER JOIN _InfoRg7653 ОтветственныеЛица
ON ВложенныйЗапросМаксПериод.Подразделение = ОтветственныеЛица._Fld7654RRef
AND ВложенныйЗапросМаксПериод.Период = ОтветственныеЛица._Period) ОтветственныеЛицаСрезПоследних


 

Ограничения обработки:

-Не поддерживается большая часть функций языка запросов (ССЫЛКА, Выразить, ТипЗначения, НачалоПериода и тд)

-Не поддерживается большая часть виртуальных таблиц, за исключением парочки наиболее часто используемых

-Не поддерживаются таблицы изменений

-Пока встречаются ошибки

Проблемы, которые мешают разработке:

-В первую очередь это работа с составными типами. Особенно теми, где сочетаются примитивные и ссылочные типы значений. Загадочная 1Сная система из 3 полей пока не поддерживается

-Нет разделения данных

-Нет РЛС

-Нет разделения итогов (Spliter) и агрегатов.

 

Изменения в версии 0.9

-Добавлена возможность работы с параметрами - списками значений

-Исправлены некоторые ошибки

-Добавлена возможность подключиться к SQL и выполнить запрос прямо из обработки

-Добавлена возможность сохранять запросы и настройки

 

Изменения в версии 1.0

-исправлена ошибка с обращением к общим модулям

Postgres MS SQL PG10 PG13

См. также

Infostart Toolkit: Инструменты разработчика 1С 8.3 на управляемых формах

Инструментарий разработчика Роли и права Запросы СКД Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

10000 руб.

02.09.2020    124563    681    389    

732

Infostart PrintWizard

Пакетная печать Печатные формы Инструментарий разработчика Платформа 1С v8.3 Запросы 1С:Зарплата и кадры бюджетного учреждения 1С:Конвертация данных 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Платные (руб)

Инструмент, позволяющий абсолютно по-новому взглянуть на процесс разработки печатных форм. Благодаря конструктору можно значительно снизить затраты времени на разработку печатных форм, повысить качество и "прозрачность" разработки, а также навести порядок в многообразии корпоративных печатных форм.

18000 руб.

06.10.2023    7714    24    6    

42

Infostart УДиФ: Управление данными и формами

Инструменты администратора БД Инструментарий разработчика Роли и права Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Расширение позволяет без изменения кода конфигурации выполнять проверки при вводе данных, скрывать от пользователя недоступные ему данные, выполнять код в обработчиках. Не изменяет данные конфигурации, легко устанавливается практически на любую конфигурацию на управляемых формах.

10000 руб.

10.11.2023    4233    12    2    

36

SALE! %

PowerTools

Инструментарий разработчика Инструменты администратора БД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Россия Платные (руб)

Универсальный инструмент программиста для администрирования конфигураций. Сборник наиболее часто используемых обработок под единым интерфейсом.

3600 2880 руб.

14.01.2013    178561    1083    0    

861

Многопоточность. Универсальный «Менеджер потоков» 2.1

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Восстановление партий или взаиморасчетов, расчет зарплаты, пакетное формирование документов или отчетов - теперь все это стало доступнее. * Есть желание повысить скорость работы медленных алгоритмов! Но... * Нет времени думать о реализации многопоточности? * о запуске и остановке потоков? * о поддержании потоков в рабочем состоянии? * о передаче данных в потоки и как получить ответ из потока? * об организации последовательности? Тогда ЭТО - то что надо!!!

5000 руб.

07.02.2018    99580    239    97    

298

[ЕХТ] Фреймворк для Расширений 1С

Инструментарий разработчика Платформа 1С v8.3 Управляемые формы Платные (руб)

"Фреймворк для Расширений 1С" это универсальное и многофункциональное решение, упрощающее разработку и поддержку создаваемых Расширений. Поставляется в виде комплекта из нескольких Расширений с открытым исходным кодом. Работает в любых Конфигурациях в режиме Управляемого приложения с режимом совместимости 8.3.12 и выше без необходимости внесения изменений в Конфигурацию.

3000 руб.

27.08.2019    18348    6    8    

40

Выполнение произвольного кода или запроса с параметрами через Web-сервис (замена COM-подключений)

Инструментарий разработчика Обмен между базами 1C Платформа 1С v8.3 Платные (руб)

В процессе работы в 1С часто возникает потребность получить данные из другой базы.  Обычно это делается через COM-соединение, и время выполнения запроса при этом оставляет желать лучшего. В данной публикации представлено универсальное решение, позволяющее практически моментально выполнить произвольный код или запрос с параметрами в другой информационной базе через Web-сервис.

2400 руб.

24.09.2019    23840    16    15    

33

1С HTML Шаблоны / HTML Templates

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Быстрая и удобная обработка для работы с шаблонами HTML. Позволяет легко и быстро формировать код HTML.

2040 руб.

27.12.2017    28295    3    10    

15
Комментарии
Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. kirill_sh 1 17.04.21 16:04 Сейчас в теме
что-то примеры простые. Попробуйте в бухе на хозрасчетных сделать как там преобразить запрос в нормальный получиться?
2. kser87 2439 17.04.21 16:21 Сейчас в теме
(1) не получится. Я указал, что только виртуальные таблицы регистров сведений и накопления пока что работают. Не уверен, что регистры бухгалтерского учёта и расчета зп кому-то нужны в контексте скульных запросов
acces969; +1 Ответить
3. Sapiens_bru 4 18.04.21 04:08 Сейчас в теме
Инструмент в таком виде скорее демка, чем что то полезное. Те кто может запрос в ssms осмысленно запустить, простейшие запросы и от руки напишут.
Мне на просторах попадались консоли которые могут любой запрос показать в виде sql , да ещё и с планом запроса. Идея простая, консоль от себя добавляет в текст запроса строку-гуид, настраивает сбор ТЖ и оттуда забирает нужные тексты. Зачем дублировать функционал платформы когда можно его использовать.
4. kser87 2439 18.04.21 10:19 Сейчас в теме
(3) настраивать ТЖ таким образом не лучшая идея
13. kser87 2439 17.01.22 16:01 Сейчас в теме
(3) с PG вы видимо не сталкивались
5. kirill_sh 1 19.04.21 13:21 Сейчас в теме
Вот хороший пример для работы с запросами https://infostart.ru/public/1175954/ от Юрия Пермитина
6. kser87 2439 19.04.21 13:28 Сейчас в теме
(5) я не ставил цели транслировать запросы средствами MS SQL.
7. mikukrnet 181 22.04.21 11:45 Сейчас в теме
Нормальная тема, спасибо. Никаких проблем со строками подключения и т. п., сразу быстро получаем код для простых выборок и (самое важное) апдейтов с небольшим редактированием
8. kser87 2439 22.04.21 12:20 Сейчас в теме
(7) спасибо за коммент, вы очень верно поняли идею=)
9. jobkostya1c_ERP 100 09.07.21 10:15 Сейчас в теме
Хорошее дело. Вопрос мне лет 5 назад один московский руководитель яро доказывал что в скуль и профайлер лезть не надо. Мало ли как в разных условиях один и тот же запрос 1С может преобразоваться в той или иной СУБД даже при одних и тех же условиях. И в итоге что не надо писать такие сложные запросы на 1С, а разбивать на 2-3 простых и прочие вещи мелкой оптимизации. А обслуживать сам скуль - дело сисадминов.
Решил все-таки почитать курсы MS-SQL именно по запросам. Нашел старую методичку майкрософт (70-461) "Учебный курс Microsoft Создание запросов MS SQL Server 2012 microsoft-sql-server-2012-t-sql". Насколько все-таки это дело может быть полезно?
10. kser87 2439 01.09.21 11:35 Сейчас в теме
(9) насколько полезна метадочка? изучайте, лезьте в скуль, в профайлер и extened events. Это сейчас ценится. Админы-то разберутся с ними. Но правки все равно в 1С вносить.
11. SMakcik 113 20.09.21 15:23 Сейчас в теме
Если честно, автор, ты бы постыдился выкладывать недоделанное решение и еще брать за это мани.
Даже простые запросы не переделывает
12. kser87 2439 20.09.21 15:27 Сейчас в теме
(11) в описание указано, что обработка не умеет. какие простые запросы она не переделывает?
14. infostartchel 19 06.04.23 14:31 Сейчас в теме
Добрый день!
почему у вас указано что временные таблицы создаются глобальными с символами ##?
Cre ate table ##ВТ_Контрагенты
Профайлер при создании временной таблицы показывает имя что-то вроде #tt1
15. kser87 2439 06.04.23 16:25 Сейчас в теме
16. infostartchel 19 06.04.23 17:44 Сейчас в теме
(15)
двойная решетка ## означает что временная таблица будет видна для любой сессии подключения к временной таблице ##ВТ_Контрагенты. Если посмотреть запрос 1с профайлером, то временная таблица там идет с одной решеткой #tt1, что означает что таблица локальная видна только в текущей сессии. Так возникает вопрос почему у вас преобразуется запрос с двойной решеткой будто это глобальная таблица. Везде пишут что 1с локальную таблицу создает. Вот я не понял может вам удалось как-то найти способ объявлять временные таблицы глобальными? Я вот ищу способ можно ли получить запросом 1с глобальную временную таблицу на SQL или из локальной каким-то образом прочесть данные из другой сессии отличной от той что создана конструкцией "Новый Запрос".
17. kser87 2439 06.04.23 18:19 Сейчас в теме
(16) я запрос генерирую средствами 1С, поэтому вы скорее всего не по адресу
18. acces969 344 08.06.23 12:21 Сейчас в теме
Интересная идея, спасибо. Из 1С можно подключится к MSSQL через внешние источники данных?
19. kser87 2439 08.06.23 13:00 Сейчас в теме
20. acces969 344 08.06.23 13:34 Сейчас в теме
(19) Каким способом можно выполнить запрос TSQL из 1С в любой "взрослой" СУБД?
21. kser87 2439 08.06.23 13:43 Сейчас в теме
(20) моя обработка этого не пока умеет. Думаете, что стоит добавить подобный функционал?
22. acces969 344 08.06.23 13:50 Сейчас в теме
(21) Мне интересна эта тема. 1С имеет очень удобный интерфейс, который разработчиком может быть запрограммирован еще лучше. Неплохо бы 1С коннектить к внешним сервисам всеми доступными способами. Например, я делал перенос из учетной системы не 1С, которая хранилась в таблицах MySQL. Подключился к БД через внешние источники данных, после чего мог просматривать записи таблиц как элементы справочников 1С. Очень удобно.
Ну и моя консоль запросов к двум базам одновременно тоже тому пример (https://infostart.ru/1c/tools/1640927/).
23. kser87 2439 08.06.23 13:52 Сейчас в теме
(22) подумаю. Можно будет реализовать на досуге
24. SpartakM 71 13.09.23 14:03 Сейчас в теме
ПараметрыПодключения = ИнтеграцияADODB.ПараметрыПодключения(СтрокаСоединения, Сервер, Порт, БазаДанных, Логин, Пароль, Таймаут);


ИнтеграцияADODB - на это ругается... как исправить?
25. kser87 2439 27.10.23 18:12 Сейчас в теме
(24) исправил, могу выслать
26. Kerim09 18 05.04.24 02:00 Сейчас в теме
Добрый день. не работает в УТ запросе.
Почему-то ссылается на Поле которого у меня в запросе нет и не используется
Прикрепленные файлы:
Оставьте свое сообщение