Менеджер запросов 1С Предприятие: где он, как работает, чем заменить

· 9 мин

Содержание

Отдельной кнопки «Менеджер запросов» в 1С Предприятие 8.3 нет. Так называют три разных инструмента: консоль запросов (внешняя обработка), конструктор запроса в Конфигураторе и менеджер временных таблиц в коде. Что именно вам нужно, зависит от задачи: посмотреть данные, написать запрос или передать промежуточный результат между запросами.

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

Что называют менеджером запросов в 1С

Язык запросов 1С похож на SQL, но работает не с таблицами СУБД, а с объектами метаданных: справочниками, документами, регистрами. Платформа сама переводит запрос в SQL для вашей базы (файловой или клиент-серверной).

Под «менеджером запросов» обычно имеют в виду один из трёх инструментов:

  • 🧪 Консоль запросов. Внешняя обработка, где вы пишете текст запроса, задаёте параметры и сразу смотрите результат в таблице.
  • 🧩 Конструктор запроса. Окно Конфигуратора, в котором запрос собирается мышью: таблицы, поля, условия, группировки. Текст получается автоматически.
  • 🗂 Менеджер временных таблиц. Объект МенеджерВременныхТаблиц в коде. Он хранит временные таблицы между несколькими запросами одной транзакции или процедуры.

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

В официальной документации платформы термина «менеджер запросов» нет. Поэтому в поиске по форумам и ИТС лучше писать «консоль запросов», «конструктор запроса» или «временные таблицы».

Таблица: какой инструмент выбрать

ИнструментДля чегоГде работаетРиски
Консоль запросовПроверить данные, отладить текст запроса, разовая выгрузкаРежим 1С:Предприятие, внешняя обработкаПрава на чтение всех данных, нагрузка на базу от тяжёлых запросов
Конструктор запросаСобрать запрос для отчёта или обработкиКонфигуратор, модуль, где есть объект ЗапросАвтотекст требует правки руками, если запрос сложный
Менеджер временных таблицПередать результат одного запроса в другойКод конфигурацииТаблица живёт только пока жив объект менеджера

Где найти консоль запросов и конструктор

Консоль запросов не входит в состав типовых конфигураций. Это отдельный файл с расширением .epf, его распространяют на диске ИТС и в профильных сообществах. Версий несколько, интерфейс у них различается, но принцип одинаков.

Как подключить:

  1. Скачайте обработку и проверьте её антивирусом: внешняя обработка может выполнять произвольный код.
  2. В 1С откройте меню «Файл» → «Открыть» (или сочетание Ctrl+O) и выберите файл .epf.
  3. Если пункта нет, включите в настройках пользователя право на открытие внешних обработок или попросите администратора добавить обработку в справочник внешних обработок.

Консоль работает с данными напрямую, в обход ограничений прав доступа к записям (RLS) только если запустить её в привилегированном режиме. Обычный пользователь увидит ровно то, что ему доступно. Не давайте консоль людям, которым нельзя видеть всю базу.

Конструктор запроса вызывают в Конфигураторе:

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

Пункт появляется только внутри модуля. В пустой области Конфигуратора вызвать конструктор нельзя.

Как устроено окно консоли запросов

Интерфейс зависит от версии обработки, но основные элементы везде похожи.

  • 📝 Поле текста запроса. Сюда вставляется ВЫБРАТЬ ... ИЗ .... Хорошие версии подсвечивают ключевые слова.
  • ⚙️ Таблица параметров. Каждому &Параметр из запроса задаётся значение: дата, число, строка, ссылка на элемент справочника, массив.
  • 📊 Результат. Таблица с колонками из секции ВЫБРАТЬ. Строки можно скопировать в буфер или выгрузить в табличный документ.
  • ⏱ Время выполнения. В большинстве консолей показывается длительность, это первая подсказка при оптимизации.
  • 💾 Сохранение запросов. Удобно держать набор готовых запросов под типовые задачи: проверка остатков, поиск дублей, анализ движений.

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

Пошагово: как написать и выполнить запрос

Разберём простой пример. Нужно получить документы реализации за период с суммой больше заданной.

Шаг 1. Напишите текст запроса

ВЫБРАТЬ
	Реализация.Ссылка КАК Документ,
	Реализация.Дата КАК Дата,
	Реализация.Контрагент КАК Контрагент,
	Реализация.СуммаДокумента КАК Сумма
ИЗ
	Документ.РеализацияТоваровУслуг КАК Реализация
ГДЕ
	Реализация.Проведен
	И Реализация.Дата МЕЖДУ &НачалоПериода И &КонецПериода
	И Реализация.СуммаДокумента > &МинСумма
УПОРЯДОЧИТЬ ПО
	Сумма УБЫВ

Имена объектов зависят от конфигурации. В «Бухгалтерии предприятия» документ называется РеализацияТоваровУслуг, в других программах может быть иначе. Точное имя смотрите в дереве метаданных или в конструкторе.

Шаг 2. Заполните параметры

В таблице параметров укажите НачалоПериода, КонецПериода и МинСумма. Конец периода берите с временем 23:59:59, иначе документы последнего дня выпадут из выборки.

Шаг 3. Выполните и проверьте результат

Нажмите кнопку выполнения. Если строк слишком много или мало, проверьте условие Проведен, границы периода и тип параметра. Тип «Дата» и тип «Строка» с датой внутри ведут себя по-разному.

Шаг 4. Перенесите запрос в код

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

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ ...";
Запрос.УстановитьПараметр("НачалоПериода", НачалоПериода);
Запрос.УстановитьПараметр("КонецПериода", КонецДня(КонецПериода));
Запрос.УстановитьПараметр("МинСумма", 500000);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
	// обработка строки
КонецЦикла;

Функция КонецДня сама ставит время 23:59:59, поэтому параметр периода не нужно поправлять вручную.

Практические примеры: что чаще всего решают запросами

Каждый пример можно проверить в консоли и использовать как заготовку.

Поиск дублей контрагентов по ИНН

ВЫБРАТЬ
	Контрагенты.ИНН КАК ИНН,
	КОЛИЧЕСТВО(*) КАК Количество
ИЗ
	Справочник.Контрагенты КАК Контрагенты
ГДЕ
	Контрагенты.ИНН <> ""
СГРУППИРОВАТЬ ПО
	Контрагенты.ИНН
ИМЕЮЩИЕ
	КОЛИЧЕСТВО(*) > 1

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

Остатки на дату из регистра

Для регистров накопления и сведений в запросе есть виртуальные таблицы: .Остатки, .Обороты, .ОстаткиИОбороты. Они считают итоги на стороне СУБД и работают быстрее, чем самостоятельная группировка по движениям. Обязательно передавайте условия в параметры виртуальной таблицы, а не в ГДЕ, тогда платформа применит отбор до расчёта итогов.

Две таблицы вместо вложенных запросов

Если результат нужен несколько раз, положите его во временную таблицу:

ВЫБРАТЬ
	Реализация.Контрагент КАК Контрагент,
	СУММА(Реализация.СуммаДокумента) КАК Сумма
ПОМЕСТИТЬ ВТ_Обороты
ИЗ
	Документ.РеализацияТоваровУслуг КАК Реализация
ГДЕ
	Реализация.Проведен
СГРУППИРОВАТЬ ПО
	Реализация.Контрагент
;

ВЫБРАТЬ
	Т.Контрагент,
	Т.Сумма
ИЗ
	ВТ_Обороты КАК Т
ГДЕ
	Т.Сумма > 500000

Два запроса разделены точкой с запятой и выполняются одним пакетом. Временная таблица ВТ_Обороты живёт только внутри этого пакета.

Менеджер временных таблиц: когда он нужен

Если запросы выполняются в разных местах кода или в разных вызовах, временная таблица исчезает вместе с запросом. Чтобы передать её дальше, создают менеджер:

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

Запрос2 = Новый Запрос;
Запрос2.МенеджерВременныхТаблиц = МенеджерВТ;
Запрос2.Текст = "ВЫБРАТЬ ... ИЗ ВТ_Данные ...";
Результат = Запрос2.Выполнить();

Оба запроса должны ссылаться на один и тот же объект менеджера. Закрыть менеджер можно методом Закрыть(): так вы освободите память раньше, чем отработает сборщик мусора.

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

Оптимизация запросов: что даёт реальный выигрыш

Медленный запрос почти всегда медленный по одной из нескольких причин. Проверяйте их по порядку.

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

Запрос в цикле дороже всего на клиент-серверной базе: каждый вызов проходит путь «сервер 1С → СУБД → сервер 1С». Для 1000 строк это тысяча запросов вместо одного.

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

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

Типичные ошибки и как их избежать

  • ❌ «Поле не найдено». Опечатка в имени реквизита или таблицы. Проверьте по дереву метаданных: имена в запросе должны совпадать с синонимами в конфигураторе, а не с тем, что видит пользователь на форме.
  • ❌ Пустой результат при правильном запросе. Пользователь запустил консоль без нужных прав либо параметр даты пустой. Проверьте оба пункта.
  • ❌ Двойные строки. Соединение по неуникальному полю даёт дубли. Используйте РАЗЛИЧНЫЕ или группировку, но сначала найдите причину: дубли часто сигналят о проблеме в данных.
  • ❌ Временная таблица не найдена. Запрос ссылается на таблицу, которая создавалась в другом объекте Запрос без общего менеджера.
  • ❌ Неверные итоги по датам. Конец периода без времени. Всегда используйте КонецДня.
  • ❌ Запрос возвращает NULL. Левое соединение не нашло пару. Оборачивайте поле в ЕСТЬNULL(Поле, 0).

Альтернативы: когда запрос не нужен

Писать запросы не всегда оправдано. Иногда быстрее другой инструмент.

  • 📈 Универсальный отчёт или «Отчёты» → «Анализ данных». В некоторых конфигурациях есть стандартный отчёт, где поля и отборы настраиваются без кода.
  • 🧮 Система компоновки данных (СКД). Для отчётов с настройкой пользователем это основной механизм. Запрос лежит внутри схемы, а отборы и группировки пользователь меняет сам.
  • 📤 Выгрузка списка в Excel. Если нужен просто отбор по справочнику, достаточно настроить отбор в списке и выгрузить его.
  • 🔍 Динамический список. В формах списков платформа сама строит запрос по настройкам, программировать ничего не надо.
  • 🛠 Прямой SQL к базе. Для клиент-серверного варианта можно читать таблицы СУБД, но так вы обходите права, и структура таблиц непрозрачна. Для рабочей базы это крайняя мера, ей пользуются только администраторы для диагностики.

Практический ориентир: разовая задача на проверку данных — консоль запросов, постоянный отчёт — СКД, массовая обработка в коде — объект Запрос с менеджером временных таблиц.

Перед запуском запроса в рабочей базе
Выполнено: 0 / 5

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

Менеджер запросов и консоль запросов — это одно и то же?
Нет. Консоль запросов — внешняя обработка для запуска запросов вручную. «Менеджером запросов» обычно называют её же в разговоре, но формально такого объекта в платформе нет. Родственный объект — МенеджерВременныхТаблиц, он хранит временные таблицы.
Можно ли выполнять запросы без прав программиста?
Да, если у пользователя есть право открывать внешние обработки и доступ на чтение нужных данных. Консоль покажет только то, что разрешено его роли.
Консоль может изменить данные в базе?
Язык запросов только читает данные: в нём нет команд записи и удаления. Менять данные консоль может, лишь если в неё встроен режим выполнения произвольного кода. Такие версии опасны, не давайте их обычным пользователям.
Почему запрос в консоли работает, а в отчёте — нет?
Чаще всего причина в параметрах: в консоли вы задали их руками, в отчёте они приходят из настроек и могут быть пустыми. Ещё одна причина — права пользователя на конкретные таблицы.
Как посмотреть текст запроса стандартного отчёта?
В режиме Конфигуратора откройте отчёт и найдите схему компоновки данных. Там на вкладке набора данных виден текст запроса. Менять типовую конфигурацию без необходимости не нужно: она ставится на поддержку, и правки усложнят обновления.