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

21.11.24

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

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Однопальцевое преобразование запроса на 1С в запрос на SQL:
.epf 37,08Kb
60
60 Скачать (3 SM) Купить за 2 450 руб.

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

Внешний вид обработки достаточно прост: в левой части помещается текст на встроенном языке 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

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

Проверено на следующих конфигурациях и релизах:

  • 1С:ERP Управление предприятием 2, релизы 2.5.20.55

Postgres MS SQL PG10 PG13

См. также

SALE! 15%

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

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

10000 руб.

02.09.2020    159415    872    399    

861

SALE! 15%

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

Инструмент представляет собой обработку для проведения свёртки или обрезки баз данных. Работает на ЛЮБЫХ конфигурациях (УТ, БП, ERP и т.д.). Поддерживаются управляемые и обычные формы. Может выполнять свертку сразу нескольких баз данных и выполнять их автоматически без непосредственного участия пользователя.

8400 7140 руб.

20.08.2024    7768    55    22    

66

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

Инструмент для написания и отладки кода в режиме «1С:Предприятие». Представляет собой консоль кода с возможностью пошаговой отладки, просмотра значений переменных любых типов, использования процедур и функций, просмотра стека вызовов, вычисления произвольных выражений на встроенном языке в контексте точки останова, синтаксического контроля и остановки по ошибке. В консоли используется удобный редактор кода с подсветкой, контекстной подсказкой, возможностью вызова конструкторов запроса и форматной строки.

9360 руб.

17.05.2024    23433    68    45    

117

SALE! 15%

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

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

10000 8500 руб.

10.11.2023    10417    36    21    

61

SALE! 15%

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

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

22200 19980 руб.

06.10.2023    15397    35    7    

70

SALE! 35%

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

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

4800 3120 руб.

14.01.2013    187975    1138    0    

912

SALE! 15%

Инструментарий разработчика Программист 8.3.14 1С:Конвертация данных Россия Платные (руб)

Расширение для конфигурации “Конвертация данных 3”. Добавляет подсветку синтаксиса, детальную контекстную подсказку, глобальный поиск по коду.

15000 12750 руб.

07.10.2021    17302    6    32    

42

Инструментарий разработчика Программист Платные (руб)

Менеджер конфигураций 1С — альтернативный стартер информационных баз 1С:Предприятие.

1800 руб.

21.02.2023    7694    8    35    

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


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