Как отлаживать запросы 1С 8.3 в консоли без правки конфигурации
Содержание
Консоль запросов 1С — это внешняя обработка, которая выполняет текст на языке запросов прямо в рабочей или копии базы и показывает результат таблицей. Её открывают через ≡ → Файл → Открыть в режиме 1С:Предприятие: конфигурацию менять не нужно, обновлять базу тоже.
Нужна она программисту и опытному пользователю, чтобы проверить запрос до переноса в код, найти «потерянные» данные, сверить остатки регистра или понять, почему отчёт тормозит. Типичный сценарий: бухгалтер видит расхождение в оборотно-сальдовой ведомости, а программист за пять минут выбирает из регистра все движения по проблемному контрагенту и находит документ-виновник.
Для чего нужна консоль запросов и чем она не является
Консоль запросов в типовых конфигурациях не встроена. В Все функции → Стандартные вы найдёте консоль заданий, удаление помеченных объектов, управление итогами — но не консоль запросов. Её берут отдельным файлом .epf: обработку для управляемых форм распространяют вместе с материалами информационно-технологического сопровождения, есть и сторонние варианты от сообщества.
Что с её помощью делают на практике:
- 🔍 Ищут данные. Например, все документы, где контрагент указан без договора.
- 🧪 Отлаживают запрос. Пишут текст, смотрят результат, правят, и только потом переносят в модуль.
- 📊 Сверяют регистры. Остатки по счёту 41 на дату по складам, обороты за период.
- ⏱ Меряют скорость. Видно, сколько секунд выполнялся запрос и сколько строк вернул.
- 📤 Выгружают выборку. Результат уходит в табличный документ, а оттуда — в Excel.
Чем консоль не является:
| Ожидание | Как на самом деле |
|---|---|
| Можно изменить данные запросом | Язык запросов 1С только читает. UPDATE и DELETE в нём нет |
| Запрос видит всё | Работает с правами текущего пользователя и ограничениями RLS |
| Это часть Конфигуратора | Это обработка режима 1С:Предприятие; в Конфигураторе есть только конструктор запроса |
Если нужно поменять данные по результату выборки, это делают обработкой с кодом или групповым изменением реквизитов. Консоль помогает найти, что менять, но сама ничего не записывает.
Как открыть консоль запросов в базе
Порядок для интерфейса «Такси» на платформе 8.3.2x:
- Скачайте обработку консоли под вашу версию платформы и сохраните
.epfна диск. - Запустите базу в режиме 1С:Предприятие под пользователем с полными правами.
- Откройте
≡ (главное меню) → Файл → Открытьи выберите файл. - Платформа покажет предупреждение безопасности о внешней обработке. Подтвердите открытие, если доверяете файлу.
Если пункта Файл → Открыть нет или открытие запрещено — у роли пользователя нет права на интерактивное открытие внешних обработок. Права выдаёт администратор базы. В конфигурациях на БСП при включённой защите от опасных действий программа дополнительно предупреждает о файле; это нормальное поведение.
Внешние обработки из непроверенных источников открывайте только в копии базы. Обработка исполняет произвольный код с вашими правами.
Рабочая область: что где находится
Конкретная раскладка зависит от варианта обработки, но набор зон у всех консолей одинаков:
- 📝 Поле текста запроса. Сюда пишут или вставляют запрос. Поддерживается пакет — несколько запросов через
;. - 🧱 Конструктор запроса. Кнопка вызывает тот же визуальный конструктор, что и в Конфигураторе. Удобно собрать соединения мышкой, а потом доработать руками.
- ⚙️ Параметры. Таблица «имя — тип — значение». Обычно есть команда, которая сама находит параметры в тексте.
- 📋 Результат. Таблица или дерево (для запросов с
ИТОГИ), число строк, время выполнения. - 💾 Список запросов. Несколько сохранённых запросов в одном файле, между ними можно переключаться.
Рабочий ритм простой: написали текст → заполнили параметры → выполнили → посмотрели результат и время → поправили.
Написание и отладка сложных запросов в консоли
Сложный запрос лучше собирать слоями через временные таблицы. Каждый слой можно выполнить и проверить отдельно.
Пример: остатки товаров на складах вместе с последней ценой поступления.
ВЫБРАТЬ
Остатки.Номенклатура КАК Номенклатура,
Остатки.Склад КАК Склад,
Остатки.КоличествоОстаток КАК Количество
ПОМЕСТИТЬ ВТ_Остатки
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, ) КАК Остатки
ИНДЕКСИРОВАТЬ ПО
Номенклатура
;
ВЫБРАТЬ
ВТ_Остатки.Номенклатура,
ВТ_Остатки.Склад,
ВТ_Остатки.Количество
ИЗ
ВТ_Остатки КАК ВТ_Остатки
ГДЕ
ВТ_Остатки.Количество > 0
УПОРЯДОЧИТЬ ПО
ВТ_Остатки.Количество УБЫВ
Имя регистра в примере условное: в вашей конфигурации оно своё. Точное имя проще всего взять в конструкторе запроса — дерево таблиц слева показывает все объекты базы.
Приёмы отладки, которые экономят время
- Смотрите промежуточные таблицы. В пакете консоль обычно показывает результат каждого запроса или позволяет выбрать, какой выводить. Не видно в вашей версии — временно замените
ПОМЕСТИТЬ ВТ_Остаткина обычную выборку и выполните первый запрос отдельно. - Ограничивайте выборку. На этапе отладки пишите
ВЫБРАТЬ ПЕРВЫЕ 100. Запрос по регистру с миллионами строк без условий легко занимает минуты. - Проверяйте типы полей. Составной тип (
Регистратор,Субконто1) при обращении через точку разворачивается в соединение со всеми возможными таблицами. Уточняйте тип:ВЫРАЗИТЬ(Проводки.Субконто1 КАК Справочник.Контрагенты).ИНН. - Используйте предопределённые значения прямо в тексте.
ЗНАЧЕНИЕ(Перечисление.ВидыДвиженияНакопления.Приход)илиЗНАЧЕНИЕ(Справочник.Валюты.ПустаяСсылка)— вместо лишнего параметра. - Ищите дубли группировкой.
СГРУППИРОВАТЬ ПО ... ИМЕЮЩИЕ КОЛИЧЕСТВО(*) > 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:
- Выполните запрос.
- Выведите результат в табличный документ — у консолей есть такая команда на панели результата.
- В открывшемся табличном документе:
≡ → Файл → Сохранить как→ тип файла «Лист Excel» (.xlsx).
Быстрый путь для небольшой выборки: выделите строки в таблице результата, Ctrl+C и вставьте в Excel. Для десятков тысяч строк надёжнее сохранение файлом.
Перед выгрузкой задайте полям понятные псевдонимы через КАК: Остатки.КоличествоОстаток КАК Остаток. Они станут заголовками колонок в Excel.
Для повторяющейся задачи — например, ежемесячной выгрузки для аудитора — лучше перенести запрос в отчёт на СКД. Консоль удобна для разовых выборок; отчёт запускает пользователь без знания языка запросов.
Ошибки при выполнении запроса и как их снять
Платформа указывает строку и колонку ошибки в фигурных скобках, например {(12, 5)}. Считайте от начала текста запроса — так быстрее всего найти место.
КоличествоОстаток, СуммаОстаток. У оборотов — КоличествоОборот, КоличествоПриход. Проверьте имя в дереве конструктора.Остатки.Номенклатура, а не просто Номенклатура.СГРУППИРОВАТЬ ПО и оно не обёрнуто в агрегатную функцию. Добавьте его в группировку или в СУММА, МАКСИМУМ.РАЗРЕШЕННЫЕ после ВЫБРАТЬ, чтобы недоступные записи просто отсекались.В. Проверьте тип каждого параметра.Отдельная история — тайм-аут или зависание. Если запрос по рабочей базе идёт минутами, не перезапускайте сервер ради того, чтобы его прервать. Закройте консоль или завершите свой сеанс в консоли администрирования кластера — это оборвёт только ваш сеанс. Затем добавьте отбор и ВЫБРАТЬ ПЕРВЫЕ.