Открываем и выполняем сохранённый запрос в 1С

· 9 мин

Содержание

Готовый текст запроса открывают в консоли запросов — внешней обработке, которую запускают в режиме 1С:Предприятие через Файл → Открыть. В консоли есть кнопка чтения запроса из файла: выбираете сохранённый файл, текст подставляется в окно, задаёте параметры и нажимаете «Выполнить». Так в 1С загружают и прогоняют запрос, не трогая код конфигурации.

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

Что такое файл запроса и где взять консоль

«Файл запроса» — это сохранённый на диск текст на языке запросов 1С. Сама по себе платформа отдельного формата под запросы не держит, поэтому файлы бывают двух видов:

  • 📄 Текстовый файл (.txt, иногда с расширением .q) — просто текст ВЫБРАТЬ … ИЗ …. Открывается любым блокнотом.
  • 🗂️ XML консоли — файл, который сохранила сама консоль запросов. Кроме текста в нём лежат параметры и их значения.

Формат MXL к запросам отношения не имеет — это табличный документ (результат можно выгрузить в .mxl, но сам запрос в нём не хранится). Если вам прислали .mxl и сказали «запрос», внутри почти наверняка результат выборки, а не текст запроса.

Консоль запросов — внешняя обработка .epf. Её не нужно писать самому: типовую «Консоль запросов» фирма «1С» выкладывает в разделе поддержки, часто она уже лежит в папке с дополнительными обработками у администратора базы. В ряде конфигураций есть встроенный аналог — его открывают из меню Все функции.

Если команды Все функции не видно, включите её: Главное меню → Сервис → Параметры → Отображать команду "Все функции". Главное меню — это кнопка со стрелкой вниз в левом верхнем углу интерфейса «Такси».

Как открыть консоль запросов в 1С:Предприятии

Запускать консоль нужно именно в пользовательском режиме, а не в Конфигураторе — там запросы не выполняются по живым данным. Порядок такой:

  1. Войдите в базу в режиме 1С:Предприятие.
  2. Откройте Файл → Открыть (или Ctrl+O).
  3. Укажите путь к файлу обработки консоли, например КонсольЗапросов.epf.
  4. Разрешите запуск, если платформа переспросит про безопасность внешней обработки.

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

Внешние обработки выполняют произвольный код. Открывайте только файлы из доверенного источника: с диска ИТС, от своего администратора или разработчика. Чужой .epf из переписки или с форума может навредить базе.

Загрузка текста запроса из файла в консоль

Когда консоль открыта, в её командной панели есть команды работы с файлом. Называются они по-разному в разных сборках, но по смыслу это «Прочитать запрос из файла» и «Сохранить запрос в файл». Ищите их:

  • в меню Файл или Ещё внутри формы консоли;
  • рядом с полем текста запроса, иногда в виде иконок папки/дискеты.

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

Текстовый файл (.txt) тоже грузится, но параметров в нём нет — их придётся задать вручную (см. ниже). Если команды чтения файла в консоли не оказалось, просто откройте файл блокнотом, скопируйте текст и вставьте в окно запроса через Ctrl+V — результат тот же.

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

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

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

Параметры и временные таблицы перед запуском

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

В консоли за это отвечает отдельная вкладка (обычно «Параметры»). После загрузки текста консоль сама находит в нём все &Имя и выводит их списком. Для каждого параметра укажите:

  • тип — дата, число, строка, ссылка на справочник или документ;
  • значение — конкретную дату, число или выбранный из базы элемент.

Пример: для запроса с условием ГДЕ Остатки.Период <= &ДатаОстатков в параметре ДатаОстатков выбираете тип «Дата» и ставите нужную дату.

Пара тонкостей по типам параметров:

  • для даты важно учитывать время. Если нужен конец дня, задавайте не 01.10 в 00:00, а конец суток — иначе документы за последний день не попадут в выборку;
  • список значений задают, когда в запросе есть условие В (&Список) — тип параметра выбирают «Список значений» и наполняют его нужными элементами;
  • ссылку (на номенклатуру, контрагента, склад) выбирают прямо из базы, как в обычной форме, — консоль откроет справочник для выбора.

Временные таблицы. Если в запросе есть оператор ПОМЕСТИТЬ, это пакет из нескольких запросов: первый кладёт данные во временную таблицу, следующий из неё читает. Консоль выполняет такой пакет целиком — ничего дополнительно грузить не нужно. А вот если временная таблица заполняется извне (передаётся как параметр-таблица), заранее данные готовит тот код, который запрос вызывает; в чистой консоли такой запрос нужно упростить или подать таблицу через параметр, если консоль это поддерживает.

Перед нажатием «Выполнить» проверьте
Выполнено: 0 / 5

Запуск, проверка результата и отладка запроса

Запускают запрос кнопкой «Выполнить» (часто это красный восклицательный знак или F5/F8 — зависит от сборки консоли). Результат появляется в нижней таблице.

Что проверять в результате:

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

Для отладки больших запросов удобно выполнять пакет по частям. Временно уберите хвост после первого ПОМЕСТИТЬ и посмотрите, что попало во временную таблицу. Так находят, на каком шаге данные «теряются».

Готовый результат обычно не остаётся в консоли насовсем. Его выгружают дальше одним из способов:

  • скопировать строки таблицы результата через буфер обмена и вставить в Excel;
  • сохранить результат в файл табличного документа (.mxl) командой сохранения из таблицы результата;
  • в коде — методом Выгрузить() получить таблицу значений и обработать её программно.

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

Многие консоли показывают план запроса и замер времени. Если запрос работает медленно, смотрите, по каким полям идёт отбор, и есть ли по ним индексы. Соединение с подзапросом без условия — частая причина тормозов.

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

Частые ошибки при загрузке и выполнении запроса

Диагностика: выберите симптом

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

Автоматизация: загрузка и выполнение запроса из кода

Когда запрос нужно выполнять не руками, а по расписанию или внутри обработки, его переносят во встроенный язык. Самый прямой способ — задать текст прямо в коде:

Запрос = Новый Запрос;
Запрос.Текст =
    "ВЫБРАТЬ
    |   Номенклатура.Ссылка КАК Ссылка,
    |   Номенклатура.Наименование КАК Наименование
    |ИЗ
    |   Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    |   Номенклатура.Наименование ПОДОБНО &Шаблон";

Запрос.УстановитьПараметр("Шаблон", "%стол%");

Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
    Сообщить(Выборка.Наименование);
КонецЦикла;

Если текст запроса лежит в отдельном файле и его нужно именно «загрузить», прочитайте файл текстовым документом и передайте строку в запрос:

ТекстЗапроса = Новый ТекстовыйДокумент;
ТекстЗапроса.Прочитать("C:\Запросы\ОстаткиТоваров.txt");

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

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

Метод Прочитать берёт текст из файла, ПолучитьТекст() возвращает его строкой, а конструктор Новый Запрос(<текст>) сразу принимает этот текст. Дальше — привычные УстановитьПараметр и Выполнить.

Запись пути к файлу через C:\... работает только на той машине, где файл физически лежит. В клиент-серверной базе код выполняется на сервере, и путь должен быть доступен именно серверу 1С, а не вашему компьютеру. Для переноса запросов между базами надёжнее хранить текст в макете обработки, а не во внешнем файле.

Временные таблицы в коде наполняют через МенеджерВременныхТаблиц: создаёте менеджер, присваиваете его свойству Запрос.МенеджерВременныхТаблиц, выполняете запрос с ПОМЕСТИТЬ — и следующий запрос того же менеджера читает готовую временную таблицу:

МенеджерВТ = Новый МенеджерВременныхТаблиц;

Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
Запрос.Текст =
    "ВЫБРАТЬ
    |   Товары.Номенклатура КАК Номенклатура
    |ПОМЕСТИТЬ ВыбранныеТовары
    |ИЗ
    |   &ТаблицаТоваров КАК Товары";
Запрос.УстановитьПараметр("ТаблицаТоваров", ТаблицаТоваров);
Запрос.Выполнить();

После этого второй запрос с тем же МенеджерВТ обращается к таблице ВыбранныеТовары как к обычному источнику. Такой приём заменяет тяжёлые подзапросы и часто ускоряет выборку. Главное — не забыть присвоить менеджер каждому запросу пакета, иначе второй запрос временную таблицу не увидит.

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

Можно ли загрузить запрос прямо в Конфигураторе?
Готовый файл запроса выполняют в консоли в режиме 1С:Предприятие. В Конфигураторе доступен конструктор запроса — он помогает собрать или поправить текст, но прогнать запрос по данным базы там нельзя.
Чем отличается файл `.txt` от XML консоли?
В .txt лежит только текст запроса. XML, сохранённый консолью, хранит ещё и параметры с их значениями — после загрузки такого файла задавать параметры заново не нужно.
Запрос загрузился, но результат пустой. Почему?
Чаще всего не заданы параметры или условие в ГДЕ отсекает все строки. Проверьте вкладку параметров и временно уберите условия, чтобы убедиться, что данные в таблице вообще есть.
Как передать в запрос список значений или таблицу?
Список задают параметром типа «Список значений» и используют в условии В (&Список). Таблицу в коде передают через параметр-таблицу или временную таблицу с МенеджерВременныхТаблиц.
Почему после загрузки текст стал нечитаемым?
Файл сохранён в другой кодировке. Храните текстовые запросы в UTF-8 и при загрузке выбирайте ту же кодировку — тогда кириллица не поломается.