Консоль запросов в 1С 8.3: запуск, параметры, временные таблицы и скорость
Содержание
Консоль запросов 1С — это внешняя обработка (файл .epf), которая выполняет текст на языке запросов прямо в рабочей или тестовой базе и показывает результат таблицей. Открывают её в режиме «1С:Предприятие» через главное меню: Файл → Открыть, затем выбирают файл консоли. Вставили запрос, заполнили параметры, нажали «Выполнить» — и видите данные, не трогая конфигурацию.
Консоль нужна программисту для отладки, а бухгалтеру и аналитику — чтобы быстро найти документы с ошибками, проверить остатки или выгрузить выборку, которой нет в типовых отчётах. Запрос в 1С только читает данные: изменить или удалить через него ничего нельзя. Инструмент общий для платформы 8.3 и одинаково работает в БП 3.0, ЗУП 3.1, УТ 11 и других конфигурациях — различаются только имена объектов метаданных.
Зачем нужна консоль запросов и что она умеет
В конфигураторе есть конструктор запроса, но выполнить запрос там нельзя. Консоль закрывает этот разрыв: пишете текст, сразу получаете ответ базы.
Что умеют распространённые консоли:
- 🔍 выполнять одиночные запросы и пакеты из нескольких запросов;
- 🧩 открывать текст в конструкторе запроса — таблицы и поля выбираются мышью;
- 🔢 автоматически находить параметры
&Имяв тексте и давать их заполнить; - 📊 показывать результат плоской таблицей или деревом, если в запросе есть
ИТОГИ; - 💾 сохранять набор запросов в файл, чтобы вернуться к нему завтра;
- ⏱ показывать время выполнения (зависит от конкретной консоли).
Типичные задачи на практике:
| Задача | Что делают в консоли |
|---|---|
| Найти «битые» ссылки | Выбирают документы, у которых поле ссылается на удалённый объект |
| Проверить проведение | Сравнивают документы и движения по регистру |
| Разовая выгрузка | Собирают нужные поля и копируют результат в Excel |
| Отладка кода | Берут текст запроса из модуля и смотрят, что он реально возвращает |
| Оценка скорости | Замеряют время запроса до и после правки условий |
Нашли удобную выборку — сохраните её в файл запросов консоли. Через месяц не придётся собирать её заново.
Где взять консоль запросов 1С и как её открыть
Встроенной консоли в типовых конфигурациях на БСП нет — её открывают как внешнюю обработку . Варианты:
- 📦 консоль от фирмы 1С для управляемых форм — входит в набор универсальных обработок, который доступен подписчикам ИТС;
- 🛠 сторонние консоли, например в составе «Инструментов разработчика» — у них больше функций (просмотр временных таблиц, подсветка синтаксиса);
- 🧪 собственная обработка — часто программисты держат в расширении упрощённую консоль для конкретной базы.
Берите консоль, рассчитанную на управляемые формы и платформу 8.3. Старые консоли на обычных формах запускаются только в толстом клиенте и в «Такси» неудобны.
Порядок запуска
- Запустите базу в режиме «1С:Предприятие» пользователем с полными правами.
- Откройте главное меню (кнопка с тремя полосками в заголовке окна) и выберите
Файл → Открыть. - Укажите файл консоли, например
КонсольЗапросов.epf. - Если появилось предупреждение безопасности о возможно опасном коде — подтвердите открытие, если доверяете источнику файла.
- В окне консоли создайте новый запрос и вставьте текст или откройте конструктор.
Права и настройки, без которых консоль не откроется
Открывать внешние обработки интерактивно может только пользователь с правом «Интерактивное открытие внешних обработок». В типовых конфигурациях оно есть у роли полных прав. Обычному бухгалтеру его дают через профиль группы доступа, если это разрешает регламент.
Предупреждение при открытии связано с защитой от опасных действий (платформа 8.3.9 и новее). Флаг защиты задаётся в свойствах пользователя в конфигураторе: Администрирование → Пользователи. Снимать его ради удобства не стоит — достаточно подтверждать открытие.
Запросы учитывают права пользователя. Если в базе включено ограничение доступа на уровне записей, консоль под обычным пользователем покажет не все документы. Результат «у меня пусто, а у коллеги есть» часто объясняется именно этим.
Синтаксис языка запросов 1С в консоли
Язык запросов похож на SQL, но ключевые слова русские, а таблицы — это объекты конфигурации: Справочник.Контрагенты, Документ.РеализацияТоваровУслуг, РегистрНакопления.…, РегистрБухгалтерии.Хозрасчетный.
Скелет запроса и порядок предложений:
| Предложение | Для чего |
|---|---|
ВЫБРАТЬ [РАЗЛИЧНЫЕ] [ПЕРВЫЕ N] | Список полей результата |
ПОМЕСТИТЬ ВТ_Имя | Сохранить результат во временную таблицу |
ИЗ | Источники и соединения (ЛЕВОЕ СОЕДИНЕНИЕ … ПО) |
ГДЕ | Отбор строк |
СГРУППИРОВАТЬ ПО | Группировка с агрегатами СУММА, КОЛИЧЕСТВО, МАКСИМУМ |
ИМЕЮЩИЕ | Отбор по агрегатам |
ОБЪЕДИНИТЬ ВСЕ | Склейка двух выборок с одинаковым набором полей |
УПОРЯДОЧИТЬ ПО | Сортировка, УБЫВ — по убыванию |
ИТОГИ … ПО | Промежуточные итоги, результат — дерево |
Простой пример — продажи за период по покупателям, топ-20:
ВЫБРАТЬ ПЕРВЫЕ 20
Реализация.Контрагент КАК Контрагент,
СУММА(Реализация.СуммаДокумента) КАК Сумма
ИЗ
Документ.РеализацияТоваровУслуг КАК Реализация
ГДЕ
Реализация.Проведен
И Реализация.Дата МЕЖДУ &НачалоПериода И &КонецПериода
СГРУППИРОВАТЬ ПО
Реализация.Контрагент
УПОРЯДОЧИТЬ ПО
Сумма УБЫВ
Полезные функции, которые чаще всего нужны в консоли:
ЕСТЬNULL(Поле, 0)— подставляет ноль, если при левом соединении пары не нашлось;ПРЕДСТАВЛЕНИЕ(Ссылка)— текстовое имя вместо ссылки, удобно для выгрузки в Excel;ВЫРАЗИТЬ(Поле КАК Справочник.Контрагенты)— уточняет тип составного поля;В ИЕРАРХИИ (&Группа)— отбор по группе справочника со всеми вложенными;НАЧАЛОПЕРИОДА(Дата, МЕСЯЦ)— группировка документов по месяцам.
Через точку можно обращаться к реквизитам ссылки: Реализация.Контрагент.ИНН. Это удобно, но каждая такая точка — неявное соединение с ещё одной таблицей.
Параметры запроса: даты, ссылки, списки
Всё, что начинается с &, — параметр. Консоль находит параметры в тексте и показывает их списком: остаётся выбрать тип и значение.
Как заполнять типовые случаи:
- 📅 Дата. Тип «Дата». Для конца периода ставьте время
23:59:59, иначе последний день выпадет изМЕЖДУ. - 🔗 Ссылка. Тип — нужный справочник или документ, значение выбирается из списка.
- 📋 Несколько значений. Тип «Список значений», в тексте условие
Поле В (&Список). - ✅ Флаг. Тип «Булево» для условий вида
Реализация.Проведен = &Проведен.
Ошибка с концом периода встречается постоянно: параметр КонецПериода = 31.03 означает 31.03 00:00:00, и все документы последнего дня не попадают в выборку. В коде это решают функцией КонецДня(), в консоли — вводом времени вручную.
Параметры виртуальных таблиц регистров тоже задаются через &:
ВЫБРАТЬ
Остатки.Счет,
Остатки.Субконто1,
Остатки.СуммаОстатокДт
ИЗ
РегистрБухгалтерии.Хозрасчетный.Остатки(&Дата, Счет В ИЕРАРХИИ (&Счет), , ) КАК Остатки
Здесь &Дата — момент, на который считаются остатки. Остатки берутся на начало этой даты, поэтому для остатка на конец 31.03 указывайте 01.04 00:00:00 или 31.03 23:59:59.
Пакетные запросы и временные таблицы
Пакет — несколько запросов в одном тексте через точку с запятой. Первый кладёт данные во временную таблицу через ПОМЕСТИТЬ, следующие её используют. Так сложную выборку разбивают на понятные шаги.
ВЫБРАТЬ
Реализация.Контрагент КАК Контрагент,
СУММА(Реализация.СуммаДокумента) КАК Сумма
ПОМЕСТИТЬ ВТ_Продажи
ИЗ
Документ.РеализацияТоваровУслуг КАК Реализация
ГДЕ
Реализация.Проведен
И Реализация.Дата МЕЖДУ &НачалоПериода И &КонецПериода
СГРУППИРОВАТЬ ПО
Реализация.Контрагент
ИНДЕКСИРОВАТЬ ПО
Контрагент
;
ВЫБРАТЬ
ВТ_Продажи.Контрагент.ИНН КАК ИНН,
ВТ_Продажи.Контрагент КАК Контрагент,
ВТ_Продажи.Сумма КАК Сумма
ИЗ
ВТ_Продажи КАК ВТ_Продажи
ГДЕ
ВТ_Продажи.Сумма > 1000000
Как посмотреть содержимое временной таблицы
Это главный вопрос при отладке пакетов: результат показывает только последний запрос, а что лежит в ВТ_Продажи — не видно. Рабочие приёмы:
- Временный запрос в конце пакета. Добавьте
ВЫБРАТЬ * ИЗ ВТ_Продажи КАК Тпоследним запросом, выполните, посмотрите и удалите. - Просмотр результата каждого запроса пакета. Многие консоли показывают результаты всех запросов пакета отдельными вкладками или списком — выберите нужный.
- Метод
ВыполнитьПакетСПромежуточнымиДанными(). В коде он возвращает массив результатов, включая данные запросов сПОМЕСТИТЬ. На нём построен просмотр временных таблиц в продвинутых консолях.
Запрос = Новый Запрос;
Запрос.Текст = ТекстЗапроса;
Запрос.УстановитьПараметр("НачалоПериода", НачалоМесяца(ТекущаяДатаСеанса()));
Запрос.УстановитьПараметр("КонецПериода", КонецДня(ТекущаяДатаСеанса()));
Результаты = Запрос.ВыполнитьПакетСПромежуточнымиДанными();
Выборка = Результаты[0].Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(Строка(Выборка.Контрагент) + ": " + Формат(Выборка.Сумма, "ЧДЦ=2"));
КонецЦикла;
Индекс [0] здесь — первый запрос пакета, тот, что заполняет ВТ_Продажи.
ИНДЕКСИРОВАТЬ ПО имеет смысл, когда временная таблица большая и дальше по ней идёт соединение или отбор. Для сотни строк индекс только добавит работы.
Скорость запроса и план выполнения
Консоль — первое место, где видно, что запрос тормозит. Порядок диагностики:
1. Замерить время
Если консоль сама не показывает длительность, замерьте её кодом:
Начало = ТекущаяУниверсальнаяДатаВМиллисекундах();
Результат = Запрос.Выполнить();
Длительность = ТекущаяУниверсальнаяДатаВМиллисекундах() - Начало;
Сообщить("Запрос выполнялся " + Формат(Длительность, "ЧГ=0") + " мс");
Первый запуск обычно медленнее повторного: СУБД ещё не держит данные в памяти. Сравнивайте второй и третий замер.
2. Проверить типичные причины медленной работы
- 🐢 Отбор виртуальной таблицы в
ГДЕ. Условие наОстаткиилиОборотыпереносите в параметры таблицы:Остатки(&Дата, Склад = &Склад). Тогда платформа отберёт данные до расчёта, а не после. - 🐢 Длинные цепочки через точку по составным полям (
Регистратор.Контрагент.ИНН). Каждая точка — соединение, а для составного типа — с несколькими таблицами сразу. ПомогаетВЫРАЗИТЬ. - 🐢
ИЛИв условиях на больших таблицах мешает использовать индекс. Иногда быстрее два запроса черезОБЪЕДИНИТЬ ВСЕ. - 🐢 Соединение с подзапросом. Вынесите подзапрос во временную таблицу с индексом.
- 🐢 Нет ограничения на этапе проверки. Пока отлаживаете, ставьте
ПЕРВЫЕ 100.
3. Посмотреть план выполнения
Для файловой базы плана в привычном виде нет — оценивайте по времени. В клиент-серверном варианте на MS SQL Server план получают через технологический журнал. Файл настроек logcfg.xml кладут в каталог conf установленной платформы (например, C:\Program Files\1cv8\conf):
<config xmlns="http://v8.1c.ru/v8/tech-log">
<log location="C:\v8logs" history="2">
<event>
<eq property="name" value="DBMSSQL"/>
</event>
<property name="all"/>
</log>
<plansql/>
</config>
Затем выполните запрос в консоли — в журнале появится SQL-текст, в который платформа перевела ваш запрос, длительность и план. Ищите сканирование крупных таблиц там, где ожидали поиск по индексу.
Технологический журнал с <plansql/> растёт очень быстро и сам нагружает сервер. Включайте его на рабочем сервере на минуты, в тихое время, и сразу удаляйте logcfg.xml после замера. Для PostgreSQL событие называется иначе (DBPOSTGRS).
Тяжёлые запросы в рабочей базе не запускайте в разгар рабочего дня: выборка за несколько лет по регистру может на минуты загрузить сервер СУБД, и пользователи почувствуют это сразу.
Ошибки в консоли запросов и как их читать
Платформа указывает место ошибки в формате {(строка, колонка)} — это координаты в тексте запроса. С них и начинайте поиск.
Реализация.Контрагент.&Параметр, а значение в консоли не заполнено или имя написано по-разному. Сверьте список параметров с текстом.23:59:59, отбор Проведен при непроведённых документах или ограничение прав на уровне записей у текущего пользователя.Отдельная ловушка — ОБЪЕДИНИТЬ ВСЕ с разным числом полей. Количество и порядок полей во всех частях должны совпадать, а имена берутся из первой части. Если в одной части поля нет, подставьте NULL или 0 с нужным псевдонимом.
Частые вопросы о консоли запросов
Можно ли через консоль запросов изменить данные в базе?
UPDATE и DELETE. Менять данные умеют только обработки с кодом, а не сам запрос.Нужен ли монопольный режим для работы консоли?
Как перенести результат в Excel?
ПРЕДСТАВЛЕНИЕ() вместо ссылок.Как взять текст запроса из конфигурации, чтобы проверить его в консоли?
| в начале строк, затем вставьте в консоль. Значения параметров найдите в строках УстановитьПараметр рядом с запросом.