Трансформатор 1С — SQL





Обработка для представления SQL запросов в терминах 1С, с возможностью захвата SQL запросов трассировкой.  Поддерживается также форматирование текста запроса через интернет сервис. Работает в управляемых и обычных формах, в том числе на веб-клиенте.

Возможности обработки

1) Трассировка реально выполняемого запроса SQL по заданному тексту запроса 1С

2) Замена наименований таблиц SQL запроса терминами 1С (например, вместо _Reference185 будет Справочник.ПодразделенияОрганизаций)

3) Представление ссылок в 1С «формате» (например, вместо 0x9E80A570B3B742FB44770FC3B9C6ACCD будет "Подразделения"   Перечисление.ВидыОбъектовДоступа)

4) Форматирование текста результирующего запроса с помощью интернет-сервиса «sqlformat.org»

Внешний вид обработки в обычных формах:

ОФ

в управляемых формах:

УФ

в браузере:

Для чего можно использовать

Пример 1

В первую очередь обработка будет удобна для анализа RLS, чтобы получить реально выполняемый запрос базы данных  со всеми ограничениями в удобочитаемом виде.

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

Исходный запрос:

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

Результат трансформации (все опции включены):

Видно, что к исходному запросу добавляется громоздкое условие проверяющее доступ пользователя к данной таблице. Предположим, что в организации не используется управленческий учет, тогда проверку доступа RLS можно упростить, отключив контроль по подразделению и оставив контроль по подразделению организации (Операции->Константы->Настройка параметров доступа на уровне записей). Обратите внимание, что при включенном флажке «Результат в терминах 1С», текст запроса максимально приближен к тексту запроса, корректного для выполнения в консоли запроса 1С. Что мне не удалось сделать, так это убрать из текста запроса проверки типа для составных полей, так как для этого пришлось бы использовать полноценный парсер языка запросов SQL. Чтобы запрос был полностью рабочим для консоли запросов, придется руками убрать проверку на составной тип, если такой используется в запросе. В приведенном примере нужно заменить строки

T7.ОбъектДоступа_TYPE = 0x08

AND T7.ОбъектДоступа_RTRef = 0x000000B5

AND T7.ОбъектДоступа = T1.Подразделение на строку

на строку

AND T7.ОбъектДоступа = T1.Подразделение на строку

А также строки

T9.ОбъектДоступа_TYPE = 0x08

AND T9.ОбъектДоступа_RTRef = 0x000000B6

AND T9.ОбъектДоступа = T1.ПодразделениеОрганизации

На строку

T9.ОбъектДоступа = T1.ПодразделениеОрганизации

Тогда запрос будет полностью корректным для языка запросов 1с и его можно будет выполнить в консоли.

 

Дополнительный способ проверки результирующего запроса в SQL

Если при выполнении трансформации снять флажок «Результат в терминах 1С», то результирующий текст запроса будет корректным для языка T-SQL и его можно выполнить в SQL Server Management Studio или в консоли запросов, которая поддерживает выполнение прямых запросов SQL (например моя простенькая консоль SQL запросов). Для нашего примера со списком сдельных нарядов результат будет следующим:

 

Результат трансформации (снят флажок «Результат в терминах 1С»):

Теперь запрос представлен в исходном SQL виде с дополнительными комментариями к параметрам запроса с представлениями ссылок в 1с и его можно выполнить как обычный запрос на языке T-SQL.

 

Пример 2

Еще один способ использования обработки – в связке с технологическим журналом, без использования трассировки. Пример: в доработанной конфигурации Документооборот 1.4 под некоторыми пользователями очень медленно открывается список внутренних документов. Настраиваем тех. журнал на отлов событий DBMSSQL и смотрим запросы, которые генерировала платформа при открытии формы списка (для настройки и анализа тех. журнала удобно пользоваться инструментами разработчика, но для просмотра можно использовать и типовую обработку с ИТС ПросмотрТехнологическогоЖурнала.epf). Находим следующий запрос:

 

Исходный запрос из технологического журнала:

Не очень удобно разбираться с таким запросом – нет форматирования, вместо параметров стоят вопросы и т.д., поэтому прогоняем его через трансформатор(все опции включены) и получаем такой вид:

 

Результат трансформации (все опции включены):

Видно, что однотипные ограничения RLS применяются 3 раза при выполнении запроса динамического списка (это можно понять по характерным конструкциям WHERE EXISTS() или по использованию области доступа «ДокументыИФайлы») и это может быть причиной медленной работы списка документов. С проверкой на доступ к таблице T1 «Справочник.ВнутренниеДокументы» сделать ничего не получится, так как это основная таблица списка, а вот оставшиеся 2 проверки под вопросом. «РегистрСведений.ОбщиеРеквизитыДокументов» T4 используется для получения реквизитов «КорреспондентыДляСписков», «ПредставлениеСостояния», «СодержитОригинал», а таблица «Справочник.ВидыВнутреннихДокументов» T12 используется для получения реквизита «ВидДокумента.ЯвляетсяКомплектомДокументов». Таким образом, можно либо не использовать поля на форме, которые приводят к вызову дополнительных проверок на права доступа, либо убрать проверку RLS для вспомогательного регистра с данными, так как проверка уже выполняется в основной таблице и эффекта от дополнительных проверок в данном запросе нет.

 

Пример 3

Еще один вариант использования обработки – исследование фактического запроса SQL при обращении к виртуальным таблицам 1с. Меня давно интересовал вопрос, как интерпретируется запрос к виртуальным таблицам. Если с таблицей остатков и оборотов регистров накопления все достаточно очевидно, то, например, с регистрами бухгалтерии было бы интересно посмотреть на фактический запрос при указании разных параметров. Рассмотрим достаточно простой запрос обращения к движениям с субконто за указанный период

ВЫБРАТЬ
ХозрасчетныйДвиженияССубконто.СчетДт,
ХозрасчетныйДвиженияССубконто.СубконтоДт1,
ХозрасчетныйДвиженияССубконто.Сумма
ИЗ
РегистрБухгалтерии.Хозрасчетный.ДвиженияССубконто(ДАТАВРЕМЯ(2024, 5, 1), ДАТАВРЕМЯ(2024, 5, 31), Счет = &Счет, , ) КАК ХозрасчетныйДвиженияССубконто

Прогоняем запрос через трансформатор(все опции включены) и получаем такой вид:

 

Результат трансформации (все опции включены):

Получен интересный листинг, который показывает, что фактически происходит выполнение нескольких запросов с формированием временных таблиц. Рассмотрим эти запросы:

1) Выполняется запрос к системной таблице актуальности итогов для всех регистров с отбором по регистру. Это нужно для определения необходимости использования служебных таблиц с итогами и периода, на который эти итоги существуют (может есть и другие функции этого запроса, но мои знания ограничиваются только периодами в итогах — дополняйте в комментариях:))

2) Здесь формируется таблица #tt2, содержащая ссылки на регистраторов и номера строк всех записей из основной таблицы регистра бухгалтерии, которые удовлетворяют условиям, указанным в виртуальной таблице (в нашем случае происходит отбор по периоду и по счету). Запрос состоит из двух объединенных запросов, для выбора случаев когда указанный в параметрах счет проходит по дебету или по кредиту.

3) Формируется таблица #tt3, простым копированием первых 1000 записей из таблицы #tt2, упорядоченной по регистратору и номеру строки (порционная обработка данных таблицы)

4) Формируется таблица #tt4 с помощью соединения сформированной таблицы #tt3 с основной таблицей регистра бухгалтерии по регистратору и номеру строки, выбираются дополнительно поля СчетДт, СчетКт, Сумма.

5) Формируется таблица #tt5 с помощью соединения сформированной таблицы #tt4 с таблицей субконто регистра бухгалтерии из которой выбирается вид субконто, значение субконто, вид движения в дополнение к регистратору и номеру строки. Соединение с табличной частью плана счетов используется для определения номера субконто по счету дебета или кредита и по виду субконто.

6) Формируется таблица #tt1 левым соединением таблиц #tt4 и #tt5. Так как в запросе был выбран СубконтоДт1 из таблицы #tt5, то параметры соединения задаются соответственно: _AccEdKindLineNo — номер субконто 1, _Correspond — вид движения Дебет. СчетДт и Сумма берутся из таблицы #tt4.

7) Выбирается максимальный регистратор и номер строки, для отделения следующей порции данных

8) В таблицу #tt3 Выбирается следующая порция в 1000 записей из таблицы #tt2

9) Очистка таблицы #tt3. Здесь при необходимости происходит повторение выборки (шаги 4-9)

10) Окончательная выборка результатов из таблицы #tt1

 

Разобрав запрос, можно сделать вывод что производительность выборки из виртуальной таблицы ДвиженияССубконто полностью определяется объемами выбираемых данных и если не использовать отбор внутри виртуальной таблицы, то все записи физических таблиц будут прогоняться через временные таблицы порциями по 1000 записей, что очень медленно (даже продвинутая СУБД не сможет оптимизировать такой запрос).

 

Как настроить трассировку запроса из обработки

За трассировку запроса отвечает 2 поля:

Путь файла трассы — здесь указывается путь к папке, в которую будут сохраняться временные файлы трассировки и имя файла (например D:Временные файлыTraceTest). Имена файлов трассировки будут присваиваться автоматически, добавлением номера в конец имени (например TraceTest_54.trc)

Подключение SQL — строка подключения к базе данных (например «DRIVER={SQL Server};SERVER=PC_1C_003;UID=sa;PWD=123;DATABASE=Localbase»). Строку подключения можно проверить на работоспособность, нажав на кнопку «Проверить подключение».

Трассировка запускается только если исходный запрос написан на языке запросов 1с, поэтому если введен SQL запрос, то поля «Путь файла трассы» и «Подключние SQL» можно не заполнять.

 

Выводы

Данную обработку можно использовать в связке с технологическим журналом с помощью инструментов разработчика или типовой обработки, а также можно использовать без ТЖ, используя трассировку запроса, встроенную в обработку или запуская трассировку вручную. Для понимания фактически выполняемого SQL запроса, гораздо удобнее видеть наименования таблиц и полей в терминах 1с, видеть представление ссылок 1с и читать форматированный текст запроса с отступами и пробелами.

Форма обработки анализа ТЖ из инструментов разработчика:

ИР

Форма типовой обработки с ИТС для просмотра логов ТЖ:

Типовая обработка

Ссылки

Инструменты разработчика: //infostart.ru/public/15126/

Типовая обработка просмотра логов ТЖ: https://its.1c.ru/db/metod8dev#content:5896:hdoc

Простая консоль ADO запросов: //infostart.ru/public/343268/

Update 19.09.2024

— При обращении к сервису форматирования убрано использование объекта ЧтениеJSON, для совместимости с 8.2 и версиями ниже 8.3.6

47 Comments

  1. Gilev.Vyacheslav

    неплохо

    Reply
  2. bulpi

    Ха! Неплохо ? Да это просто бомба!

    Reply
  3. swimdog

    Рекомендую тексты запросов в статье поместить в спойлеры.

    Скрытый текст
    Reply
  4. pm74

    подпишусь

    Reply
  5. Synoecium

    (2) Спасибо за высокую оценку 🙂

    (3) Да, портянки действительно большие, звучит разумно показывать по кнопке.

    Reply
  6. tormozit

    А че же про встроенный конвертор текста запроса в анализе техножурнала не упомянул? Там есть

    — преобразование констант в ссылки

    — перевод в термины метаданных

    — форматирование

    — список таблиц использованных в запросе

    — переход в конструктор запроса

    — переход в дерево запроса

    Reply
  7. igomark

    О, по-моему, это крутейшая штука!

    Reply
  8. Tanis

    Вечер добрый!

    Прекрасная вещь! Молодцы!

    Спасибо!

    Reply
  9. kuzyara

    (6)

    — форматирование

    А где оно расположено?

    Помню сколько я мучился с сервисами онлайн-форматирования кода когда изучал исходные запросы виртуальных таблиц…

    Reply
  10. kuzyara

    По-моему, в статье зря не упомянуто про типовую консоль запросов.

    https://its.1c.ru/db/metod8dev/content/4500/hdoc

    Именно с неё я и начинал изучение внутренностей бд.

    Reply
  11. ArchLord42

    Очень нужная вещь, автор молодец!

    Reply
  12. tormozit

    (9)

    Флажок «Пересобрать текст»

    Reply
  13. 1segen1

    Отличная вещь! Автор — молодец.

    Reply
  14. user774630

    (2) у Вячеслава это, видимо, максимальное значение из диапазона оценок 🙂

    Reply
  15. Yashazz

    (2) Бомба? Я вас умоляю, это баян. Просто акккуратно и хорошо сделано. И публикация грамотно оформлена.

    Reply
  16. Yashazz

    Красиво сделано, аккуратно оформлено, толково рассказано. Собирался «вырастить» нечто подобное из своей http://infostart.ru/public/462714/, но руки не дошли. Спасибо, на первый взгляд выглядит как серьёзная качественная работа.

    Reply
  17. JohnyDeath

    (14) если только это не оценка ему самому )

    Reply
  18. Serg O.

    только под 8.3 работает?

    на платформе 8.2 — выдаёт ошибку!

    {ВнешняяОбработка.ТрансформаторSQL1С.МодульОбъекта(26,22)}: Тип не определен (ЧтениеJSON)

    ЧтениеJSON = Новый <<?>>ЧтениеJSON;

    Reply
  19. qwed557

    (18)

    ЧтениеJSON

    а что платформа 8.2 поддерживает JSON? Сами же видите где ошибка.

    Reply
  20. Synoecium

    (18) выяснил, что формат JSON в 1С до версии 8.3.6 не реализован https://helpf.pro/faq82/view/1664.html

    В принципе большой сложности нет — написать код разбора JSON ответа с форматированным запросом, тогда будет работать и на 8.2. Сделаю в след. версии. Пока можно не пользоваться галкой «Форматирование интернет-сервисом», остальное то будет работать.

    Reply
  21. Manticor

    (20) аффтар, удалось переделать для версии 8.2))) ??

    Reply
  22. Manticor

    (10) Николай, поделитесь плиз такой консолью, в типовой с сайта ИТС нет опции «показывать план выполнения запроса»

    Reply
  23. Synoecium

    (21) доработка небольшая, в ближайшее время сделаю, раз есть потребность у сообщества. Просто я пока занялся доведением до ума своей консоли запросов, скоро выложу на ИС 🙂

    Reply
  24. kuzyara

    (22), в обработке для 8.3 — есть.

    Reply
  25. Sergey.Noskov

    Большая работа, спасибо.

    PS надеюсь когда нибудь конструктор запроса научится выдавать и текст запроса в терминах СУБД

    Reply
  26. LexSeIch

    Автору спасибо за разработку — взял на заметку.

    Reply
  27. red80

    (25) Зачем?

    Reply
  28. Sergey.Noskov

    (27) что бы видеть реальный запрос

    Reply
  29. SergF

    А самое главное, — автор не собирается останавливаться на достигнутом :

    //TODO

    //1. Прикрутить план запросов SQL

    //2. Выполнение запроса под определенным пользователем (под вопросом)

    //3. Проверка на тонкий клиент 8.3.5 конструктор запроса + модальный вызов

    //4. Сохранение/загрузка настроек в УФ

    Очень ждем продолжения !!!

    Reply
  30. Synoecium

    (29) вообще планы по развитию есть, но после обдумывания акценты сместились. В первую очередь хочу проработать 2 пункта:

    1) таблица с параметрами запроса, как в консоли запросов. Это позволит выполнять некоторые запросы, которые нельзя выполнить сейчас из-за ограничений параметров, задаваемых текстом (например вирт. таблица регистра расчета для определения базы по регистру)

    2) выполнение под другим пользователем. Тоже полезная функция, если надо проверить фактический запрос с учетом RLS для пользователя

    Насчет плана запроса, есть задумки, но если делать, то надо делать полноценный вариант с графическим представлением и деревом плана запроса, а это довольно сложно. Разве что скопировать с согласия автора функционал из существующих на ИС обработок, работающих с планом запроса. В общем, с планом планом пока не определился точно, пишите пожелания 🙂

    Reply
  31. asved.ru

    +++

    Как раз собирался написать конвертер для нового ЦУП (который на УФ). Благодаря Вам эта муторная работа отменяется.

    Reply
  32. wding

    Добрый день!

    Обработка классная!

    Но, при обновлении платформы на 8.3.13.1644 перестала работать

    Reply
  33. Synoecium

    (32) Это скорее всего проблемы с com-коннектором, а не с платформой, надо убедиться что он у вас работает сначала. Com-соединение используется в обработке чтобы определить ID запроса, по которому затем отбирается запрос SQL из трассировки.

    Давайте в личку, попытаюсь помочь.

    Reply
  34. wding

    (33) В личку что-то не пишется, ругается на какуюто отложенную группу 🙁

    Вот в чем «затык», но как исправить не понимаю:

    {ВнешняяОбработка.ТрансформаторSQL1С.МодульОбъекта(350)}: Ошибка при вызове конструктора (COMОбъект)

    Коннектор = Новый COMОбъект(«v»+версияКоннектора+».COMConnector»);

    по причине:

    -2147221005(0x800401F3): Недопустимая строка с указанием класса

    Reply
  35. Synoecium

    (34) посмотрите эти статьи, думаю информация из них поможет:

    http://1clenta.ru/pattern/186 //сначала пробуйте так

    https://infostart.ru/public/400951/ //если не получится, то так

    https://infostart.ru/public/276794/ //эта статья скорее всего уже перебор для вашего случая, но на всякий случай 🙂

    Reply
  36. wding

    (35) Поучительные статьи.

    Все сделал именно так — под УФ не работает. Работает под неуправляемыми формами …

    Странно как-то. Уже по сносил все и переустановил, но все равно под УФ УТ 11.4 не работает.

    Reply
  37. tormozit

    (36) Попробуй инструмент «Управление COM классами 1С» из набора «Инструменты разработчика». Он тебе покажет все варианты регистрации коннектора и позволит зарегистировать нужные.

    Reply
  38. wding

    (37) Тут глюк я думаю у 1С серьезный: та же конфа УТ 11.4, в режиме обычное приложение все отрабатывает на УРА! … А, в режиме управляемого ругается.

    Reply
  39. tormozit

    (38) Глюка в 1С тут уверяю нет. Но конечно, чтобы в этом убедиться, тебе потребуется потратить время.

    Reply
  40. r.zdorkin

    Спасибо за обработку, не понял только почему не добавлена опция доверительного подключения к SQL. хотя дописать скачавшему в этом плане не проблема

    Reply
  41. Synoecium

    (40) а что за доверительное подключение, какая от него польза? Можете ссылкой поделиться — почитаю на досуге

    Reply
  42. r.zdorkin

    (41)

    видимо слишком вычурно выразился. я имел ввиду виндовую аутентификацию по сути, просто если в рамках строки подключения через ADO прямой перевод именно такой » доверительное подключение)

    код будет примерно такой для получения строки подключения в случае ADO

    Если ДоверительноеПодключение Тогда
    стрПодключения = («Provider=SQLOLEDB; Server=»+СокрЛП(СерверSQL)+»; Trusted_Connection=yes; DataBase=»+СокрЛП(БазаSQL));
    
    Иначе
    
    
    
    
    стрПодключения = «Driver={SQL Server};Server=» + СокрЛП(СерверSQL) + «;Uid=» + СокрЛП(ПользовательSQL) + «;Pwd=» +
    СокрЛП(ПарольSQL) + «;DataBase=» + СокрЛП(БазаSQL) + «;» + «Pwd=» + СокрЛП(ПарольSQL) +»;»;
    
    
    КонецЕсли;
    

    Показать

    ну и еще раз спасибо за удобный инструмент и подробные инструкции

    Reply
  43. Synoecium

    (42) аа, похоже понял о чем речь. Имеете ввиду возможность авторизации без логина и пароля, как в Management Studio через пункт «Windows Authentication»? Да, хорошая идея, спасибо

    Reply
  44. r.zdorkin

    (43)

    да, именно так

    Reply
  45. user1005652

    Выводит следующую ошибку

    {ВнешняяОбработка.ТрансформаторSQL1С.МодульОбъекта(350)}: Ошибка при вызове конструктора (COMОбъект)

    Коннектор = Новый COMОбъект(«v»+версияКоннектора+».COMConnector»);

    по причине:

    -2147221005(0x800401F3): Недопустимая строка с указанием класса

    Reply
  46. Synoecium

    проблему уже обсуждали в комментарии (34), скорее всего у вас просто не установлена com-компонента для связи с сервером приложений 1С

    Reply
  47. Synoecium

    (45) эта проблема уже обсуждалась в комментарии (34), скорее всего у вас не установлена com-компонента подключения к серверу приложений 1с

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *