Универсальный переводчик запросов 1С в T-SQL (Microsoft)


Данная обработка облегчает разработчику процесс перевода запросов в формате 1С, в формат T-SQL (Microsoft).

Данную обработку я писал для себя в тот момент когда активно занимался прямыми обращениями к базе данных 1С, в обход сервера приложений. 

Обработка позволяет просматривать структуру хранения данных. А так же позволяет без особых усилий перевести наименования полей и таблиц в те наименования которые хранятся внутри СУБД. 

Алгоритм использования прост. 

1. Необходимо настроить подключение к базе данных.

2. Вставить из буфера обмена запрос в формате 1С, либо воспользоваться конструктором запроса для его построения. 

3. Выделяем в текстовом поле где написан запрос, наименование объекта метаданных (Справочник, Документ, Регистр) из которого происходит выборка. Нажимаем кнопку «Транслировать объект».

4. Теперь можно либо по отдельности выделять каждое из полей объекта, либо можно выделить все поля объекта и нажать кнопку «Транслировать поля объекта». Поля будут переведены на внутренне представление. Если перевод массовый, напротив каждого поля будет добавлен комментарий, обозначающий представление поля в метаданных конфигурации. 

5. После того как все объекты и их поля будут транслированы можно нажать на кнопку «Транслировать в SQL». Данная кнопка заменяет наиболее часто используемые операторы T-SQL из русского представления в английское, используемое в MS SQL.

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

Важно помнить что трансляция полей всегда происходит в пределах последнего переведенного объекта. Так же обработка не умеет переводить в формат SQL такие виртуальные таблицы как «СрезПоследних» или что-то подобное. 

Но тем не менее обработка поможет облегчить процесс написания прямых запросов к СУБД MS SQL.

 

P.S.

Данная обработка писалась для облегчения собственного труда и в план работ включена не была. Поэтому делал на скорую руку. Следовательно есть вещи которые можно было бы сделать лучше. А ещё на момент написания я не знал что в 1С можно использовать регулярные выражения, поэтому сейчас  написал бы её несколько иначе. Но времени на это нет. Но как бы там ни было, даже в таком виде как сейчас, она мне значительно облегчила работу. Буду рад если данная наработка кому-то хоть как-то поможет.

15 Comments

  1. Elisy

    Не совсем понятно, для чего вставляется запрос 1С?

    Транслирование обеспечит автоматические перевод запроса 1С в T-SQL запрос или 1С-запрос нужен для наглядного выделения строки?

    Обрабатываются как-нибудь объекты вида: РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(…) ?

    Reply
  2. graphbuh

    Насколько я понял, самый простой способ генерации теста запроса в sql, написать его на 1С, выполнить и отловить текст запроса в аналайзере. Почему автор не пошел этим путем?

    Reply
  3. DAnry

    Полезная обработка для програмистов 1С-ников, которые не профи в SQL. Плюсую.

    Reply
  4. soap

    Хорошая идея попробую

    Reply
  5. ixilimuse

    (1) Elisy, 1C запрос нужен как раз для интерактивного перевода таблиц и полей в представление физического хранения на уровне СУБД. То есть не нужно ручками искать в структуре таблицу, и каждое поле в отдельности. Обработка позволяет в несколько кликов перевести из одного представления в другое.

    ОстаткиИОбороты и другие подобные «Виртуальные таблицы» обработка не переведет. Для перевода таких запросов реально проще воспользоваться SQL Profiler. Чтобы скопировать готовый запрос, либо понять как он строится и написать свой.

    (2) graphbuh, Действительно можно воспользоваться стандартными средствами для перехвата того запроса который формируется сервером приложений 1С. Но это лишь в тех случаях когда речь идет о простых выборках.

    Мне же приходилось строить не просто выборки. Я в своих запросах очень активно использовал CTE, я своими запросами модифицировал данные с помощью DELETE & UPDATE, использовал циклы и условия на уровне СУБД. Так как приходилось не просто выгружать данные, а необходимо было производить полноценную обработку данных. Поэтому мне было удобно переводить запросы в интерактивном виде, и при этом что бы автоматом генерились комментарии — что это за поле в представлении 1С. Как показано на скрине.

    И сразу для сомневающихся:

    Циклы, условия и прочее в t-sql — не есть плохо, если использовать по назначению. Они были использованы как раз таки для оптимизации выполнения запроса в целом.

    Так же на опережение критикующих напишу что ни одна запись в базе данных — не пострадала. Ни одной битой ссылки — не появилось. Механизм отлаживался и тестировался профессиональной командой. Клиентами были крупные добывающие и перерабатывающие компании с достаточно объемными базами. Ошибаться нам было — нельзя.

    Но и необходимость прибегнуть к таким методам была специфична. У нас было не типовое решение, не стандартные задачи. Поэтому я не утверждаю что пользоваться прямыми запросами надо всегда. И более того надо учитывать — стоит ли такое решение, тех трудозатрат которые будут понесены. Как при разработке, так и при сопровождении и переработки.

    p.s.

    Если кому-то обработка чем-то поможет — буду рад =) Но это не единственный в своем роде способ облегчить работу с уровнем СУБД. А работа с уровнем СУБД вообще весьма специфичная и порой сомнительная фича. Кстати обработке сей примерно год. И примерно год она лежит без дела. Но мало ли, вдруг кому пригодится, решил выложить)

    (3) DAnry, Спасибо)))

    Reply
  6. Elisy

    (5) Навскидку не скажете, как на уровне СУБД переводятся запросы вида:

    ВЫБРАТЬ Номенклатура.ГруппаТоваров.Наименование КАК Наименование

    (через JOIN?)

    РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(…)

    (через хранимые процедуры или через множество связанных SELECT?)

    Reply
  7. Elisy

    (2) Самый простой способ в C# — через LINQ-выражения. С профайлером связываться не нужно и работа ведется с человеческими названиями свойств. Поддерживается также изменение данных.

    http://www.linq-demo.1csoftware.com/

    Reply
  8. comol

    по-моему «универсальный переводчик» с запросов 1С в SQL давно уже есть… называют его «Платформа 1С:Предприятие» вроде ну или как то так 🙂

    А для тех кто не любит заглядывать в профайлер и вообще «любителей чистого искусства» есть 1С:ЦУП…

    Ну и в конце концов есть обработка получения структуры хранения… поэтому для чего сей продукт не понятно…

    Reply
  9. ixilimuse

    (6) Elisy, первый вопрос не совсем понял что имеется ввиду под:

    ВЫБРАТЬ Номенклатура.ГруппаТоваров.Наименование КАК Наименование

    Если речь о том что ГруппаТоваров — это ссылка на запись в другой таблице, и нужно из этой записи вытащить поле «Наименование», то можно это сделать через Join.

    Так же можно воспользоваться вложенным запросом, что будет работать быстрее — надо замерять. Так как бывает по разному.

    Возможно имеет смысл заранее перед основной выборкой сформировать временную таблицу, в которую вы вытащите лишь необходимые поля из таблицы «ГруппаТоваров». И если это возможно вытащите лишь тот набор записей который понадобится в основной выборке. А затем уже эту временную таблицу можно присоединять в основной выборке и из неё вытаскивать «наименование».

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

    А вот «ОстаткиИОбороты» наверное можно и так и так сделать. Я не помню как эту В.Т. формирует сервер приложений 1С. Думаю что для упрощения конечного запроса — имеет смысл создать View(представление), внутри которого вы реализуется множество связанных выборок, а в своем конечном запросе будете обращаться к представлению примерно как и в 1С.

    Хранимку тоже можно сделать, для того что бы можно было ещё и параметры отбора туда передавать при выборке, будет совсем красота 🙂 Но это навскидку )) Надо смотреть и ковырять)

    Reply
  10. German

    (5) ixilimuse,

    Мне же приходилось строить не просто выборки.

    Увы предложенный вариант cработает только для просто выборок, в 1С запросах множество конструкций которые не так просто транслируются в SQL

    В ИЕРРАХИИ
    В ГРУППЕ
    ТипЗначения
    Reply
  11. Elisy

    (10) German,

    А как 1С справляется с такими конструкциями? ТипЗначения, скорее всего, транслируется в значение из метаданных до запроса.

    Reply
  12. yuraos

    (10) German, ага !!!

    и еще есть такая конструкция, как

    CAST

    не путать с одноименной конструкцией T-SQL!



    Платформисты имели нагл… самоуверенность назвать

    эту функцию по английски также,

    хотя она практически ничего не умеет по настоящему преобразовывать.

    Reply
  13. yuraos

    (12)

    но плюс за старания и идейную непримиримость

    с врагами пролетариата!

    🙂

    Reply
  14. tormozit

    (2) Да. Это довольно просто сделать с помощью ИР.

    Reply
  15. Артано

    (2) Согласен, но в сложном запросе бывает нелегко с налету разобраться что за переменные или подзапросы, сервер 1С и оптимизатор SQL порою выкидывает такие штуки, что без бутылки не разберешься )

    В целом автору плюс за идею. Преимущество вижу в комментировании полей SQL таблиц их представлением в 1С

    Reply

Leave a Comment

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