Открываем и выполняем сохранённый запрос в 1С
Содержание
Готовый текст запроса открывают в консоли запросов — внешней обработке, которую запускают в режиме 1С:Предприятие через Файл → Открыть. В консоли есть кнопка чтения запроса из файла: выбираете сохранённый файл, текст подставляется в окно, задаёте параметры и нажимаете «Выполнить». Так в 1С загружают и прогоняют запрос, не трогая код конфигурации.
Ниже — как получить саму консоль, какие форматы файлов она понимает, как подставить параметры и временные таблицы, проверить результат и что делать, если запрос не грузится. В конце — как загрузить и выполнить запрос прямо из встроенного языка.
Что такое файл запроса и где взять консоль
«Файл запроса» — это сохранённый на диск текст на языке запросов 1С. Сама по себе платформа отдельного формата под запросы не держит, поэтому файлы бывают двух видов:
- 📄 Текстовый файл (
.txt, иногда с расширением.q) — просто текстВЫБРАТЬ … ИЗ …. Открывается любым блокнотом. - 🗂️ XML консоли — файл, который сохранила сама консоль запросов. Кроме текста в нём лежат параметры и их значения.
Формат MXL к запросам отношения не имеет — это табличный документ (результат можно выгрузить в .mxl, но сам запрос в нём не хранится). Если вам прислали .mxl и сказали «запрос», внутри почти наверняка результат выборки, а не текст запроса.
Консоль запросов — внешняя обработка .epf. Её не нужно писать самому: типовую «Консоль запросов» фирма «1С» выкладывает в разделе поддержки, часто она уже лежит в папке с дополнительными обработками у администратора базы. В ряде конфигураций есть встроенный аналог — его открывают из меню Все функции.
Если команды Все функции не видно, включите её: Главное меню → Сервис → Параметры → Отображать команду "Все функции". Главное меню — это кнопка со стрелкой вниз в левом верхнем углу интерфейса «Такси».
Как открыть консоль запросов в 1С:Предприятии
Запускать консоль нужно именно в пользовательском режиме, а не в Конфигураторе — там запросы не выполняются по живым данным. Порядок такой:
- Войдите в базу в режиме 1С:Предприятие.
- Откройте
Файл → Открыть(илиCtrl+O). - Укажите путь к файлу обработки консоли, например
КонсольЗапросов.epf. - Разрешите запуск, если платформа переспросит про безопасность внешней обработки.
Второй способ — добавить консоль как дополнительную обработку один раз, чтобы потом открывать из меню. Путь: Администрирование → Печатные формы, отчёты и обработки → Дополнительные отчёты и обработки → Добавить. Это удобно, когда консолью пользуются регулярно.
Внешние обработки выполняют произвольный код. Открывайте только файлы из доверенного источника: с диска ИТС, от своего администратора или разработчика. Чужой .epf из переписки или с форума может навредить базе.
Загрузка текста запроса из файла в консоль
Когда консоль открыта, в её командной панели есть команды работы с файлом. Называются они по-разному в разных сборках, но по смыслу это «Прочитать запрос из файла» и «Сохранить запрос в файл». Ищите их:
- в меню
ФайлилиЕщёвнутри формы консоли; - рядом с полем текста запроса, иногда в виде иконок папки/дискеты.
Нажмите команду чтения, выберите сохранённый файл — текст подставится в окно запроса. Если файл был сохранён этой же консолью в XML, вместе с текстом подтянутся и заданные ранее параметры.
Текстовый файл (.txt) тоже грузится, но параметров в нём нет — их придётся задать вручную (см. ниже). Если команды чтения файла в консоли не оказалось, просто откройте файл блокнотом, скопируйте текст и вставьте в окно запроса через Ctrl+V — результат тот же.
Загрузка запроса из файла выручает в типовых ситуациях: разработчик прислал готовый запрос для диагностики остатков, нужно повторить чужой разбор ошибки в учёте или перенести отлаженный запрос с тестовой базы на рабочую. Во всех случаях схема одна — открыли консоль, прочитали файл, подставили свои параметры под свою базу. Запрос только читает данные, поэтому выполнять его в рабочей базе безопасно: записей он не меняет.
Собрать или поправить текст запроса помогает конструктор запроса. В консоли его вызывают кнопкой «Конструктор запроса» над полем текста; в Конфигураторе при написании кода — правой кнопкой мыши по строке с текстом запроса → Конструктор запроса. Конструктор удобен, когда запрос нужно не загрузить готовым, а собрать с нуля по таблицам метаданных.
Конструктор пригодится и при загрузке чужого запроса: открыли в нём загруженный текст — и сразу видно, из каких таблиц читаются данные, какие поля выбраны и как связаны источники. Если имя таблицы или реквизита в файле не совпадает с текущей базой, конструктор это подсветит ещё до запуска. Это быстрый способ понять, подойдёт ли присланный запрос к вашей конфигурации вообще.
Параметры и временные таблицы перед запуском
Большинство запросов используют параметры — значения после знака &, например &Период или &Склад. Пока параметры не заданы, запрос либо не выполнится, либо вернёт пустой результат.
В консоли за это отвечает отдельная вкладка (обычно «Параметры»). После загрузки текста консоль сама находит в нём все &Имя и выводит их списком. Для каждого параметра укажите:
- тип — дата, число, строка, ссылка на справочник или документ;
- значение — конкретную дату, число или выбранный из базы элемент.
Пример: для запроса с условием ГДЕ Остатки.Период <= &ДатаОстатков в параметре ДатаОстатков выбираете тип «Дата» и ставите нужную дату.
Пара тонкостей по типам параметров:
- для даты важно учитывать время. Если нужен конец дня, задавайте не
01.10в 00:00, а конец суток — иначе документы за последний день не попадут в выборку; - список значений задают, когда в запросе есть условие
В (&Список)— тип параметра выбирают «Список значений» и наполняют его нужными элементами; - ссылку (на номенклатуру, контрагента, склад) выбирают прямо из базы, как в обычной форме, — консоль откроет справочник для выбора.
Временные таблицы. Если в запросе есть оператор ПОМЕСТИТЬ, это пакет из нескольких запросов: первый кладёт данные во временную таблицу, следующий из неё читает. Консоль выполняет такой пакет целиком — ничего дополнительно грузить не нужно. А вот если временная таблица заполняется извне (передаётся как параметр-таблица), заранее данные готовит тот код, который запрос вызывает; в чистой консоли такой запрос нужно упростить или подать таблицу через параметр, если консоль это поддерживает.
Запуск, проверка результата и отладка запроса
Запускают запрос кнопкой «Выполнить» (часто это красный восклицательный знак или F5/F8 — зависит от сборки консоли). Результат появляется в нижней таблице.
Что проверять в результате:
- число строк — пусто при явно существующих данных почти всегда означает лишнее условие в
ГДЕили не заданный параметр; - значения колонок — совпадают ли с ожидаемыми по паре контрольных записей;
- дубли строк — если каждая запись повторяется, скорее всего соединение (
СОЕДИНЕНИЕ) задано без нужного условия связи.
Для отладки больших запросов удобно выполнять пакет по частям. Временно уберите хвост после первого ПОМЕСТИТЬ и посмотрите, что попало во временную таблицу. Так находят, на каком шаге данные «теряются».
Готовый результат обычно не остаётся в консоли насовсем. Его выгружают дальше одним из способов:
- скопировать строки таблицы результата через буфер обмена и вставить в Excel;
- сохранить результат в файл табличного документа (
.mxl) командой сохранения из таблицы результата; - в коде — методом
Выгрузить()получить таблицу значений и обработать её программно.
Именно на этом шаге и появляется формат .mxl: в него уходит результат запроса, а не сам текст запроса. Путать эти два файла — распространённая причина, по которой «запрос не загружается»: вместо текста пытаются открыть выгруженную таблицу.
Многие консоли показывают план запроса и замер времени. Если запрос работает медленно, смотрите, по каким полям идёт отбор, и есть ли по ним индексы. Соединение с подзапросом без условия — частая причина тормозов.
Если нужно сохранить рабочий вариант для коллеги или на будущее — используйте команду сохранения в файл. Сохраняйте в XML консоли: так вместе с текстом уедут и параметры, и напарнику не придётся задавать их заново.
Частые ошибки при загрузке и выполнении запроса
&.ПОМЕСТИТЬ. Выполняйте весь пакет целиком..txt без текста или файл в неожиданной кодировке. Откройте файл блокнотом и проверьте, что текст на месте.Отдельно про кодировку: текстовые файлы с запросами лучше хранить в UTF-8. Если при загрузке русские слова превратились в «кракозябры», дело в кодировке — пересохраните файл в UTF-8 и загрузите заново.
Автоматизация: загрузка и выполнение запроса из кода
Когда запрос нужно выполнять не руками, а по расписанию или внутри обработки, его переносят во встроенный язык. Самый прямой способ — задать текст прямо в коде:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.Наименование КАК Наименование
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Наименование ПОДОБНО &Шаблон";
Запрос.УстановитьПараметр("Шаблон", "%стол%");
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(Выборка.Наименование);
КонецЦикла;
Если текст запроса лежит в отдельном файле и его нужно именно «загрузить», прочитайте файл текстовым документом и передайте строку в запрос:
ТекстЗапроса = Новый ТекстовыйДокумент;
ТекстЗапроса.Прочитать("C:\Запросы\ОстаткиТоваров.txt");
Запрос = Новый Запрос(ТекстЗапроса.ПолучитьТекст());
Запрос.УстановитьПараметр("ДатаОстатков", ТекущаяДата());
Результат = Запрос.Выполнить();
Метод Прочитать берёт текст из файла, ПолучитьТекст() возвращает его строкой, а конструктор Новый Запрос(<текст>) сразу принимает этот текст. Дальше — привычные УстановитьПараметр и Выполнить.
Запись пути к файлу через C:\... работает только на той машине, где файл физически лежит. В клиент-серверной базе код выполняется на сервере, и путь должен быть доступен именно серверу 1С, а не вашему компьютеру. Для переноса запросов между базами надёжнее хранить текст в макете обработки, а не во внешнем файле.
Временные таблицы в коде наполняют через МенеджерВременныхТаблиц: создаёте менеджер, присваиваете его свойству Запрос.МенеджерВременныхТаблиц, выполняете запрос с ПОМЕСТИТЬ — и следующий запрос того же менеджера читает готовую временную таблицу:
МенеджерВТ = Новый МенеджерВременныхТаблиц;
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
Запрос.Текст =
"ВЫБРАТЬ
| Товары.Номенклатура КАК Номенклатура
|ПОМЕСТИТЬ ВыбранныеТовары
|ИЗ
| &ТаблицаТоваров КАК Товары";
Запрос.УстановитьПараметр("ТаблицаТоваров", ТаблицаТоваров);
Запрос.Выполнить();
После этого второй запрос с тем же МенеджерВТ обращается к таблице ВыбранныеТовары как к обычному источнику. Такой приём заменяет тяжёлые подзапросы и часто ускоряет выборку. Главное — не забыть присвоить менеджер каждому запросу пакета, иначе второй запрос временную таблицу не увидит.
Частые вопросы
Можно ли загрузить запрос прямо в Конфигураторе?
Чем отличается файл `.txt` от XML консоли?
.txt лежит только текст запроса. XML, сохранённый консолью, хранит ещё и параметры с их значениями — после загрузки такого файла задавать параметры заново не нужно.Запрос загрузился, но результат пустой. Почему?
ГДЕ отсекает все строки. Проверьте вкладку параметров и временно уберите условия, чтобы убедиться, что данные в таблице вообще есть.Как передать в запрос список значений или таблицу?
В (&Список). Таблицу в коде передают через параметр-таблицу или временную таблицу с МенеджерВременныхТаблиц.