Менеджер запросов 1С Предприятие: где он, как работает, чем заменить
Содержание
Отдельной кнопки «Менеджер запросов» в 1С Предприятие 8.3 нет. Так называют три разных инструмента: консоль запросов (внешняя обработка), конструктор запроса в Конфигураторе и менеджер временных таблиц в коде. Что именно вам нужно, зависит от задачи: посмотреть данные, написать запрос или передать промежуточный результат между запросами.
Типичная ситуация. Бухгалтер просит выгрузить контрагентов с оборотами выше 500 тысяч за квартал, а в типовых отчётах такой отбор не собрать. 1С-ник открывает консоль запросов, за десять минут пишет запрос и сразу видит результат. Без консоли пришлось бы менять конфигурацию, ждать сборки и перезапускать базу.
Что называют менеджером запросов в 1С
Язык запросов 1С похож на SQL, но работает не с таблицами СУБД, а с объектами метаданных: справочниками, документами, регистрами. Платформа сама переводит запрос в SQL для вашей базы (файловой или клиент-серверной).
Под «менеджером запросов» обычно имеют в виду один из трёх инструментов:
- 🧪 Консоль запросов. Внешняя обработка, где вы пишете текст запроса, задаёте параметры и сразу смотрите результат в таблице.
- 🧩 Конструктор запроса. Окно Конфигуратора, в котором запрос собирается мышью: таблицы, поля, условия, группировки. Текст получается автоматически.
- 🗂 Менеджер временных таблиц. Объект
МенеджерВременныхТаблицв коде. Он хранит временные таблицы между несколькими запросами одной транзакции или процедуры.
Если вы пользователь, а не программист, вам нужна консоль: она позволяет проверить данные без правок конфигурации. Программисту нужны все три.
В официальной документации платформы термина «менеджер запросов» нет. Поэтому в поиске по форумам и ИТС лучше писать «консоль запросов», «конструктор запроса» или «временные таблицы».
Таблица: какой инструмент выбрать
| Инструмент | Для чего | Где работает | Риски |
|---|---|---|---|
| Консоль запросов | Проверить данные, отладить текст запроса, разовая выгрузка | Режим 1С:Предприятие, внешняя обработка | Права на чтение всех данных, нагрузка на базу от тяжёлых запросов |
| Конструктор запроса | Собрать запрос для отчёта или обработки | Конфигуратор, модуль, где есть объект Запрос | Автотекст требует правки руками, если запрос сложный |
| Менеджер временных таблиц | Передать результат одного запроса в другой | Код конфигурации | Таблица живёт только пока жив объект менеджера |
Где найти консоль запросов и конструктор
Консоль запросов не входит в состав типовых конфигураций. Это отдельный файл с расширением .epf, его распространяют на диске ИТС и в профильных сообществах. Версий несколько, интерфейс у них различается, но принцип одинаков.
Как подключить:
- Скачайте обработку и проверьте её антивирусом: внешняя обработка может выполнять произвольный код.
- В 1С откройте меню «Файл» → «Открыть» (или сочетание
Ctrl+O) и выберите файл.epf. - Если пункта нет, включите в настройках пользователя право на открытие внешних обработок или попросите администратора добавить обработку в справочник внешних обработок.
Консоль работает с данными напрямую, в обход ограничений прав доступа к записям (RLS) только если запустить её в привилегированном режиме. Обычный пользователь увидит ровно то, что ему доступно. Не давайте консоль людям, которым нельзя видеть всю базу.
Конструктор запроса вызывают в Конфигураторе:
- Откройте модуль, где пишется запрос (модуль формы, отчёта, обработки).
- Поставьте курсор в место, где должен быть текст запроса.
- Нажмите правую кнопку мыши и выберите «Конструктор запроса». Если текст запроса уже есть в кавычках, выбирайте вариант «Конструктор запроса с обработкой результата», когда он доступен: он дополнительно сформирует цикл обхода.
Пункт появляется только внутри модуля. В пустой области Конфигуратора вызвать конструктор нельзя.
Как устроено окно консоли запросов
Интерфейс зависит от версии обработки, но основные элементы везде похожи.
- 📝 Поле текста запроса. Сюда вставляется
ВЫБРАТЬ ... ИЗ .... Хорошие версии подсвечивают ключевые слова. - ⚙️ Таблица параметров. Каждому
&Параметриз запроса задаётся значение: дата, число, строка, ссылка на элемент справочника, массив. - 📊 Результат. Таблица с колонками из секции
ВЫБРАТЬ. Строки можно скопировать в буфер или выгрузить в табличный документ. - ⏱ Время выполнения. В большинстве консолей показывается длительность, это первая подсказка при оптимизации.
- 💾 Сохранение запросов. Удобно держать набор готовых запросов под типовые задачи: проверка остатков, поиск дублей, анализ движений.
Перед запуском проверьте, что параметры заданы. Пустой параметр даты превращается в 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 к базе. Для клиент-серверного варианта можно читать таблицы СУБД, но так вы обходите права, и структура таблиц непрозрачна. Для рабочей базы это крайняя мера, ей пользуются только администраторы для диагностики.
Практический ориентир: разовая задача на проверку данных — консоль запросов, постоянный отчёт — СКД, массовая обработка в коде — объект Запрос с менеджером временных таблиц.
Частые вопросы
Менеджер запросов и консоль запросов — это одно и то же?
МенеджерВременныхТаблиц, он хранит временные таблицы.