При работе с платформой 1С:Предприятие часто возникает необходимость увидеть, во что именно превращается привычный запрос 1С на уровне СУБД. Это требуется для оптимизации «тяжелых» выборок, анализа планов запросов или переноса логики получения данных во внешние системы. Однако простая трансляция «один в один» невозможна из-за специфики архитектуры платформы. В этой статье мы подробно разберем, как получить SQL-текст запроса 1С, какие инструменты для этого использовать и с какими техническими ограничениями придется столкнуться.
Прежде чем перейти к инструментам получения SQL-кода, давайте проанализируем, почему ручной перевод запроса представляет сложность. Платформа 1С выступает ORM-системой (Object-Relational Mapping), которая полностью изолирует разработчика от реальной структуры таблиц в базе данных. При трансляции запросов возникают следующие препятствия:
Справочник.Номенклатура или Документ.РеализацияТоваровУслуг) СУБД оперирует именами вида _Reference120, _Document350, _InfoRg500. Реквизиты объектов транслируются в колонки типа _Fld1234, а уникальные идентификаторы — в _IDRRef.binary(16) (или bytea в PostgreSQL). Порядок байтов в них инвертирован по сравнению со стандартным строковым представлением UUID. Даты могут записываться со смещением (например, +2000 лет в MS SQL для корректной обработки пустых дат).JOIN) с таблицами итогов, вычислением граничных точек времени и наложением внутренних условий.Именно поэтому для получения чистого SQL-кода необходимо использовать специализированные инструменты автоматизации.
Самый простой и доступный способ получить SQL-запрос напрямую в интерфейсе 1С — использовать официальную Консоль запросов для управляемого приложения, доступную на сайте ИТС.
Современные версии этой обработки умеют выводить не только результат выполнения, но и реальный SQL-текст запроса, который отправляется на сервер СУБД, а также строить технологический план его выполнения. Для этого консоль использует внутренние механизмы платформы по работе с планами запросов. Запустив запрос в такой консоли, вы сможете скопировать готовый SQL-код со всеми подставленными техническими именами таблиц и полей.
Если вам нужно перехватить запрос, который выполняется в процессе работы штатных механизмов конфигурации, мы можем воспользоваться встроенным инструментом платформы — Технологическим журналом. Этот способ отлично работает в связке со стандартной консолью запросов.
Для этого необходимо настроить файл конфигурации технологического журнала 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-текст со всеми параметрами в лог-файл по указанному пути, откуда его можно будет скопировать для дальнейшего анализа в СУБД.
Если у вас есть административный доступ к серверу баз данных, вы можете перехватить SQL-запрос непосредственно на стороне СУБД:
sys.dm_exec_query_stats.postgresql.conf, задав параметр log_statement = 'all', либо используйте модуль pg_stat_statements для сбора статистики и текстов выполняемых запросов.Если перед вами стоит задача программно сопоставить объекты метаданных 1С с таблицами СУБД (например, для написания собственного транслятора), воспользуйтесь встроенной функцией платформы ПолучитьСтруктуруХраненияБазыДанных(). Рассмотрим пример получения имен таблиц для справочника:
ТаблицаСтруктуры = ПолучитьСтруктуруХраненияБазыДанных("Справочник.Номенклатура", Истина);
Для Каждого СтрокаТаблицы Из ТаблицаСтруктуры Цикл
Сообщить("Имя таблицы в 1С: " + СтрокаТаблицы.ИмяТаблицы);
Сообщить("Имя таблицы в СУБД: " + СтрокаТаблицы.ИмяТаблицыХранения);
КонецЦикла;
Этот метод позволяет автоматизировать процесс маппинга полей и таблиц при переносе запросов из одной базы в другую. Для ручной проверки соответствия таблиц объектам удобен интерактивный просмотр метаданных: он покажет физические имена таблиц и состав объектов, но не преобразует запросы 1С в SQL.
Если ваша конечная цель — не просто посмотреть SQL-код, а извлечь данные из внешней СУБД средствами 1С, рассмотрите более простые архитектурные альтернативы:
ADODB.Connection. Это позволит работать с внешней базой на чистом SQL, не прибегая к трансляции платформы.