Консоль запросов в 1С 8.3: запуск, параметры, временные таблицы и скорость

· 10 мин

Содержание

Консоль запросов 1С — это внешняя обработка (файл .epf), которая выполняет текст на языке запросов прямо в рабочей или тестовой базе и показывает результат таблицей. Открывают её в режиме «1С:Предприятие» через главное меню: Файл → Открыть, затем выбирают файл консоли. Вставили запрос, заполнили параметры, нажали «Выполнить» — и видите данные, не трогая конфигурацию.

Консоль нужна программисту для отладки, а бухгалтеру и аналитику — чтобы быстро найти документы с ошибками, проверить остатки или выгрузить выборку, которой нет в типовых отчётах. Запрос в 1С только читает данные: изменить или удалить через него ничего нельзя. Инструмент общий для платформы 8.3 и одинаково работает в БП 3.0, ЗУП 3.1, УТ 11 и других конфигурациях — различаются только имена объектов метаданных.

Зачем нужна консоль запросов и что она умеет

В конфигураторе есть конструктор запроса, но выполнить запрос там нельзя. Консоль закрывает этот разрыв: пишете текст, сразу получаете ответ базы.

Что умеют распространённые консоли:

  • 🔍 выполнять одиночные запросы и пакеты из нескольких запросов;
  • 🧩 открывать текст в конструкторе запроса — таблицы и поля выбираются мышью;
  • 🔢 автоматически находить параметры &Имя в тексте и давать их заполнить;
  • 📊 показывать результат плоской таблицей или деревом, если в запросе есть ИТОГИ;
  • 💾 сохранять набор запросов в файл, чтобы вернуться к нему завтра;
  • ⏱ показывать время выполнения (зависит от конкретной консоли).

Типичные задачи на практике:

ЗадачаЧто делают в консоли
Найти «битые» ссылкиВыбирают документы, у которых поле ссылается на удалённый объект
Проверить проведениеСравнивают документы и движения по регистру
Разовая выгрузкаСобирают нужные поля и копируют результат в Excel
Отладка кодаБерут текст запроса из модуля и смотрят, что он реально возвращает
Оценка скоростиЗамеряют время запроса до и после правки условий

Нашли удобную выборку — сохраните её в файл запросов консоли. Через месяц не придётся собирать её заново.

Где взять консоль запросов 1С и как её открыть

Встроенной консоли в типовых конфигурациях на БСП нет — её открывают как внешнюю обработку . Варианты:

  • 📦 консоль от фирмы 1С для управляемых форм — входит в набор универсальных обработок, который доступен подписчикам ИТС;
  • 🛠 сторонние консоли, например в составе «Инструментов разработчика» — у них больше функций (просмотр временных таблиц, подсветка синтаксиса);
  • 🧪 собственная обработка — часто программисты держат в расширении упрощённую консоль для конкретной базы.

Берите консоль, рассчитанную на управляемые формы и платформу 8.3. Старые консоли на обычных формах запускаются только в толстом клиенте и в «Такси» неудобны.

Порядок запуска

  1. Запустите базу в режиме «1С:Предприятие» пользователем с полными правами.
  2. Откройте главное меню (кнопка с тремя полосками в заголовке окна) и выберите Файл → Открыть.
  3. Укажите файл консоли, например КонсольЗапросов.epf.
  4. Если появилось предупреждение безопасности о возможно опасном коде — подтвердите открытие, если доверяете источнику файла.
  5. В окне консоли создайте новый запрос и вставьте текст или откройте конструктор.

Права и настройки, без которых консоль не откроется

Открывать внешние обработки интерактивно может только пользователь с правом «Интерактивное открытие внешних обработок». В типовых конфигурациях оно есть у роли полных прав. Обычному бухгалтеру его дают через профиль группы доступа, если это разрешает регламент.

Предупреждение при открытии связано с защитой от опасных действий (платформа 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

Как посмотреть содержимое временной таблицы

Это главный вопрос при отладке пакетов: результат показывает только последний запрос, а что лежит в ВТ_Продажи — не видно. Рабочие приёмы:

  1. Временный запрос в конце пакета. Добавьте ВЫБРАТЬ * ИЗ ВТ_Продажи КАК Т последним запросом, выполните, посмотрите и удалите.
  2. Просмотр результата каждого запроса пакета. Многие консоли показывают результаты всех запросов пакета отдельными вкладками или списком — выберите нужный.
  3. Метод ВыполнитьПакетСПромежуточнымиДанными(). В коде он возвращает массив результатов, включая данные запросов с ПОМЕСТИТЬ. На нём построен просмотр временных таблиц в продвинутых консолях.
Запрос = Новый Запрос;
Запрос.Текст = ТекстЗапроса;
Запрос.УстановитьПараметр("НачалоПериода", НачалоМесяца(ТекущаяДатаСеанса()));
Запрос.УстановитьПараметр("КонецПериода", КонецДня(ТекущаяДатаСеанса()));
Результаты = Запрос.ВыполнитьПакетСПромежуточнымиДанными();
Выборка = Результаты[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).

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

Ошибки в консоли запросов и как их читать

Платформа указывает место ошибки в формате {(строка, колонка)} — это координаты в тексте запроса. С них и начинайте поиск.

Диагностика: выберите симптом

Отдельная ловушка — ОБЪЕДИНИТЬ ВСЕ с разным числом полей. Количество и порядок полей во всех частях должны совпадать, а имена берутся из первой части. Если в одной части поля нет, подставьте NULL или 0 с нужным псевдонимом.

Частые вопросы о консоли запросов

Можно ли через консоль запросов изменить данные в базе?
Нет. Язык запросов 1С только читает данные: в нём нет аналогов UPDATE и DELETE. Менять данные умеют только обработки с кодом, а не сам запрос.
Нужен ли монопольный режим для работы консоли?
Нет. Консоль работает в обычном сеансе параллельно с пользователями. Ограничение одно — нагрузка от тяжёлых запросов на общий сервер.
Как перенести результат в Excel?
Выделите таблицу результата и скопируйте её, либо сохраните через меню табличного документа, если консоль выводит результат в него. Для удобного чтения выбирайте ПРЕДСТАВЛЕНИЕ() вместо ссылок.
Как взять текст запроса из конфигурации, чтобы проверить его в консоли?
Скопируйте текст из модуля в конфигураторе, уберите кавычки и символы | в начале строк, затем вставьте в консоль. Значения параметров найдите в строках УстановитьПараметр рядом с запросом.
Работает ли консоль в веб-клиенте и через публикацию на веб-сервере?
Консоль на управляемых формах открывается в тонком и веб-клиенте. Нужны те же права на открытие внешних обработок, а файл загружается с компьютера пользователя.