Как преобразовать запрос 1С в SQL-запрос и получить готовый SQL-код?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При работе с платформой 1С:Предприятие часто возникает необходимость увидеть, во что именно превращается привычный запрос 1С на уровне СУБД. Это требуется для оптимизации «тяжелых» выборок, анализа планов запросов или переноса логики получения данных во внешние системы. Однако простая трансляция «один в один» невозможна из-за специфики архитектуры платформы. В этой статье мы подробно разберем, как получить SQL-текст запроса 1С, какие инструменты для этого использовать и с какими техническими ограничениями придется столкнуться.

Почему нельзя просто переписать запрос 1С на SQL?

Прежде чем перейти к инструментам получения SQL-кода, давайте проанализируем, почему ручной перевод запроса представляет сложность. Платформа 1С выступает ORM-системой (Object-Relational Mapping), которая полностью изолирует разработчика от реальной структуры таблиц в базе данных. При трансляции запросов возникают следующие препятствия:

  1. Технические имена таблиц и полей. Вместо понятных названий конфигуратора (например, Справочник.Номенклатура или Документ.РеализацияТоваровУслуг) СУБД оперирует именами вида _Reference120, _Document350, _InfoRg500. Реквизиты объектов транслируются в колонки типа _Fld1234, а уникальные идентификаторы — в _IDRRef.
  2. Особенности хранения типов данных. Ссылочные типы в 1С хранятся в бинарном формате binary(16) (или bytea в PostgreSQL). Порядок байтов в них инвертирован по сравнению со стандартным строковым представлением UUID. Даты могут записываться со смещением (например, +2000 лет в MS SQL для корректной обработки пустых дат).
  3. Составные типы данных. Если реквизит имеет составной тип, платформа создает под него несколько физических колонок в таблице СУБД (для хранения типа, описания метаданных и самого значения).
  4. Виртуальные таблицы. Обращения к виртуальным таблицам (таким как срезы последних, остатки или обороты регистров) превращаются на уровне SQL в сложнейшие конструкции со множественными соединениями (JOIN) с таблицами итогов, вычислением граничных точек времени и наложением внутренних условий.
  5. Ограничения доступа (RLS). При активном механизме RLS платформа автоматически внедряет в итоговый SQL-запрос дополнительные условия фильтрации прав, что делает итоговый SQL-код огромным и трудночитаемым.

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

Решение 1. Специализированная консоль запросов с портала ИТС

Самый простой и доступный способ получить SQL-запрос напрямую в интерфейсе 1С — использовать официальную Консоль запросов для управляемого приложения, доступную на сайте ИТС.

Современные версии этой обработки умеют выводить не только результат выполнения, но и реальный SQL-текст запроса, который отправляется на сервер СУБД, а также строить технологический план его выполнения. Для этого консоль использует внутренние механизмы платформы по работе с планами запросов. Запустив запрос в такой консоли, вы сможете скопировать готовый SQL-код со всеми подставленными техническими именами таблиц и полей.

Решение 2. Настройка Технологического журнала (ТЖ)

Если вам нужно перехватить запрос, который выполняется в процессе работы штатных механизмов конфигурации, мы можем воспользоваться встроенным инструментом платформы — Технологическим журналом. Этот способ отлично работает в связке со стандартной консолью запросов.

Для этого необходимо настроить файл конфигурации технологического журнала logcfg.xml, указав сбор событий СУБД (DBMSSQL для MS SQL Server или DBPOSTGRS для PostgreSQL). Пример файла настройки для отслеживания запросов:


<config xmlns="http://v8.1c.ru/v8/tech-log">
  <log location="C:\v8_tech_log" history="1">
    <event>
      <eq property="Name" value="DBMSSQL"/>
    </event>
    <property name="sql"/>
  </log>
</config>

После настройки ТЖ выполните интересующий вас запрос в стандартной консоли запросов. Платформа запишет транслированный SQL-текст со всеми параметрами в лог-файл по указанному пути, откуда его можно будет скопировать для дальнейшего анализа в СУБД.

Решение 3. Использование профилировщиков и средств СУБД

Если у вас есть административный доступ к серверу баз данных, вы можете перехватить SQL-запрос непосредственно на стороне СУБД:

Сопоставление структуры через метод ПолучитьСтруктуруХраненияБазыДанных()

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


ТаблицаСтруктуры = ПолучитьСтруктуруХраненияБазыДанных("Справочник.Номенклатура", Истина);
Для Каждого СтрокаТаблицы Из ТаблицаСтруктуры Цикл
    Сообщить("Имя таблицы в 1С: " + СтрокаТаблицы.ИмяТаблицы);
    Сообщить("Имя таблицы в СУБД: " + СтрокаТаблицы.ИмяТаблицыХранения);
КонецЦикла;

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

Альтернативные варианты интеграции

Если ваша конечная цель — не просто посмотреть SQL-код, а извлечь данные из внешней СУБД средствами 1С, рассмотрите более простые архитектурные альтернативы:

← На главную