К статье
Практический материал

Администрирование · 11 мин

1С: как посмотреть SQL-запрос к базе данных

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

Платформа 1С не работает с SQL напрямую: разработчик пишет запрос на встроенном языке запросов, а платформа сама транслирует его в команды для СУБД — Microsoft SQL Server, PostgreSQL, Oracle или IBM Db2. Из-за этого «увидеть» итоговый SQL-запрос в коде конфигурации невозможно — он формируется в момент выполнения и зависит от типа СУБД, версии платформы и структуры данных.

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

Как 1С формирует SQL и почему запрос нельзя увидеть в коде

Запрос на языке 1С — это абстракция. Конструкция вида ВЫБРАТЬ Номенклатура.Ссылка ИЗ Справочник.Номенклатура превращается платформой в обращение к физическим таблицам с именами вроде _Reference123, с учётом соединений с таблицами табличных частей, итогов и разделителей данных. Один логический объект может соответствовать нескольким физическим таблицам.

Трансляция выполняется на стороне сервера 1С в момент выполнения метода Выполнить() или Выгрузить(). На текст запроса влияют: тип СУБД, настройки совместимости, режим разделения данных, права пользователя (ограничение доступа на уровне записей добавляет в SQL дополнительные условия). Поэтому один и тот же запрос 1С в разных базах может порождать разный SQL.

Просмотр SQL-запроса через технологический журнал

Технологический журнал — основной штатный способ увидеть, что именно платформа отправляет в СУБД. Для включения нужно создать файл logcfg.xml в каталоге конфигурации технологического журнала (обычно conf рядом с исполняемыми файлами платформы на сервере) и перезапустить службу агента сервера 1С.

Для протоколирования запросов к MS SQL Server используется событие DBMSSQL, для PostgreSQL — DBPOSTGRS, для Oracle — DBORACLE, для Db2 — DBDB2. Дополнительно стоит включить событие DBV8DBENG для файловых баз и события блокировок (TLOCK, TDEADLOCK) при диагностике взаимоблокировок.

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

В примере журнал пишется в каталог C:\1c_logs с хранением 24 часа, фиксируются события DBMSSQL и текст самого SQL в свойстве sql. После воспроизведения операции в 1С откройте файлы журнала и найдите нужное событие по времени или по имени пользователя — рядом с ним будет полный текст SQL-запроса с параметрами.

Порядок действий с техножурналом
  1. 1
    Создайте каталог для логов и убедитесь, что у службы сервера 1С есть права на запись
  2. 2
    Разместите logcfg.xml с событием DBMSSQL (или соответствующим вашей СУБД) в каталоге conf платформы
  3. 3
    Перезапустите службу агента сервера 1С
  4. 4
    Воспроизведите проблемную операцию в 1С
  5. 5
    Откройте файлы журнала и найдите событие по времени, пользователю или процессу
  6. 6
    Скопируйте текст SQL и проанализируйте его в среде СУБД
  7. 7
    После диагностики отключите журнал или сократите состав событий

Просмотр запросов средствами самой СУБД

Альтернатива техножурналу — наблюдение за запросами на стороне СУБД. В Microsoft SQL Server для этого служат Extended Events (рекомендуемый способ) или устаревший SQL Server Profiler. В трассировке запросы от 1С видны с именем приложения и хоста сервера 1С, что позволяет отфильтровать их от других подключений.

В PostgreSQL помогает параметр log_statement и расширение pg_stat_statements, которое собирает статистику по всем выполняемым запросам: время, количество вызовов, чтение буферов. Это удобно для поиска самых тяжёлых запросов в целом, а не конкретного экземпляра.

Преимущество способа — видно запрос «как есть», включая фактический план выполнения, что критично при оптимизации. Недостаток — нужны права администратора СУБД, и сложнее связать конкретный запрос с конкретным пользователем 1С, чем в техножурнале.

Сравнение способов

Технологический журнал

Подходит для разбора конкретной операции конкретного пользователя; требует перезапуска службы и нагружает диск

Extended Events / Profiler (MS SQL)

Даёт план выполнения и реальную нагрузку; нужны права на СУБД, сложнее привязка к пользователю 1С

pg_stat_statements (PostgreSQL)

Хорош для поиска самых тяжёлых запросов в массе; не показывает контекст вызова из 1С

Консоль запросов

Показывает запрос на языке 1С и результат, но не итоговый SQL; подходит разработчику для отладки логики

Консоль запросов и отладчик: что они показывают

Консоль запросов (штатная в управляемых формах некоторых типовых конфигураций или внешние обработки) позволяет выполнить запрос на языке 1С, посмотреть результат и временные таблицы. Это удобно для проверки логики, но итоговый SQL консоль не показывает — она работает на уровне абстракции платформы.

В конфигураторе при отладке можно остановиться на строке Запрос.Выполнить() и просмотреть текст запроса, параметры и менеджер временных таблиц через «Вычислить выражение». Это помогает убедиться, что в запрос подставляются ожидаемые значения, прежде чем искать проблему на уровне СУБД.

Практичная связка: сначала в консоли проверить, что запрос логически корректен и возвращает нужные данные, затем через техножурнал или трассировку СУБД посмотреть, во что он транслируется и как выполняется физически.

Маршрут решения

Как выбрать действие

Нужно понять, почему конкретная операция у конкретного пользователя работает медленноВключите техножурнал с DBMSSQL, воспроизведите операцию и снимите текст запроса
Нужно найти самые тяжёлые запросы по всей базе за периодИспользуйте pg_stat_statements или Extended Events с агрегацией по длительности
Запрос возвращает неверные данныеПроверьте логику в консоли запросов и параметры в отладчике — до уровня SQL спускаться рано
Есть ошибка СУБД при выполненииСмотрите события EXCP и DBMSSQL в техножурнале рядом по времени — там будет и текст запроса, и текст ошибки

Разбор результата: как читать полученный SQL

Текст из техножурнала выглядит непривычно: физические таблицы имеют технические имена, соединения многочисленны, условия размножены. Чтобы сориентироваться, сопоставляйте физические таблицы с объектами метаданных по структуре хранения базы — её можно посмотреть в конфигураторе через «Администрирование → Функции для технического специалиста» (в типовых) или получить методом ПолучитьСтруктуруХраненияБазыДанных().

Для анализа производительности скопируйте запрос в среду СУБД (SQL Server Management Studio, pgAdmin) и посмотрите план выполнения. Тревожные признаки: сканирование больших таблиц вместо поиска по индексу, вложенные циклы над миллионами строк, неявные преобразования типов в условиях. Часто причина — отсутствие индекса по полям соединения или выборка лишних полей и соединений «на всякий случай» в запросе 1С.

Контрольные точки

Как проверить результат

Событие найдено в техножурнале
Норма

Есть запись DBMSSQL с непустым свойством sql и временем, совпадающим с операцией

Тревожный признак

Событий нет — проверьте путь logcfg.xml, перезапуск службы и права на каталог логов

Запрос соответствует проблемной операции
Норма

В тексте SQL фигурируют таблицы и значения параметров из этой операции

Тревожный признак

Запрос относится к фоновому заданию или другому пользователю — уточните фильтр по времени

План выполнения в СУБД
Норма

Используются Index Seek / Index Scan по узким условиям

Тревожный признак

Полное сканирование крупных таблиц, предупреждения о неявных преобразованиях

Типичные ошибки и ограничения

Частая ошибка — искать SQL в файловой базе через событие DBMSSQL: файловый вариант не использует клиент-серверную СУБД, и запросы к ней протоколируются событием DBV8DBENG. Вторая типичная ситуация — забыть перезапустить службу агента после изменения logcfg.xml, из-за чего журнал просто не пишется.

Ещё одна ловушка — попытка оптимизировать SQL напрямую. Индексы и структуру таблиц в базе 1С нельзя менять в обход платформы: при обновлении конфигурации реструктуризация может привести к конфликтам. Оптимизировать нужно запрос на языке 1С: убирать лишние соединения, использовать временные таблицы, индексировать поля условий.

Типичные ошибки
01
Включение полного техножурнала на продуктиве без ограничения по времени — диск переполняется, работа пользователей замедляется
02
Поиск DBMSSQL для файловой базы — нужное событие называется DBV8DBENG
03
Ручное создание индексов в СУБД в обход платформы — риск конфликтов при обновлении конфигурации
04
Анализ запроса без параметров — план выполнения для конкретных значений может радикально отличаться
05
Отсутствие перезапуска службы сервера после правки logcfg.xml — журнал не появляется, и диагностика идёт впустую

Частые вопросы

Можно ли посмотреть SQL-запрос без доступа к серверу?

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

Чем событие DBMSSQL отличается от DBV8DBENG?

DBMSSQL фиксирует обращения клиент-серверной 1С к Microsoft SQL Server. DBV8DBENG — обращения к встроенной СУБД файлового варианта. Для PostgreSQL, Oracle и Db2 существуют свои события: DBPOSTGRS, DBORACLE и DBDB2 соответственно.

Почему в техножурнале текст запроса обрезан?

По умолчанию часть свойств протоколируется с ограничением длины. Убедитесь, что в logcfg.xml для события явно указано свойство sql внутри блока log — тогда текст запроса пишется полностью. Также проверьте, что смотрите файл нужного процесса: rphost обслуживает рабочие процессы сервера.

Как понять, какой таблице 1С соответствует _Reference123 в SQL?

Используйте функцию «Структура хранения базы данных» в конфигураторе или метод ПолучитьСтруктуруХраненияБазыДанных() — они выводят соответствие объектов метаданных и физических имён таблиц. В типовых конфигурациях отчёт доступен через «Администрирование → Поддержка и обслуживание».

Можно ли выполнить произвольный SQL-запрос из кода 1С?

Штатно — нет, платформа работает только через собственный язык запросов. Обходные пути (ADO через COM, внешние компоненты) существуют, но нарушают модель доступа к данным, обходят права 1С и создают риски при обновлении. Для отчётности по базе лучше использовать представления СУБД или внешние источники данных.

Влияет ли включённый техножурнал на производительность?

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

Итог

Что важно запомнить

Итоговый SQL-запрос 1С существует только в момент выполнения на сервере. Увидеть его можно через технологический журнал (DBMSSQL/DBPOSTGRS) или средства трассировки СУБД. Консоль запросов и отладчик показывают логику на языке 1С, но не SQL. Оптимизировать следует запрос 1С и индексы через платформу, а не править базу напрямую.