Работа с запросами в 1С:Предприятие — одна из ключевых задач для разработчиков и администраторов. Без понимания, где и как хранятся запросы, невозможно эффективно модифицировать отчеты, обрабатывать данные или устранять ошибки. Однако структура хранения запросов в не всегда очевидна: они могут быть распределены по модулям, отчетам, обработкам и даже внешним файлам.

Эта статья поможет разобраться, где именно находятся запросы в различных версиях (8.3, 8.2), как их быстро найти с помощью встроенных инструментов конфигуратора, и какие нюансы важно учитывать при работе с ними. Мы рассмотрим не только стандартные места хранения, но и малоизвестные «укромные уголки», где запросы могут скрываться от неопытного глаза.

Особое внимание уделим практическим сценариям: поиску запросов по тексту, анализу их производительности и безопасному редактированию. Если вы когда-нибудь теряли часы на поиск «того самого» запроса в огромной конфигурации — этот материал для вас.

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

В отличие от традиционных СУБД (например, Microsoft SQL Server или PostgreSQL), где запросы выполняются напрямую к базе данных, в 1С:Предприятие они являются частью конфигурации — метаданных, описывающих логику работы программы. Физически запросы не хранятся в таблицах базы данных (например, в SQL-таблицах), а входят в состав:

  • 📄 Модулей объектов (модули документов, справочников, регистров и т.д.)
  • 📊 Отчетов и обработок (включая стандартные и пользовательские)
  • 🔧 Общих модулей (где часто выносят универсальные запросы)
  • 📁 Внешних файлов (если запросы хранятся в .epf или .erf)
  • 🖥️ Констант и реквизитов (редко, но встречаются запросы в вычисляемых полях)

Важно понимать, что сам текст запроса хранится в конфигурации в виде строки (в формате языка ), а не в компилированном виде. При выполнении запрос преобразуется в SQL-команду (для файловых баз — в внутренний формат ), но его исходный код всегда остается доступным для редактирования.

Исключение составляют внешние источники данных (например, подключение к PostgreSQL через ADO или HTTP-сервисы), где запросы могут выполняться напрямую в другой СУБД. В этом случае их текст хранится в модулях интеграции.

💡

Если вы ищете запрос, который выполняется при открытии формы, сначала проверьте модуль этой формы (Модуль формы или Модуль объекта). Часто там размещают запросы для заполнения динамических списков.

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

Самый очевидный способ — использовать поиск по тексту в конфигураторе. Для этого:

  1. Откройте конфигуратор в режиме 1С:Предприятие (с правами администратора).
  2. Нажмите Ctrl + Shift + F (или выберите Правка → Найти в текстах...).
  3. В поле поиска введите ключевые слова, например:
    • Запрос = Новый Запрос;
    • ВЫБРАТЬ или SELECT (если используются англоязычные конструкции)
    • Имя таблицы или поля, которое вас интересует (например, Документ.РеализацияТоваровУслуг)
  4. Установите флажки Искать в модулях и Искать в текстах запросов.
  5. Если поиск не дал результатов, проверьте:

    • 🔍 Регистр букв — поиск в чувствителен к регистру (например, ВЫБРАТЬ и выбрать — разные запросы).
    • 📂 Внешние файлы — запросы могут быть в подключаемых обработках (.epf) или расширениях.
    • 🔄 Синонимы — иногда вместо Запрос используют Query или mQuery (в старых конфигурациях).

Для ускорения поиска в больших конфигурациях (например, 1С:ERP или 1С:УТ 11) используйте фильтрацию по типам объектов. Например, если вы ищете запрос для отчета, ограничьте поиск только отчетами:

// Пример фильтра в окне поиска:

ТипОбъекта = "Отчет"

📊 Какой метод поиска запросов вы используете чаще?
Поиск по тексту (Ctrl+Shift+F)
Просмотр модулей вручную
Внешние инструменты (например, 1С:Анализ кода)
Другой способ

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

Запросы редко «разбросаны» хаотично — их размещение подчиняется логике конфигурации. Ниже приведена таблица с наиболее частыми локациями и примерами, где их искать.

Место хранения Примеры объектов Типичные сценарии использования
Модули документов Документ.ПоступлениеТоваров, Документ.РеализацияТоваровУслуг Запросы для заполнения табличных частей, проверки уникальности, расчета итогов.
Модули справочников Справочник.Номенклатура, Справочник.Контрагенты Запросы для динамического фильтрации списков, заполнения реквизитов по умолчанию.
Отчеты и обработки Отчет.ВедомостьПоТоварам, Обработка.ЗагрузкаДанных Сложные запросы с объединениями (ОБЪЕДИНИТЬ), группировками, временными таблицами.
Общие модули ОбщийМодуль.РаботаСЗапросами, ОбщийМодуль.УниверсальныеФункции Универсальные функции для выполнения типовых запросов (например, получение остатков).
Формы (модули форм) Форма.Документ.ЗаказПокупателя.ФормаОбъекта Запросы для заполнения динамических списков, фильтров, выпадающих списков.

Критичный нюанс: в типовой конфигурации 1С:Бухгалтерия 3.0 более 60% запросов сосредоточено в отчетах и общих модулях, тогда как в 1С:УТ 11 значительная часть находится в модулях документов (из-за логики торговли). Это означает, что стратегия поиска должна адаптироваться под конкретную конфигурацию.

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

Где искать запросы в расширениях конфигурации?

Расширения (.cfe-файлы) могут переопределять стандартные запросы. Чтобы их найти:

1. Откройте расширение в конфигураторе (Файл → Открыть...).

2. Проверьте модули объектов, которые расширение модифицирует (например, Документ.РеализацияТоваровУслуг).

3. Используйте поиск по тексту внутри расширения — часто там дублируются запросы с добавлением новой логики.

4. Поиск запросов по выполнению (отладка)

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

  1. Запустите 1С:Предприятие в режиме отладки (Отладка → Начать отладку).
  2. Установите точку останова в месте, где, по вашему мнению, выполняется запрос (например, при открытии отчета или проведении документа).
  3. Когда выполнение дойдет до точки останова, используйте F11 (шаг в код), чтобы перейти к месту вызова запроса.
  4. Если запрос выполняется в цикле или динамически формируется, проследите цепочку вызовов в Стеке вызовов (Отладка → Окна → Стек вызовов).

Для анализа производительности запросов используйте:

  • 📈 План запроса — показывает, как оптимизирует запрос перед выполнением. Включается через:
    Запрос.ПланВременныхТаблиц = Истина;
    

    Запрос.Объяснить();

  • 🛠️ Журнал регистрации — записывает все выполненные запросы (настройте регистрацию событий Запрос в Администрирование → Журналы регистрации).
⚠️ Внимание: В клиент-серверном варианте работы некоторые запросы могут выполняться на сервере, и их трассировка требует прав администратора сервера 1С:Предприятие. Без этого вы увидите только клиентскую часть кода.

Установить точку останова перед выполнением запроса|Проверить переменные, участвующие в формировании текста запроса|Использовать F11 для пошагового выполнения|Просмотреть результат запроса в отладочном окне (через ВывестиЗначение())|Анализировать план запроса при низкой производительности-->

5. Работа с запросами во внешних файлах и расширениях

Если запрос не найден в основной конфигурации, проверьте:

  1. Внешние обработки и отчеты (.epf, .erf):
    • Откройте файл через конфигуратор (Файл → Открыть...).
    • Используйте поиск по тексту внутри обработки.
  • Расширения конфигурации (.cfe):
    • Расширения могут модифицировать стандартные запросы. Проверьте их через Конфигурация → Расширения.
    • Обратите внимание на процедуры с префиксом Доп (например, ДопЗаполнитьДанные).
    • HTTP-сервисы и веб-расширения:
      • Если запрос выполняется через REST API или SOAP, его текст может храниться в модулях HTTPСервис или WSСсылка.

    Для поиска во внешних файлах удобно использовать текстовые редакторы с поддержкой регулярных выражений (например, Notepad++ или VS Code). Ищите шаблоны:

    • Запрос\s*=\s*Новый\s+Запрос (создание объекта запроса)
    • ВЫБРАТЬ\s+.+ИЗ\s+.+ГДЕ (начало текста запроса)
    • \.УстановитьПараметр\(" (установка параметров запроса)

    Если внешний файл защищен паролем, используйте утилиты вроде 1Cv8dt (для файловых баз) или обратитесь к администратору системы.

    ⚠️ Внимание: Изменение запросов во внешних обработках или расширениях может привести к конфликтам при обновлении конфигурации. Всегда создавайте резервные копии перед редактированием.
    💡

    Внешние файлы (.epf, .cfe) — первое место, где стоит искать «исчезнувшие» запросы, если их нет в основной конфигурации. Часто они дублируются там с доработками.

    6. Анализ и оптимизация найденных запросов

    Найти запрос — половина дела. Далее важно проанализировать его производительность и корректность. Вот ключевые моменты:

    • 🔍 Проверка плана запроса:

      Используйте метод Объяснить() для анализа, как оптимизирует запрос. Обратите внимание на:

      • Полное сканирование таблиц (TABLE SCAN) — признак отсутствия индексов.
      • Вложенные циклы (NESTED LOOP) — могут тормозить на больших объемах данных.
    • Оптимизация текста запроса:

      Избегайте конструкций, которые замедляют выполнение:

      • ВЫБРАТЬ РАЗЛИЧНЫЕ — заменяйте на ГРУППИРОВКА ПО с агрегатными функциями.
      • ПОМЕСТИТЬ во временные таблицы без необходимости.
      • Подзапросы в условиях (ГДЕ поле IN (ВЫБРАТЬ...)) — заменяйте на соединения (ЛЕВОЕ СОЕДИНЕНИЕ).
    • 📊 Тестирование на реальных данных:

      Запускайте запрос в Консоли запросов (Все функции → Консоль запросов) с включенным таймером:

      НачатьИзмерение();
      

      Результат = Запрос.Выполнить();

      Сообщить("Время выполнения: " + ОкончитьИзмерение());

    Если запрос выполняется слишком долго, проверьте:

    • 📌 Наличие индексов на полях, используемых в условиях (ГДЕ, СОЕДИНЕНИЕ).
    • 🔄 Логику соединений — иногда лишние ПОЛНОЕ СОЕДИНЕНИЕ замедляют запрос.
    • 🗑️ Объем временных таблиц — если они не очищаются, это может приводить к утечкам памяти.

    Для сложных запросов используйте разбиение на части:

    1. Вынесите промежуточные результаты во временные таблицы.

    2. Используйте ОБЪЕДИНИТЬ ВСЕ вместо подзапросов.

    3. Применяйте ИНДЕКСИРОВАТЬ ПО для ускорения соединений.

    💡

    Если запрос возвращает больше 10 000 строк, рассмотрите возможность пагинации (постраничного вывода) или ограничения результатов через ПЕРВЫЕ 1000.

    7. Ошибки при работе с запросами и как их избежать

    Даже опытные разработчики допускают ошибки при поиске и редактировании запросов. Вот наиболее распространенные:

    Ошибка Последствия Как избежать
    Редактирование запроса без резервной копии Потеря работоспособности отчета или документа Всегда сохраняйте копию конфигурации перед изменениями (Файл → Сохранить данные конфигурации...)
    Поиск только по ключевому слову ВЫБРАТЬ Пропуск запросов с англоязычным синтаксисом (SELECT) Используйте регулярные выражения или ищите по Новый Запрос
    Игнорирование временных таблиц Утечки памяти и замедление системы Проверяйте, что временные таблицы удаляются после использования (Уничтожить())
    Изменение запросов в типовых конфигурациях Конфликты при обновлении Выносите изменения в расширения или внешние обработки

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

    • 🔒 Наличие НачатьТранзакцию() и ЗафиксироватьТранзакцию().
    • 🚫 Обработку исключений (Попытка...Исключение) для отката транзакций.
    ⚠️ Внимание: В файловом варианте длительные запросы могут блокировать базу для других пользователей. Тестируйте такие запросы в нерабочее время или на тестовой копии.

    Если вы работаете с управляемыми блокировками (в клиент-серверном варианте), убедитесь, что запрос не держит блокировки дольше необходимого. Используйте:

    Запрос.УстановитьБлокировкуДанных(УровеньБлокировки.Выборка);

    FAQ: Частые вопросы о поиске запросов в 1С

    Можно ли найти все запросы в конфигурации автоматически?

    Да, для этого используйте:

    1. Скрипт на языке , который рекурсивно обходит все модули и ищет текстовые вхождения Запрос = Новый Запрос.
    2. Внешние утилиты, например, 1С:Анализ кода или SonarQube с плагинами для .
    3. Готовые обработки из Инфостарта (например, «Поиск запросов по конфигурации»).

    Обратите внимание, что такие инструменты могут не найти запросы, динамически формируемые через СтрокаЗапроса = "";.

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

    Сначала проверьте:

    1. Модуль формы (Модуль формы объекта) — ищите процедуры ПриОткрытии или ПриСозданииНаСервере.
    2. Модуль менеджера — если форма управляемая, запрос может выполняться в методе ПриСозданииДинамическогоСписка.
    3. Клиентский и серверный контексты — некоторые запросы выполняются на клиенте (например, для фильтрации списков).

    Если не нашли — используйте отладку с точкой останова на событии ПриОткрытии.

    Что делать, если запрос найден, но его текст обфусцирован?

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

    • Используйте деобфускаторы (например, Deobfuscator for 1C из открытых источников).
    • Просмотрите план запроса — он покажет реальную структуру, даже если текст зашифрован.
    • Сравните с аналогичными запросами в типовой конфигурации — часто обфусцируют только имена переменных.

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

    Как экспортировать все запросы из конфигурации для анализа?

    Для экспорта:

    1. Используйте обработку «Выгрузка текстов модулей» (доступна на Инфостарте).
    2. Напишите скрипт, который обходит все модули и сохраняет текст в .txt-файлы с пометкой // Запрос:.
    3. Для анализа производительности экспортируйте запросы в SQL Server Profiler (если используется MS SQL).

    Пример скрипта для поиска и экспорта:

    Процедура ЭкспортироватьЗапросы()
    

    МассивМодулей = Новый Массив;

    // Получаем все модули конфигурации

    Для Каждого Объект Из Метаданные.Объекты Цикл

    Если Объект.Модуль <> Неопределено Тогда

    МассивМодулей.Добавить(Объект.Модуль);

    КонецЕсли;

    КонецЦикла;

    // Ищем запросы и сохраняем в файл

    ТекстДляПоиска = "Запрос = Новый Запрос";

    Для Каждого Модуль Из МассивМодулей Цикл

    Если СтрНайти(Модуль.Текст, ТекстДляПоиска) > 0 Тогда

    ЗаписатьВФайл(Модуль.Текст, "C:\Export\Запросы_" + Объект.Имя + ".txt");

    КонецЕсли;

    КонецЦикла;

    КонецПроцедуры

    Могут ли запросы храниться в реквизитах или константах?

    Да, но крайне редко. Примеры:

    • В реквизитах типа Строка — если запрос хранится как текст и выполняется через Выполнить().
    • В константах — иногда так хранят шаблоны запросов (например, для динамического формирования отчетов).
    • В плане обмена — запросы для синхронизации данных.

    Чтобы найти такие запросы, ищите в коде конструкции вида:

    ТекстЗапроса = Константа.ШаблонЗапросаОстатков;
    

    Запрос.Текст = ТекстЗапроса;