Как отыскать нужный запрос в конфигурации 1С: модули, СКД, отладка
Содержание
Запросы в 1С не хранятся отдельным списком. Это текст на языке запросов, который лежит внутри объектов конфигурации: в модулях, в схемах компоновки данных отчётов, в свойствах динамических списков форм. Поэтому искать их нужно в конфигураторе — глобальным поиском Ctrl+Shift+F, через выгрузку конфигурации в файлы или ловить «на лету» отладчиком и технологическим журналом.
Типичная ситуация: отчёт показывает не те цифры или документ проводится минуту, и нужно понять, какой запрос за этим стоит. Если знать, в каких объектах находятся запросы в 1С 8.3 и по какому фрагменту искать, нужный текст находится за несколько минут, без пролистывания сотен модулей.
Где физически хранятся запросы в базе 1С
Тексты запросов — часть конфигурации. А конфигурация хранится внутри самой информационной базы, а не в отдельных файлах на диске.
| Вариант базы | Где лежит конфигурация с запросами |
|---|---|
| Файловая | В файле базы 1Cv8.1CD вместе с данными |
| Клиент-серверная | В служебных таблицах базы СУБД (Config — основная конфигурация, ConfigSave — конфигурация, ещё не применённая к базе) |
| Расширения | Тоже в информационной базе, отдельно от основной конфигурации |
| Внешние отчёты и обработки | В файлах .erf и .epf или в справочнике дополнительных отчётов и обработок |
Конфигурация хранится в сжатом двоичном виде. Открыть таблицу Config в SQL Server Management Studio и прочитать там текст запроса не получится — это бессмысленная трата времени.
Рабочий доступ к текстам запросов один: конфигуратор (или 1С:EDT), либо выгрузка конфигурации в файлы. Всё остальное — производные от этих двух путей.
Отдельный случай — запросы, которые пользователь собрал в консоли запросов. Это внешняя обработка, и сохранённые в ней тексты лежат в файле, который пользователь выбрал при сохранении. В конфигурацию они не попадают.
Как найти запрос в конфигураторе 1С
Откройте базу в режиме «Конфигуратор», затем Конфигурация → Открыть конфигурацию. Дальше есть три рабочих способа.
Глобальный поиск по тексту
- Нажмите
Ctrl+Shift+F(илиПравка → Глобальный поиск). - Введите строку поиска.
- Задайте область: вся конфигурация или только выделенные в дереве объекты.
- Результаты откроются отдельным окном. Двойной клик ведёт прямо к строке кода.
Главный вопрос — что именно вводить. Слово ВЫБРАТЬ даст тысячи совпадений в типовой конфигурации. Ищите по уникальным фрагментам:
- 🔎 имя таблицы:
Документ.РеализацияТоваровУслуг,РегистрНакопления.ТоварыНаСкладах; - 🔎 имя виртуальной таблицы:
.ОстаткиИОбороты(,.СрезПоследних(; - 🔎 имя параметра:
&ДатаНачала,&Организация; - 🔎 псевдоним поля, который вы видите в колонке отчёта;
- 🔎 имя временной таблицы:
ВТ_Товарыи подобные.
В типовых конфигурациях текст запроса часто собирают из кусков и подменяют фрагменты через СтрЗаменить. Длинная фраза целиком может не найтись. Ищите по короткому уникальному куску — имени таблицы или параметра.
Поиск через дерево метаданных
Если вы знаете объект, но не знаете процедуру, идите от объекта. Откройте документ или отчёт в дереве и проверьте по очереди:
- Модуль менеджера — там обычно лежат запросы для проведения и печати.
- Модуль объекта.
- Модули форм.
- Макеты — особенно схемы компоновки данных.
Поиск по тексту внутри открытого модуля — обычный 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С
Когда понятно, что ищем, полезно знать, куда разработчики кладут запросы чаще всего. Это экономит первый круг поиска.
| Где | Что там обычно | Как открыть |
|---|---|---|
| Модуль менеджера документа | Запросы проведения, печатных форм, заполнения | Документ → правый клик → «Открыть модуль менеджера» |
| Общие модули | Служебные запросы, переиспользуемые функции | Ветка «Общие → Общие модули» |
| Схема компоновки данных отчёта | Основной запрос отчёта | Отчёт → Макеты → ОсновнаяСхемаКомпоновкиДанных → вкладка «Наборы данных» |
| Динамический список формы | Запрос, который выводит список на экран | Форма → реквизит списка → свойства |
| Модуль формы | Запросы заполнения табличных частей, подбора | Форма → вкладка «Модуль» |
| Модуль объекта | Проверки и обработчики записи | Объект → «Открыть модуль объекта» |
Схема компоновки данных
Большая часть отчётов в типовых конфигурациях построена на СКД. Запрос там — не в коде, а в наборе данных схемы. Откройте макет, перейдите на вкладку «Наборы данных», выделите набор типа «Запрос». Текст будет справа, его можно открыть конструктором.
В одной схеме бывает несколько наборов, связанных между собой. Если цифра в отчёте не сходится — проверьте каждый.
Динамический список
Списки документов и справочников часто выводятся произвольным запросом. Откройте форму списка, выделите реквизит типа ДинамическийСписок и посмотрите свойства. Если включён флажок «Произвольный запрос», текст доступен по кнопке настройки списка.
Если флажок выключен, отдельного текста нет — список строится по основной таблице автоматически.
Как поймать запрос во время выполнения
Иногда по тексту не понять, какой из десятка запросов срабатывает на конкретном действии пользователя. Тогда ищем не в коде, а во время работы.
Отладчик
- В конфигураторе запустите
Отладка → Начать отладку(клавишаF5). - Найдите в модуле строку
Запрос.Выполнить()или.Выгрузить()и поставьте точку останова (F9). - Повторите действие в пользовательском режиме.
- Когда выполнение остановится, вызовите
Shift+F9— «Вычислить выражение». - Посмотрите
Запрос.ТекстиЗапрос.Параметры.
Текст из окна вычисления можно скопировать и выполнить в консоли запросов с теми же параметрами. Это быстрый способ понять, почему запрос вернул пусто.
Если код выполняется на сервере, а база клиент-серверная, на сервере 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, и сопоставлять их с объектами конфигурации приходится отдельно. Для поиска места в коде техжурнал удобнее.
Ctrl+Shift+F по имени таблицы. Не нашлось — выгрузка в файлы и поиск по XML.ОсновнаяСхемаКомпоновкиДанных и вкладку «Наборы данных».Выполнить() в отладчике.SDBL и свойством Context на время воспроизведения.Запросы во внешних отчётах, обработках и расширениях
Глобальный поиск в основной конфигурации не видит того, что лежит вне её. Это частая причина, по которой «запрос нигде не найден».
Внешние отчёты и обработки
Файлы .erf и .epf открывают в конфигураторе через Файл → Открыть. Внутри та же структура: модуль объекта, формы, макеты со схемами компоновки.
Если обработка подключена в базу как дополнительная, её файл хранится в справочнике дополнительных отчётов и обработок. В пользовательском режиме откройте карточку обработки в разделе Администрирование → Печатные формы, отчёты и обработки и выгрузите файл на диск. Дальше — как с обычным внешним файлом.
Расширения конфигурации
Расширение может перехватить метод типового модуля и подменить запрос. Тогда в основной конфигурации вы видите один текст, а работает другой.
- Откройте
Конфигурация → Расширения конфигурации. - Посмотрите список подключённых расширений.
- Откройте каждое и выполните поиск по тому же фрагменту.
- Ищите методы с аннотациями
&Вместо,&После,&Переди&ИзменениеИКонтроль— именно они меняют поведение типового кода.
При выгрузке в файлы расширения выгружаются отдельно — для каждого нужен свой каталог. В командной строке это делается тем же /DumpConfigToFiles с параметром -Extension и именем расширения.
Анализ и оптимизация найденного запроса
Нашли текст — дальше обычно нужно понять, что он делает и почему медленный или возвращает не то.
Разобрать структуру
В конфигураторе поставьте курсор внутрь текста запроса, вызовите контекстное меню и выберите «Конструктор запроса». Конструктор разложит текст по вкладкам: таблицы, связи, условия, группировки, пакет запросов. На длинных пакетных запросах это быстрее, чем читать текст.
Если текст собран в коде через СтрЗаменить или из нескольких строк, конструктор может не открыться или испортить вставки. Такие запросы правьте текстом.
Выполнить отдельно
Скопируйте текст в консоль запросов, задайте параметры и выполните. Смотрите результат каждого запроса пакета, включая временные таблицы. Так видно, на каком шаге пропадают строки.
Что искать при медленной работе
| Признак в тексте | Чем плох | Что делать |
|---|---|---|
Запрос внутри цикла Для Каждого | Сотни обращений к базе вместо одного | Вынести в один запрос с параметром-списком |
Отбор по периоду в ГДЕ у виртуальной таблицы | Таблица сначала собирается целиком | Перенести условие в параметры виртуальной таблицы |
| Обращение через точку к полям составного типа | Неявные соединения со всеми возможными таблицами | Использовать ВЫРАЗИТЬ к нужному типу |
| Соединение с подзапросом | СУБД плохо строит план | Вынести подзапрос во временную таблицу с индексом |
ИЛИ в условиях соединения | Индекс не используется | Разбить на ОБЪЕДИНИТЬ ВСЕ |
Замеры сравнивайте до и после правки на одних и тех же данных. Один прогон ничего не доказывает: второй запуск почти всегда быстрее за счёт кеша СУБД.
Ошибки при поиске и правке запросов
- ❌ Искали в конфигурации базы данных, а правили основную. В конфигураторе их две. Открытая через
Конфигурация → Открыть конфигурацию— основная. Изменения начнут работать только послеОбновить конфигурацию базы данных(F7). - ❌ Не проверили расширения. Запрос в типовом модуле правильный, а данные неверные — потому что метод перехвачен расширением.
- ❌ Искали длинную фразу из текста. Типовой код собирает запросы из частей, и фраза целиком в модуле не встречается.
- ❌ Правили типовую конфигурацию напрямую. Это снимает объект с поддержки и усложняет каждое обновление. Безопаснее перенести изменение в расширение.
- ❌ Оставили технологический журнал включённым. Через день на диске нет места, а сервер тормозит из-за записи логов.
- ❌ Меняли запрос в рабочей базе без копии. Перед изменением структуры конфигурации сделайте выгрузку
.dtили копию базы средствами СУБД.
Частые вопросы
Можно ли найти текст запроса через SQL, не открывая конфигуратор?
Config в сжатом двоичном виде. Читать тексты нужно через конфигуратор, EDT или выгрузку конфигурации в файлы.Где хранится запрос отчёта, если в модуле отчёта пусто?
ОсновнаяСхемаКомпоновкиДанных, и вкладку «Наборы данных».Как узнать, какой запрос выполняется при нажатии кнопки?
Выполнить() с наибольшим временем укажет на нужный модуль.Видит ли глобальный поиск запросы во внешних обработках?
Чем событие SDBL отличается от DBMSSQL в техжурнале?
SDBL — запрос на языке 1С, как в конфигурации. DBMSSQL — его перевод в SQL, который реально ушёл в MS SQL Server.