Работа с консолью запросов в 1С 8.3: от запуска обработки до быстрых выборок по большой базе
Содержание
Консоль запросов — это внешняя обработка (обычно файл КонсольЗапросов.epf), которую открывают в режиме 1С:Предприятие через Главное меню → Файл → Открыть. В верхнее поле пишут текст запроса, задают параметры, нажимают «Выполнить» и получают таблицу с данными прямо из базы, без программирования отчёта.
Пишут в ней не на SQL, а на языке запросов 1С. Он похож на SQL по ключевым словам (ВЫБРАТЬ, ИЗ, ГДЕ, СГРУППИРОВАТЬ ПО), но обращается к объектам конфигурации: справочникам, документам, регистрам. Изменять данные запросом нельзя: язык запросов 1С умеет только читать.
Что умеет консоль запросов и кому она пригодится
Консоль нужна, когда типового отчёта не хватает, а ждать доработки долго. Типичные задачи:
- 🔍 найти дубли контрагентов или номенклатуры по ИНН, артикулу, наименованию;
- 📊 получить остатки или обороты по регистру в нужном разрезе, которого нет в отчётах;
- 🧾 выбрать документы за период по сложному условию: контрагент, сумма, признак проведения;
- 🛠 проверить, какие движения на самом деле записал документ;
- 🧪 отладить текст запроса перед тем, как вставить его в отчёт или обработку.
Бухгалтеру консоль даёт ответ на вопрос «что лежит в базе» за пару минут. Разработчику — полигон, где запрос проверяют на реальных данных до переноса в код.
У консоли нет собственных данных и настроек учёта. Она только передаёт текст запроса платформе и показывает результат. Поэтому одна и та же обработка работает в БП 3.0, ЗУП 3.1, УТ 11 и любой другой конфигурации на платформе 8.3 — меняются только имена объектов в запросе.
Где взять консоль запросов и как открыть её в разных режимах
В типовые конфигурации консоль не встроена отдельным пунктом меню. Её берут в виде внешней обработки:
- 📦 версия для управляемых форм от фирмы 1С — распространяется в составе материалов для разработчиков на портале ИТС (нужна подписка);
- 🌐 бесплатные консоли от сообщества разработчиков — их много, они различаются интерфейсом и набором функций;
- 💼 старая консоль на обычных формах — работает только в толстом клиенте.
Тонкий клиент, интерфейс «Такси»
- Скопируйте файл
.epfна свой компьютер. - Нажмите кнопку главного меню (три полоски в левом верхнем углу окна).
- Выберите
Файл → Открытьи укажите файл обработки. - Если платформа покажет предупреждение о безопасности, подтвердите открытие — при условии, что вы доверяете источнику файла.
Предупреждение выводит механизм «Защита от опасных действий», который появился в платформе 8.3.9. Отключить его можно в свойствах пользователя в Конфигураторе. Делайте это только для разработчиков, а не для всех сотрудников.
Толстый клиент
Здесь работают обе версии: на обычных и на управляемых формах. Путь тот же: Файл → Открыть. Консоль на обычных формах в тонком клиенте не откроется — платформа их там не отображает.
Конфигуратор
В Конфигураторе консоли нет, но есть конструктор запроса. Откройте любой модуль, щёлкните правой кнопкой по тексту и выберите «Конструктор запроса». Соберите запрос мышкой, нажмите «ОК» — готовый текст окажется в модуле. Его удобно скопировать и вставить в консоль.
Подключение через «Дополнительные отчёты и обработки»
В БП 3.0 и других конфигурациях на БСП есть Администрирование → Печатные формы, отчёты и обработки → Дополнительные отчёты и обработки. Добавить туда можно только обработку, у которой есть функция регистрации СведенияОВнешнейОбработке(). Обычная консоль без неё не зарегистрируется — открывайте её через Файл → Открыть.
| Режим | Что открыть | Как |
|---|---|---|
| Тонкий клиент | Консоль на управляемых формах | Файл → Открыть |
| Толстый клиент | Любая версия | Файл → Открыть |
| Конфигуратор | Конструктор запроса | Контекстное меню модуля |
| БСП-конфигурация | Версия с функцией регистрации | Дополнительные обработки |
Язык запросов 1С: синтаксис, без которого не обойтись
Минимальный запрос состоит из двух частей: что выбрать и откуда.
ВЫБРАТЬ
Контрагенты.Наименование,
Контрагенты.ИНН
ИЗ
Справочник.Контрагенты КАК Контрагенты
ГДЕ
НЕ Контрагенты.ПометкаУдаления
УПОРЯДОЧИТЬ ПО
Контрагенты.Наименование
Чем язык запросов 1С отличается от SQL
| SQL | Язык запросов 1С | Комментарий |
|---|---|---|
SELECT ... FROM | ВЫБРАТЬ ... ИЗ | Английские слова тоже работают: SELECT, FROM, WHERE |
Таблица dbo._Reference32 | Справочник.Контрагенты | Имена объектов из конфигурации, а не таблицы СУБД |
JOIN по ключу | Обращение через точку | Документ.Контрагент.ИНН — платформа сама сделает соединение |
UPDATE, DELETE, INSERT | Нет | Запрос только читает данные |
Временные таблицы #tmp | ПОМЕСТИТЬ ВТ_Имя | Живут в пределах пакета запросов |
| — | Виртуальные таблицы | Остатки, Обороты, ОстаткиИОбороты, СрезПоследних |
Прямой SQL к базе через консоль не выполнить. Платформа переводит запрос 1С в запрос к конкретной СУБД сама. Читать таблицы базы напрямую, в обход 1С, не стоит: их имена служебные, а структура меняется при обновлении конфигурации.
Ключевые конструкции
ГДЕ— условие отбора;И,ИЛИ,НЕ,В (...),МЕЖДУ ... И ...,ПОДОБНО "%текст%".СГРУППИРОВАТЬ ПО+ агрегатыСУММА,КОЛИЧЕСТВО,МАКСИМУМ,МИНИМУМ,СРЕДНЕЕ.ИМЕЮЩИЕ— условие на результат группировки.ЛЕВОЕ СОЕДИНЕНИЕ ... ПО— соединение двух таблиц.ОБЪЕДИНИТЬ ВСЕ— склеить результаты двух выборок с одинаковыми полями.ЕСТЬNULL(Поле, 0)— подставить ноль, если соединение ничего не нашло.ВЫРАЗИТЬ(Поле КАК Справочник.Номенклатура)— привести поле составного типа к одному типу.&Параметр— значение, которое задаётся в консоли отдельно.
Параметры консоль находит сама: после ввода текста нажмите кнопку заполнения параметров, и в таблице справа или снизу появятся строки &НачалоПериода, &Контрагент и другие. Значения выбирают из списков, как в обычной форме.
Готовые запросы для повседневных задач
Примеры написаны для БП 3.0. В других конфигурациях замените имена объектов — их видно в Конфигураторе в дереве метаданных.
Дубли контрагентов по ИНН
ВЫБРАТЬ
Контрагенты.ИНН КАК ИНН,
КОЛИЧЕСТВО(Контрагенты.Ссылка) КАК Карточек
ИЗ
Справочник.Контрагенты КАК Контрагенты
ГДЕ
Контрагенты.ИНН <> ""
И НЕ Контрагенты.ПометкаУдаления
СГРУППИРОВАТЬ ПО
Контрагенты.ИНН
ИМЕЮЩИЕ
КОЛИЧЕСТВО(Контрагенты.Ссылка) > 1
Результат — список ИНН, по которым заведено две карточки и больше. Обособленные подразделения имеют общий ИНН с головной организацией, так что не каждая строка — ошибка.
Реализации за период по контрагенту
ВЫБРАТЬ
Реализация.Дата,
Реализация.Номер,
Реализация.Контрагент,
Реализация.СуммаДокумента
ИЗ
Документ.РеализацияТоваровУслуг КАК Реализация
ГДЕ
Реализация.Проведен
И Реализация.Дата МЕЖДУ &НачалоПериода И КОНЕЦПЕРИОДА(&КонецПериода, ДЕНЬ)
И Реализация.Контрагент = &Контрагент
УПОРЯДОЧИТЬ ПО
Реализация.Дата
КОНЕЦПЕРИОДА нужен потому, что дата в параметре выбирается с временем 00:00:00. Без него документы последнего дня в выборку не попадут.
Остатки по счёту из регистра бухгалтерии
ВЫБРАТЬ
Остатки.Субконто1 КАК Номенклатура,
Остатки.КоличествоОстатокДт КАК Количество,
Остатки.СуммаОстатокДт КАК Сумма
ИЗ
РегистрБухгалтерии.Хозрасчетный.Остатки(&НаДату, Счет = &Счет, , ) КАК Остатки
УПОРЯДОЧИТЬ ПО
Сумма УБЫВ
В параметре &Счет выберите нужный счёт, например 41.01. &НаДату — граница остатков: для остатков на конец дня передайте начало следующего дня.
Пакет с временной таблицей
ВЫБРАТЬ
Реализация.Контрагент КАК Контрагент,
СУММА(Реализация.СуммаДокумента) КАК Выручка
ПОМЕСТИТЬ ВТ_Продажи
ИЗ
Документ.РеализацияТоваровУслуг КАК Реализация
ГДЕ
Реализация.Проведен
И Реализация.Дата МЕЖДУ &НачалоПериода И &КонецПериода
СГРУППИРОВАТЬ ПО
Реализация.Контрагент
ИНДЕКСИРОВАТЬ ПО
Контрагент
;
ВЫБРАТЬ ПЕРВЫЕ 10
ВТ_Продажи.Контрагент,
ВТ_Продажи.Выручка,
ВТ_Продажи.Контрагент.ИНН КАК ИНН
ИЗ
ВТ_Продажи КАК ВТ_Продажи
УПОРЯДОЧИТЬ ПО
ВТ_Продажи.Выручка УБЫВ
Запросы пакета разделяют точкой с запятой. Консоль покажет результат последнего запроса, а большинство версий позволяет посмотреть и содержимое временных таблиц.
Как ускорить запрос на большой базе
Запрос, который на демо-базе отрабатывает за секунду, на базе в 100 ГБ может идти десять минут и нагружать сервер для всех пользователей. Приёмы, которые дают основной эффект:
- Условия — в параметры виртуальной таблицы. Пишите
Остатки(&Дата, Счет = &Счет), а не отбор вГДЕпосле получения всех остатков. Во втором случае платформа сначала посчитает остатки по всем счетам. ПЕРВЫЕ 100на время отладки. Пока проверяете логику, ограничьте выборку, а потом уберите ограничение.- Осторожно с точкой у составных полей.
Регистратор.Номеру поля, которое может ссылаться на десятки видов документов, превращается в десятки соединений. Сузьте тип черезВЫРАЗИТЬ. - Временные таблицы вместо подзапросов в соединениях. Подзапрос в
ЛЕВОЕ СОЕДИНЕНИЕСУБД часто планирует плохо. Положите его вПОМЕСТИТЬ ... ИНДЕКСИРОВАТЬ ПО. - Без
ИЛИпо разным полям вГДЕ. Такое условие мешает использовать индексы; два запроса черезОБЪЕДИНИТЬ ВСЕобычно быстрее. - Без функций над полем в условии.
НАЧАЛОПЕРИОДА(Дата, ДЕНЬ) = &Деньмедленнее, чемДата МЕЖДУ &Начало И &Конец.
Тяжёлый запрос сначала гоняйте на копии базы. Если копии нет — запускайте его вне рабочего времени и с ПЕРВЫЕ N, чтобы не тормозить коллег.
Сравнивайте время выполнения до и после правки. Многие консоли показывают его рядом с результатом; если нет — засеките вручную. Для глубокого разбора клиент-серверной базы смотрят план запроса СУБД через технологический журнал, но это уже задача администратора.
Ошибки при выполнении запроса и что с ними делать
Ещё одна частая ловушка — NULL после левого соединения. Если у товара нет остатка, поле суммы будет не нулём, а NULL, и Сумма + 100 тоже даст NULL. Оборачивайте такие поля в ЕСТЬNULL(Сумма, 0).
Возможности консоли, которыми пользуются не все
Базовый сценарий «написал — выполнил» закрывает не всё. В консоли на управляемых формах и в популярных бесплатных версиях есть ещё:
- 🧩 Конструктор запроса — кнопка вызова конструктора прямо из консоли, если версия консоли и режим клиента это поддерживают. Иначе собирайте запрос в Конфигураторе и копируйте текст.
- 📁 Сохранение запросов в файл — набор проверенных запросов можно хранить и открывать повторно, а не набирать заново.
- 🌳 Вывод итогов деревом — конструкция
ИТОГИ ... ПОдаёт иерархию с подытогами, консоль показывает её деревом. - 🗂 Просмотр временных таблиц пакета — видно, на каком шаге «потерялись» строки.
- 📤 Выгрузка результата — вывод в табличный документ, который сохраняют в Excel через стандартное сохранение файла.
- 🧮 Тип значения в ячейке — помогает понять, почему поле составного типа ведёт себя странно.
Разработчикам пригодится и отладчик. Остановитесь на строке после Запрос.Выполнить() и вычислите выражение (Shift+F9) — так видно, что вернул запрос в момент работы кода. Для отладки запросов, собранных программно, это быстрее, чем копировать текст в консоль.
Права доступа и безопасность при работе с консолью
Консоль — инструмент с широким доступом к данным, поэтому её выдают не всем.
- 🔐 Право на открытие. Чтобы открыть внешнюю обработку через
Файл → Открыть, нужно право «Интерактивное открытие внешних отчётов и обработок». В БСП-конфигурациях оно есть у профиля администратора; рядовым пользователям его обычно не дают. - 👁 Запрос видит то же, что и пользователь. Ограничения доступа на уровне записей применяются и к запросам из консоли. Если базу настроили так, что менеджер видит только свои документы, консоль под ним покажет только их.
- 🛡 Данные запросом не изменить. Сам запрос безопасен для базы. Но многие консоли умеют выполнять произвольный код на встроенном языке — а он уже может удалить и перезаписать что угодно.
- 📄 Персональные данные. Выборка по физлицам, паспортам, зарплате — это обработка персональных данных. Выгрузки в Excel храните и передавайте по правилам, принятым в организации.
- ⚡ Нагрузка на сервер. Запрос без отборов по регистру за пять лет способен затормозить работу всех пользователей базы.
Берите консоль только из проверенного источника. Внешняя обработка — это исполняемый код, и файл неизвестного происхождения работает с правами того, кто его открыл. Не открывайте присланные по почте .epf под администратором рабочей базы.
Можно ли в консоли запросов 1С написать обычный SQL?
Работает ли консоль запросов в 1С:Фреш и других облачных сервисах?
Почему у коллеги запрос возвращает больше строк, чем у меня?
Можно ли удалить или исправить данные через консоль?
Как узнать точное имя реквизита для запроса?
Источники
- Федеральный закон от 27.07.2006 № 152-ФЗ «О персональных данных»