Как отлаживать запросы 1С 8.3 в консоли без правки конфигурации

· 9 мин

Содержание

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

Нужна она программисту и опытному пользователю, чтобы проверить запрос до переноса в код, найти «потерянные» данные, сверить остатки регистра или понять, почему отчёт тормозит. Типичный сценарий: бухгалтер видит расхождение в оборотно-сальдовой ведомости, а программист за пять минут выбирает из регистра все движения по проблемному контрагенту и находит документ-виновник.

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

Консоль запросов в типовых конфигурациях не встроена. В Все функции → Стандартные вы найдёте консоль заданий, удаление помеченных объектов, управление итогами — но не консоль запросов. Её берут отдельным файлом .epf: обработку для управляемых форм распространяют вместе с материалами информационно-технологического сопровождения, есть и сторонние варианты от сообщества.

Что с её помощью делают на практике:

  • 🔍 Ищут данные. Например, все документы, где контрагент указан без договора.
  • 🧪 Отлаживают запрос. Пишут текст, смотрят результат, правят, и только потом переносят в модуль.
  • 📊 Сверяют регистры. Остатки по счёту 41 на дату по складам, обороты за период.
  • ⏱ Меряют скорость. Видно, сколько секунд выполнялся запрос и сколько строк вернул.
  • 📤 Выгружают выборку. Результат уходит в табличный документ, а оттуда — в Excel.

Чем консоль не является:

ОжиданиеКак на самом деле
Можно изменить данные запросомЯзык запросов 1С только читает. UPDATE и DELETE в нём нет
Запрос видит всёРаботает с правами текущего пользователя и ограничениями RLS
Это часть КонфигуратораЭто обработка режима 1С:Предприятие; в Конфигураторе есть только конструктор запроса

Если нужно поменять данные по результату выборки, это делают обработкой с кодом или групповым изменением реквизитов. Консоль помогает найти, что менять, но сама ничего не записывает.

Как открыть консоль запросов в базе

Порядок для интерфейса «Такси» на платформе 8.3.2x:

  1. Скачайте обработку консоли под вашу версию платформы и сохраните .epf на диск.
  2. Запустите базу в режиме 1С:Предприятие под пользователем с полными правами.
  3. Откройте ≡ (главное меню) → Файл → Открыть и выберите файл.
  4. Платформа покажет предупреждение безопасности о внешней обработке. Подтвердите открытие, если доверяете файлу.

Если пункта Файл → Открыть нет или открытие запрещено — у роли пользователя нет права на интерактивное открытие внешних обработок. Права выдаёт администратор базы. В конфигурациях на БСП при включённой защите от опасных действий программа дополнительно предупреждает о файле; это нормальное поведение.

Внешние обработки из непроверенных источников открывайте только в копии базы. Обработка исполняет произвольный код с вашими правами.

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

Рабочая область: что где находится

Конкретная раскладка зависит от варианта обработки, но набор зон у всех консолей одинаков:

  • 📝 Поле текста запроса. Сюда пишут или вставляют запрос. Поддерживается пакет — несколько запросов через ;.
  • 🧱 Конструктор запроса. Кнопка вызывает тот же визуальный конструктор, что и в Конфигураторе. Удобно собрать соединения мышкой, а потом доработать руками.
  • ⚙️ Параметры. Таблица «имя — тип — значение». Обычно есть команда, которая сама находит параметры в тексте.
  • 📋 Результат. Таблица или дерево (для запросов с ИТОГИ), число строк, время выполнения.
  • 💾 Список запросов. Несколько сохранённых запросов в одном файле, между ними можно переключаться.

Рабочий ритм простой: написали текст → заполнили параметры → выполнили → посмотрели результат и время → поправили.

Написание и отладка сложных запросов в консоли

Сложный запрос лучше собирать слоями через временные таблицы. Каждый слой можно выполнить и проверить отдельно.

Пример: остатки товаров на складах вместе с последней ценой поступления.

ВЫБРАТЬ
    Остатки.Номенклатура КАК Номенклатура,
    Остатки.Склад КАК Склад,
    Остатки.КоличествоОстаток КАК Количество
ПОМЕСТИТЬ ВТ_Остатки
ИЗ
    РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, ) КАК Остатки
ИНДЕКСИРОВАТЬ ПО
    Номенклатура
;

ВЫБРАТЬ
    ВТ_Остатки.Номенклатура,
    ВТ_Остатки.Склад,
    ВТ_Остатки.Количество
ИЗ
    ВТ_Остатки КАК ВТ_Остатки
ГДЕ
    ВТ_Остатки.Количество > 0
УПОРЯДОЧИТЬ ПО
    ВТ_Остатки.Количество УБЫВ

Имя регистра в примере условное: в вашей конфигурации оно своё. Точное имя проще всего взять в конструкторе запроса — дерево таблиц слева показывает все объекты базы.

Приёмы отладки, которые экономят время

  1. Смотрите промежуточные таблицы. В пакете консоль обычно показывает результат каждого запроса или позволяет выбрать, какой выводить. Не видно в вашей версии — временно замените ПОМЕСТИТЬ ВТ_Остатки на обычную выборку и выполните первый запрос отдельно.
  2. Ограничивайте выборку. На этапе отладки пишите ВЫБРАТЬ ПЕРВЫЕ 100. Запрос по регистру с миллионами строк без условий легко занимает минуты.
  3. Проверяйте типы полей. Составной тип (Регистратор, Субконто1) при обращении через точку разворачивается в соединение со всеми возможными таблицами. Уточняйте тип: ВЫРАЗИТЬ(Проводки.Субконто1 КАК Справочник.Контрагенты).ИНН.
  4. Используйте предопределённые значения прямо в тексте. ЗНАЧЕНИЕ(Перечисление.ВидыДвиженияНакопления.Приход) или ЗНАЧЕНИЕ(Справочник.Валюты.ПустаяСсылка) — вместо лишнего параметра.
  5. Ищите дубли группировкой. СГРУППИРОВАТЬ ПО ... ИМЕЮЩИЕ КОЛИЧЕСТВО(*) > 1 быстро показывает задвоенные элементы справочника.

Нужно узнать тип значения в составном поле — добавьте в выборку ТИПЗНАЧЕНИЯ(Остатки.Регистратор). В результате будет видно, какие документы реально лежат в поле.

Параметры запроса и их типы

Всё, что начинается с &, — параметр. Консоль находит их в тексте и просит заполнить. Ошибка в типе параметра — самая частая причина «пустого» результата без всякой ошибки.

Что передаётеТип в консолиТонкость
Дата остатковДатаОстатки на 31.03 без времени берутся на начало суток. Нужен конец дня — укажите 31.03 23:59:59 или граница МоментВремени
Контрагент, складСсылка на справочникЗначение выбирают из списка, а не вводят строкой
Несколько складовСписок значенийВ тексте — В (&Склады), иначе условие не сработает
Сумма-порогЧислоДробная часть через запятую
Таблица из внешнего файлаТаблица значенийЕё сначала кладут во временную таблицу: ВЫБРАТЬ ... ПОМЕСТИТЬ ВТ ИЗ &Таблица КАК Т

Пример с периодом и списком:

ВЫБРАТЬ
    Обороты.Контрагент,
    СУММА(Обороты.СуммаОборот) КАК Сумма
ИЗ
    РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, , Контрагент В (&Контрагенты)) КАК Обороты
СГРУППИРОВАТЬ ПО
    Обороты.Контрагент

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

Таблицу значений как параметр в соединение напрямую не подставить. Сначала временная таблица, потом соединение с ней. Иначе получите ошибку при выполнении.

Анализ производительности и план выполнения запроса

Первое, на что смотреть, — время выполнения и число строк в консоли. Если запрос по одному складу за месяц идёт десятки секунд, дело почти всегда в тексте.

Частые причины медленного запроса:

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

Где взять план выполнения

Язык запросов 1С транслируется в SQL, и план строит уже СУБД. Способов посмотреть его несколько:

СпособКогда подходитЧто нужно
Технологический журналКлиент-серверная база, нужен план конкретного запроса из 1СВ logcfg.xml элемент <plansql/> и сбор событий DBMSSQL или DBPOSTGRS; план попадает в свойство planSQLText
Средства СУБДЕсть доступ к серверу СУБДДля MS SQL — профилировщик или расширенные события; для PostgreSQL — EXPLAIN ANALYZE по тексту SQL из журнала
Консоль со встроенным планомСторонние консоли умеют показывать план прямо в формеКак правило, те же настройки техжурнала на сервере

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

Технологический журнал с планами быстро растёт и нагружает сервер. Включайте его на короткое время, с отбором по базе, и задайте срок хранения в logcfg.xml. Файл подхватывается без перезапуска службы, так что пользователей это не отключит.

В плане ищите полное сканирование больших таблиц (Table Scan, Clustered Index Scan в MS SQL, Seq Scan в PostgreSQL) и вложенные циклы по тысячам строк. Это места, где не хватает условия по индексу или запрос развернул составной тип.

Сохранение и выгрузка результатов

Результат и сам текст живут отдельно, и сохраняют их по-разному.

Тексты запросов. Консоль хранит набор запросов вместе с параметрами в своём файле — команда сохранения есть на форме. Держите такой файл в папке проекта: это готовая библиотека проверок («дубли ИНН», «документы без проводок », «остатки по счёту 10»).

Результат в Excel:

  1. Выполните запрос.
  2. Выведите результат в табличный документ — у консолей есть такая команда на панели результата.
  3. В открывшемся табличном документе: ≡ → Файл → Сохранить как → тип файла «Лист Excel» (.xlsx).

Быстрый путь для небольшой выборки: выделите строки в таблице результата, Ctrl+C и вставьте в Excel. Для десятков тысяч строк надёжнее сохранение файлом.

Перед выгрузкой задайте полям понятные псевдонимы через КАК: Остатки.КоличествоОстаток КАК Остаток. Они станут заголовками колонок в Excel.

Для повторяющейся задачи — например, ежемесячной выгрузки для аудитора — лучше перенести запрос в отчёт на СКД. Консоль удобна для разовых выборок; отчёт запускает пользователь без знания языка запросов.

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

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

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

Отдельная история — тайм-аут или зависание. Если запрос по рабочей базе идёт минутами, не перезапускайте сервер ради того, чтобы его прервать. Закройте консоль или завершите свой сеанс в консоли администрирования кластера — это оборвёт только ваш сеанс. Затем добавьте отбор и ВЫБРАТЬ ПЕРВЫЕ.

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

Можно ли запускать консоль запросов в рабочей базе?
Можно: запрос только читает данные и ничего не меняет. Риск в нагрузке — тяжёлый запрос без отборов замедлит работу остальных пользователей. Большие выборки делайте вне рабочего времени.
Видит ли консоль данные, закрытые ограничениями доступа?
Нет. Запрос выполняется с правами текущего пользователя. Если роль запрещает чтение таблицы, будет ошибка доступа; с ключевым словом РАЗРЕШЕННЫЕ недоступные записи просто не попадут в результат.
Работает ли консоль в файловой базе?
Да, запросы выполняются так же. Не получится только посмотреть план выполнения средствами СУБД: в файловом варианте её нет.
Чем консоль отличается от конструктора запроса?
Конструктор собирает текст запроса, но не выполняет его. Консоль выполняет текст и показывает результат. В консоли обычно есть кнопка вызова конструктора, так что их используют вместе.
Можно ли вызвать консоль в веб-клиенте или в облаке?
Зависит от прав: в сервисах по модели SaaS открытие внешних обработок, как правило, запрещено. В своей базе через веб-клиент обработку открыть можно, если у роли есть соответствующее право.