Где увидеть запрос 1С 8.3 — в конфигураторе, отладчике и на стороне СУБД

· 10 мин

Содержание

Текст запроса отчёта или обработки в 1С 8.3 смотрят в конфигураторе: откройте объект, затем схему компоновки данных, вкладку «Наборы данных». Если нужен запрос в момент выполнения, со значениями параметров, — поставьте точку останова и вычислите Запрос.Текст в отладчике (Shift+F9).

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

Какой способ посмотреть запрос выбрать

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

СпособЧто видноКому доступенКогда выбирать
Конфигуратор: схема, модульИсходный текст на языке 1СРазработчик, права администратораПонять логику отчёта, поправить запрос
ОтладчикТекст, параметры, результат в момент выполненияРазработчикОтчёт «показывает не то», нужна точная причина
Вывод из кодаТекст и параметры в сообщении, файле, журналеРазработчикОтладчик не подключить: рабочий сервер, редкий сбой
Журнал регистрацииКто, когда, какие данные менялАдминистратор базыНайти момент и пользователя, а не текст
Технологический журналЗапрос 1С (SDBL) и SQL (DBMSSQL), длительностьАдминистратор сервераТормоза, блокировки, «что за запрос висит»
Профайлер СУБДЧистый SQL, план, нагрузкаАдминистратор СУБДАнализ производительности на MS SQL, PostgreSQL

Запрос на языке 1С и SQL — разные тексты. Один запрос 1С превращается в один или несколько SQL-запросов к таблицам вида _Document123, _Reference45, _Fld678. Для понимания логики берите текст 1С, для поиска тормозов — SQL.

Текст запроса отчёта, обработки и списка в конфигураторе

Это основной путь для разработчика. Нужны права администратора и запуск базы в режиме «Конфигуратор».

Отчёт на системе компоновки данных

Почти все типовые отчёты БП 3.0, ЗУП 3.1 и УТ 11 построены на СКД. Порядок такой:

  1. Откройте Конфигурация → Открыть конфигурацию.
  2. В дереве метаданных найдите ветку Отчеты, а в ней нужный отчёт. Быстрый поиск — встаньте в дерево и начните печатать имя.
  3. Откройте отчёт двойным щелчком, перейдите на вкладку Макеты и откройте ОсновнаяСхемаКомпоновкиДанных. Тот же макет доступен кнопкой Открыть схему компоновки данных на основной вкладке.
  4. В схеме перейдите на вкладку Наборы данных и выберите набор с типом «Запрос». Текст запроса — в поле справа.
  5. Чтобы разобрать сложный запрос визуально, нажмите Конструктор запроса...: он покажет таблицы, связи, условия и пакет временных таблиц по шагам.

Не сохраняйте изменения в типовой конфигурации на поддержке — правка снимет объект с поддержки и усложнит обновления. Для экспериментов скопируйте текст в консоль запросов или используйте расширение.

Внешний отчёт или обработка

Файл .erf или .epf открывают в конфигураторе через Файл → Открыть. Дальше всё так же: вкладка Макеты для СКД или модуль объекта, если запрос написан в коде.

В модуле ищите текст поиском Ctrl+F по слову ВЫБРАТЬ или Новый Запрос. Запросы в коде часто собираются из кусков через СтрЗаменить и +, поэтому полный текст надёжнее смотреть отладчиком.

Запрос динамического списка формы

Списки документов и справочников с настроенными колонками строятся динамическим списком.

  • 🔹 Откройте форму списка в конфигураторе, вкладку Реквизиты.
  • 🔹 Выделите реквизит Список и откройте его свойства (Alt+Enter), затем Настройка списка.
  • 🔹 Если включён флажок «Произвольный запрос», текст будет в поле запроса. Если флажка нет, список строится по основной таблице без отдельного текста.

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

Скопированный текст удобно запускать в консоли запросов — внешней обработке, которую используют почти все разработчики. Она позволяет задать параметры, выполнить запрос, посмотреть содержимое каждой временной таблицы и время выполнения. Запускайте её в копии базы, если запрос тяжёлый.

Отладчик: запрос, параметры и результат в момент выполнения

Отладчик показывает то, чего нет в конфигураторе: итоговый текст после всех подстановок и значения параметров.

Подготовка

  1. В конфигураторе откройте модуль, где выполняется запрос.
  2. Поставьте точку останова на строку с Запрос.Выполнить() клавишей F9.
  3. Запустите отладку F5 («Начать отладку»). Откроется 1С:Предприятие, подключённое к отладчику.
  4. Выполните в программе действие, которое запускает этот код: сформируйте отчёт, проведите документ.

В клиент-серверной базе сервер 1С должен быть запущен с разрешённой отладкой: агент сервера стартует с ключом -debug. Включение ключа требует перезапуска службы — перезапуск обрывает сеансы всех пользователей, делайте это вне рабочего времени и только на тестовом сервере.

Что вычислять в окне выражения

Когда выполнение остановилось, откройте Отладка → Вычислить выражение (Shift+F9) и введите:

  • 📝 Запрос.Текст — полный текст запроса. Длинное значение можно открыть в отдельном окне просмотра и скопировать оттуда целиком.
  • 🔑 Запрос.Параметры — структура параметров: видно, с какой датой, организацией или складом выполняется запрос.
  • 📊 Запрос.Выполнить().Выгрузить() — результат в виде таблицы значений. Для пакетного запроса — Запрос.ВыполнитьПакет(), массив результатов по каждому запросу пакета.

Вычисление Запрос.Выполнить() в отладчике выполняет запрос повторно. Тяжёлый запрос к рабочей базе снова нагрузит сервер.

Итоговый запрос отчёта на СКД

В схеме компоновки хранится «шаблон» запроса. Перед выполнением компоновщик убирает неиспользуемые поля, добавляет отборы пользователя и подставляет параметры. Итоговый текст живёт в макете компоновки.

Найдите в модуле отчёта (или в общих модулях, которые его формируют) строку с КомпоновщикМакета.Выполнить, остановитесь сразу после неё и вычислите:

МакетКомпоновки.НаборыДанных[0].Запрос

Имя переменной в вашем коде может быть другим — смотрите, чему присваивается результат Выполнить. Этот приём объясняет частую загадку: «в схеме условие есть, а отчёт его не учитывает» — в итоговом запросе видно, какие отборы реально попали в текст.

Вывод текста запроса из кода

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

Сообщение пользователю с текстом и параметрами:

Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = Запрос.Текст;
Сообщение.Сообщить();

Для Каждого Параметр Из Запрос.Параметры Цикл
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = Параметр.Ключ + " = " + Строка(Параметр.Значение);
    Сообщение.Сообщить();
КонецЦикла;

Запись в журнал регистрации — удобно для фоновых заданий, где сообщения никто не увидит:

ЗаписьЖурналаРегистрации("Отладка.ТекстЗапроса",
    УровеньЖурналаРегистрации.Информация, , , Запрос.Текст);

Сохранение в файл (на сервере файл появится в каталоге временных файлов сервера):

Текст = Новый ТекстовыйДокумент;
Текст.УстановитьТекст(Запрос.Текст);
Текст.Записать(КаталогВременныхФайлов() + "query.txt");

Итоговый запрос отчёта на СКД можно получить без отладчика — собрать макет и пройти по его наборам данных:

Схема = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
Макет = КомпоновщикМакета.Выполнить(Схема, Схема.НастройкиПоУмолчанию);

Для Каждого Набор Из Макет.НаборыДанных Цикл
    Если ТипЗнч(Набор) = Тип("НаборДанныхЗапросМакетаКомпоновкиДанных") Тогда
        Сообщение = Новый СообщениеПользователю;
        Сообщение.Текст = Набор.Запрос;
        Сообщение.Сообщить();
    КонецЕсли;
КонецЦикла;

Код выполняется в модуле объекта отчёта, на сервере. Вместо настроек по умолчанию можно передать текущие настройки пользователя: КомпоновщикНастроек.ПолучитьНастройки().

Журнал регистрации: что он покажет вместо текста

Журнал регистрации не хранит тексты запросов. В нём записаны события: вход и выход пользователей, запись и удаление объектов, ошибки, проведение документов, а также то, что разработчик пишет туда сам через ЗаписьЖурналаРегистрации.

Где открыть:

  • 🖥 В конфигураторе: Администрирование → Журнал регистрации.
  • 🧭 В 1С:Предприятии: главное меню, Функции для технического специалиста, ветка Стандартные → Журнал регистрации. Если этого пункта нет в меню, включите флажок «Режим технического специалиста» в Сервис и настройки → Параметры.

Чем он полезен в поиске запроса:

  1. Отфильтруйте события по пользователю и интервалу, когда «завис» отчёт или упала ошибка.
  2. Найдите событие с ошибкой: в комментарии часто есть текст ошибки СУБД и имя модуля со строкой.
  3. По имени модуля откройте код в конфигураторе — там и будет нужный запрос.

Если в коде добавлена запись из предыдущего раздела, текст запроса появится прямо в комментарии события «Отладка.ТекстЗапроса».

Технологический журнал: запросы 1С и SQL на сервере

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

Как включить

  1. Создайте файл logcfg.xml в каталоге conf платформы, например C:\Program Files\1cv8\conf\. На сервере кладите его на тот компьютер, где работают рабочие процессы.
  2. Заполните его настройками (пример ниже) и сохраните в кодировке UTF-8.
  3. Платформа перечитывает файл примерно раз в минуту, перезапуск не нужен.
  4. Воспроизведите проблему, затем удалите файл или закомментируйте секцию log.
<?xml version="1.0" encoding="UTF-8"?>
<config xmlns="http://v8.1c.ru/v8/tech-log">
  <log location="D:\techlog" history="2">
    <event>
      <eq property="name" value="SDBL"/>
    </event>
    <event>
      <eq property="name" value="DBMSSQL"/>
    </event>
    <event>
      <eq property="name" value="DBPOSTGRS"/>
    </event>
    <property name="all"/>
  </log>
</config>

Где искать текст

  • 📂 Логи лягут в D:\techlog в подкаталоги по процессам, например rphost_4512, файлы по часам 26100714.log.
  • 🔤 В событиях SDBL свойство Sdbl содержит запрос на языке 1С во внутреннем представлении.
  • 🗄 В DBMSSQL (MS SQL) и DBPOSTGRS (PostgreSQL) свойство Sql — готовый SQL-текст, а Context показывает модуль и строку кода, откуда пришёл запрос.
  • 💾 Для файловой базы событие называется DBV8DBENG.

С фильтром all журнал за час может вырасти на гигабайты. Указывайте отдельный диск, держите history маленьким и сужайте сбор: условие <eq property="p:processName" value="имя_базы"/> внутри event оставит только одну базу, а <ge property="duration" value="..."/> — только долгие запросы.

Как связать SQL с объектами 1С

В SQL вместо «РеализацияТоваровУслуг» стоит _Document123. Расшифровать имена поможет функция платформы, выполненная на сервере:

Объекты = Новый Массив;
Объекты.Добавить("Документ.РеализацияТоваровУслуг");
Структура = ПолучитьСтруктуруХраненияБазыДанных(Объекты, Истина);

Для Каждого СтрокаТаблицы Из Структура Цикл
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = СтрокаТаблицы.Метаданные + " — " + СтрокаТаблицы.ИмяТаблицыХранения;
    Сообщение.Сообщить();
КонецЦикла;

Второй параметр Истина возвращает имена так, как они названы в СУБД. Поле Поля каждой строки расшифровывает колонки _Fld....

Внешние инструменты для мониторинга SQL-запросов

Если доступ есть только к серверу СУБД, SQL-запросы 1С ловят её собственными средствами.

СУБДИнструментЧто настроить
MS SQL ServerExtended EventsСессия с событиями rpc_completed и sql_batch_completed, фильтр по базе и длительности. 1С отправляет запросы через sp_executesql, поэтому главное событие — rpc_completed
MS SQL ServerSQL Server ProfilerШаблон трассировки с теми же событиями. Сам Microsoft считает Profiler устаревшим, на нагруженном сервере он заметно тормозит работу
PostgreSQLЖурнал сервераlog_min_duration_statement = 1000 в postgresql.conf — запись всех запросов дольше 1 секунды; применить: SELECT pg_reload_conf();
PostgreSQLpg_stat_statementsСтатистика по запросам: число вызовов, суммарное время. Нужна строка в shared_preload_libraries и перезапуск СУБД

Перезапуск PostgreSQL для подключения pg_stat_statements обрывает все сеансы 1С, планируйте его на нерабочее время.

Для постоянного мониторинга используют специализированные системы: «1С:Центр управления производительностью» из комплекта «1С:КИП» и сторонние сервисы анализа техжурнала. Они собирают те же события DBMSSQL, группируют одинаковые запросы и показывают, какой из них занимает больше всего времени.

Веб-клиент, тонкий клиент и мобильное приложение

Запросы в 1С 8.3 всегда выполняются на сервере, поэтому тип клиента не меняет сам запрос. Меняется только то, как подключить отладчик.

  • 🌐 Веб-клиент. Код сервера отлаживается так же, как для тонкого клиента : точка останова в серверной процедуре, отладка сервера. Для отладки клиентского кода веб-клиент запускают с параметром DebuggerURL в адресе базы и подключают его в конфигураторе через Отладка → Подключение.
  • 💻 Тонкий клиент в клиент-серверной базе. Отлаживается сервер 1С с ключом -debug, техжурнал пишется на сервере рабочих процессов.
  • 📱 Мобильное приложение на мобильной платформе. В автономном режиме запросы выполняются к локальной базе на устройстве. Техжурнала там нет; для отладки мобильная платформа подключается к серверу отладки по HTTP, а текст удобнее выводить из кода сообщением.
  • 📲 Мобильный клиент к обычной базе. Работает как тонкий клиент: запросы на сервере, смотреть их тем же техжурналом.

Частые промахи и вопросы

Что чаще всего мешает увидеть нужный запрос:

  • ❌ Смотрят текст в схеме СКД и удивляются, что отчёт выдаёт другое: выполняется итоговый запрос из макета, а не шаблон из схемы.
  • ❌ Ищут SQL-текст в журнале регистрации — его там нет, это задача техжурнала.
  • ❌ Оставляют logcfg.xml с all на рабочем сервере, и через сутки заканчивается место на диске.
  • ❌ Правят запрос типового отчёта прямо в конфигурации на поддержке вместо копии или расширения.
Можно ли посмотреть запрос отчёта без конфигуратора?
Только для внешнего отчёта, если открыть файл в конфигураторе другой базы. Для встроенных отчётов текст хранится в конфигурации, и из режима 1С:Предприятие его не открыть.
Почему в техжурнале нет запросов из файловой базы?
Для файловой базы событие называется DBV8DBENG, а не DBMSSQL. Добавьте его в logcfg.xml и ищите журнал на компьютере пользователя, где работает клиент.
Как узнать, какой запрос сейчас тормозит у пользователя?
Включите техжурнал с событием DBMSSQL или DBPOSTGRS и фильтром по длительности. Свойство Context покажет модуль и строку кода, откуда пришёл долгий запрос.
Почему в итоговом SQL больше таблиц, чем в запросе 1С?
Платформа добавляет соединения для разыменования ссылок через точку, ограничения доступа RLS и вспомогательные временные таблицы. Поэтому один короткий запрос 1С может дать длинный SQL.
Повлияет ли отладка на других пользователей?
Остановка на точке останова в серверном коде задерживает только ваш сеанс. Но перезапуск сервера с ключом -debug обрывает все сеансы, поэтому отладку включают на тестовом сервере.