Как отыскать нужный запрос в конфигурации 1С: модули, СКД, отладка

· 9 мин

Содержание

Запросы в 1С не хранятся отдельным списком. Это текст на языке запросов, который лежит внутри объектов конфигурации: в модулях, в схемах компоновки данных отчётов, в свойствах динамических списков форм. Поэтому искать их нужно в конфигураторе — глобальным поиском Ctrl+Shift+F, через выгрузку конфигурации в файлы или ловить «на лету» отладчиком и технологическим журналом.

Типичная ситуация: отчёт показывает не те цифры или документ проводится минуту, и нужно понять, какой запрос за этим стоит. Если знать, в каких объектах находятся запросы в 1С 8.3 и по какому фрагменту искать, нужный текст находится за несколько минут, без пролистывания сотен модулей.

Где физически хранятся запросы в базе 1С

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

Вариант базыГде лежит конфигурация с запросами
ФайловаяВ файле базы 1Cv8.1CD вместе с данными
Клиент-сервернаяВ служебных таблицах базы СУБД (Config — основная конфигурация, ConfigSave — конфигурация, ещё не применённая к базе)
РасширенияТоже в информационной базе, отдельно от основной конфигурации
Внешние отчёты и обработкиВ файлах .erf и .epf или в справочнике дополнительных отчётов и обработок

Конфигурация хранится в сжатом двоичном виде. Открыть таблицу Config в SQL Server Management Studio и прочитать там текст запроса не получится — это бессмысленная трата времени.

Рабочий доступ к текстам запросов один: конфигуратор (или 1С:EDT), либо выгрузка конфигурации в файлы. Всё остальное — производные от этих двух путей.

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

Как найти запрос в конфигураторе 1С

Откройте базу в режиме «Конфигуратор», затем Конфигурация → Открыть конфигурацию. Дальше есть три рабочих способа.

Глобальный поиск по тексту

  1. Нажмите Ctrl+Shift+F (или Правка → Глобальный поиск).
  2. Введите строку поиска.
  3. Задайте область: вся конфигурация или только выделенные в дереве объекты.
  4. Результаты откроются отдельным окном. Двойной клик ведёт прямо к строке кода.

Главный вопрос — что именно вводить. Слово ВЫБРАТЬ даст тысячи совпадений в типовой конфигурации. Ищите по уникальным фрагментам:

  • 🔎 имя таблицы: Документ.РеализацияТоваровУслуг, РегистрНакопления.ТоварыНаСкладах;
  • 🔎 имя виртуальной таблицы: .ОстаткиИОбороты(, .СрезПоследних(;
  • 🔎 имя параметра: &ДатаНачала, &Организация;
  • 🔎 псевдоним поля, который вы видите в колонке отчёта;
  • 🔎 имя временной таблицы: ВТ_Товары и подобные.

В типовых конфигурациях текст запроса часто собирают из кусков и подменяют фрагменты через СтрЗаменить. Длинная фраза целиком может не найтись. Ищите по короткому уникальному куску — имени таблицы или параметра.

Поиск через дерево метаданных

Если вы знаете объект, но не знаете процедуру, идите от объекта. Откройте документ или отчёт в дереве и проверьте по очереди:

  1. Модуль менеджера — там обычно лежат запросы для проведения и печати.
  2. Модуль объекта.
  3. Модули форм.
  4. Макеты — особенно схемы компоновки данных.

Поиск по тексту внутри открытого модуля — обычный Ctrl+F.

Выгрузка конфигурации в файлы

Самый надёжный способ, когда нужно найти все запросы к таблице, включая схемы компоновки и формы. Меню: Конфигурация → Выгрузить конфигурацию в файлы. Получится каталог с XML-файлами и модулями .bsl.

Выгрузку можно сделать и из командной строки, без открытия конфигуратора:

"C:\Program Files\1cv8\8.3.24.1548\bin\1cv8.exe" DESIGNER /F "D:\Bases\Buh" /N "Администратор" /P "" /DumpConfigToFiles "D:\cfdump"

Номер версии в пути подставьте свой. Для серверной базы вместо /F укажите /S "сервер\имябазы".

Поиск по выгрузке в PowerShell — он корректно читает русский текст в UTF-8:

Get-ChildItem -Path "D:\cfdump" -Recurse -Include *.bsl,*.xml |
  Select-String -Pattern "РегистрНакопления.ТоварыНаСкладах" -List |
  Select-Object Path

Команда вернёт список файлов, где встречается таблица. Схема компоновки окажется в файле Template.xml в папке макета, динамический список — в Form.xml формы, код — в .bsl.

Классический findstr с кириллицей в UTF-8 работает плохо и может ничего не найти. Используйте PowerShell или поиск в редакторе кода.

Типичные места хранения запросов в 1С

Когда понятно, что ищем, полезно знать, куда разработчики кладут запросы чаще всего. Это экономит первый круг поиска.

ГдеЧто там обычноКак открыть
Модуль менеджера документаЗапросы проведения, печатных форм, заполненияДокумент → правый клик → «Открыть модуль менеджера»
Общие модулиСлужебные запросы, переиспользуемые функцииВетка «Общие → Общие модули»
Схема компоновки данных отчётаОсновной запрос отчётаОтчёт → Макеты → ОсновнаяСхемаКомпоновкиДанных → вкладка «Наборы данных»
Динамический список формыЗапрос, который выводит список на экранФорма → реквизит списка → свойства
Модуль формыЗапросы заполнения табличных частей, подбораФорма → вкладка «Модуль»
Модуль объектаПроверки и обработчики записиОбъект → «Открыть модуль объекта»

Схема компоновки данных

Большая часть отчётов в типовых конфигурациях построена на СКД. Запрос там — не в коде, а в наборе данных схемы. Откройте макет, перейдите на вкладку «Наборы данных», выделите набор типа «Запрос». Текст будет справа, его можно открыть конструктором.

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

Динамический список

Списки документов и справочников часто выводятся произвольным запросом. Откройте форму списка, выделите реквизит типа ДинамическийСписок и посмотрите свойства. Если включён флажок «Произвольный запрос», текст доступен по кнопке настройки списка.

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

Как поймать запрос во время выполнения

Иногда по тексту не понять, какой из десятка запросов срабатывает на конкретном действии пользователя. Тогда ищем не в коде, а во время работы.

Отладчик

  1. В конфигураторе запустите Отладка → Начать отладку (клавиша F5).
  2. Найдите в модуле строку Запрос.Выполнить() или .Выгрузить() и поставьте точку останова (F9).
  3. Повторите действие в пользовательском режиме.
  4. Когда выполнение остановится, вызовите Shift+F9 — «Вычислить выражение».
  5. Посмотрите Запрос.Текст и Запрос.Параметры.

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

Если код выполняется на сервере, а база клиент-серверная, на сервере 1С должна быть включена отладка. Без этого точки останова в серверных процедурах не сработают.

Замер производительности

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

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

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

Файл logcfg.xml кладут в каталог conf платформы. Минимальная настройка для запросов:

<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>
    <property name="all"/>
  </log>
</config>
  • 📄 SDBL — запрос на языке 1С, как он написан в конфигурации.
  • 📄 DBMSSQL — тот же запрос, переведённый в SQL для MS SQL Server. Для PostgreSQL событие называется DBPOSTGRS.
  • 📄 Свойство Context показывает модуль и строку, откуда пришёл запрос. По нему вы и находите место в конфигурации.

Журнал без фильтров растёт на гигабайты за минуты. Включайте его на время воспроизведения проблемы, ограничивайте фильтром по пользователю или базе и отключайте сразу после. Удалите файл logcfg.xml — запись остановится.

На стороне СУБД те же запросы видны в SQL Server Profiler или Extended Events. Но там уже SQL с именами таблиц вида _Document123, и сопоставлять их с объектами конфигурации приходится отдельно. Для поиска места в коде техжурнал удобнее.

Как вы ищете запрос?

Запросы во внешних отчётах, обработках и расширениях

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

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

Файлы .erf и .epf открывают в конфигураторе через Файл → Открыть. Внутри та же структура: модуль объекта, формы, макеты со схемами компоновки.

Если обработка подключена в базу как дополнительная, её файл хранится в справочнике дополнительных отчётов и обработок. В пользовательском режиме откройте карточку обработки в разделе Администрирование → Печатные формы, отчёты и обработки и выгрузите файл на диск. Дальше — как с обычным внешним файлом.

Расширения конфигурации

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

  1. Откройте Конфигурация → Расширения конфигурации.
  2. Посмотрите список подключённых расширений.
  3. Откройте каждое и выполните поиск по тому же фрагменту.
  4. Ищите методы с аннотациями &Вместо, &После, &Перед и &ИзменениеИКонтроль — именно они меняют поведение типового кода.

При выгрузке в файлы расширения выгружаются отдельно — для каждого нужен свой каталог. В командной строке это делается тем же /DumpConfigToFiles с параметром -Extension и именем расширения.

Анализ и оптимизация найденного запроса

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

Разобрать структуру

В конфигураторе поставьте курсор внутрь текста запроса, вызовите контекстное меню и выберите «Конструктор запроса». Конструктор разложит текст по вкладкам: таблицы, связи, условия, группировки, пакет запросов. На длинных пакетных запросах это быстрее, чем читать текст.

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

Выполнить отдельно

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

Что искать при медленной работе

Признак в текстеЧем плохЧто делать
Запрос внутри цикла Для КаждогоСотни обращений к базе вместо одногоВынести в один запрос с параметром-списком
Отбор по периоду в ГДЕ у виртуальной таблицыТаблица сначала собирается целикомПеренести условие в параметры виртуальной таблицы
Обращение через точку к полям составного типаНеявные соединения со всеми возможными таблицамиИспользовать ВЫРАЗИТЬ к нужному типу
Соединение с подзапросомСУБД плохо строит планВынести подзапрос во временную таблицу с индексом
ИЛИ в условиях соединенияИндекс не используетсяРазбить на ОБЪЕДИНИТЬ ВСЕ

Замеры сравнивайте до и после правки на одних и тех же данных. Один прогон ничего не доказывает: второй запуск почти всегда быстрее за счёт кеша СУБД.

Ошибки при поиске и правке запросов

  • ❌ Искали в конфигурации базы данных, а правили основную. В конфигураторе их две. Открытая через Конфигурация → Открыть конфигурацию — основная. Изменения начнут работать только после Обновить конфигурацию базы данных (F7).
  • ❌ Не проверили расширения. Запрос в типовом модуле правильный, а данные неверные — потому что метод перехвачен расширением.
  • ❌ Искали длинную фразу из текста. Типовой код собирает запросы из частей, и фраза целиком в модуле не встречается.
  • ❌ Правили типовую конфигурацию напрямую. Это снимает объект с поддержки и усложняет каждое обновление. Безопаснее перенести изменение в расширение.
  • ❌ Оставили технологический журнал включённым. Через день на диске нет места, а сервер тормозит из-за записи логов.
  • ❌ Меняли запрос в рабочей базе без копии. Перед изменением структуры конфигурации сделайте выгрузку .dt или копию базы средствами СУБД.

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

Можно ли найти текст запроса через SQL, не открывая конфигуратор?
Нет. Конфигурация хранится в таблице Config в сжатом двоичном виде. Читать тексты нужно через конфигуратор, EDT или выгрузку конфигурации в файлы.
Где хранится запрос отчёта, если в модуле отчёта пусто?
В схеме компоновки данных. Откройте макет отчёта, обычно ОсновнаяСхемаКомпоновкиДанных, и вкладку «Наборы данных».
Как узнать, какой запрос выполняется при нажатии кнопки?
Включите замер производительности, нажмите кнопку и остановите замер. Строка с вызовом Выполнить() с наибольшим временем укажет на нужный модуль.
Видит ли глобальный поиск запросы во внешних обработках?
Нет. Внешний файл нужно открыть в конфигураторе отдельно и искать внутри него.
Чем событие SDBL отличается от DBMSSQL в техжурнале?
SDBL — запрос на языке 1С, как в конфигурации. DBMSSQL — его перевод в SQL, который реально ушёл в MS SQL Server.