Консоль запросов для 1С 8.3: готовая обработка или своя за полчаса
Содержание
Консоль запросов в 1С 8.3 создают двумя способами: берут готовую внешнюю обработку
(файл .epf) и открывают её через Главное меню → Файл → Открыть, либо пишут свою обработку в Конфигураторе: поле для текста запроса, кнопка «Выполнить» и табличный документ для результата. Встроенной консоли в типовых конфигурациях вроде Бухгалтерии 3.0 нет, поэтому без внешнего файла не обойтись.
Готовая консоль удобнее: в ней есть конструктор запроса, вкладка параметров, просмотр временных таблиц. Свою пишут, когда готовые файлы запрещены политикой безопасности или нужна консоль с минимумом функций, которую не страшно отдать коллеге. Механизм одинаковый для всех конфигураций на платформе 8.3: БП, ЗУП, УТ, ERP.
Где взять готовую консоль запросов и как запустить её в 1С 8.3
Есть два распространённых варианта готовых консолей.
| Вариант | Где взять | Когда выбирать |
|---|---|---|
| Консоль запросов от фирмы 1С | В наборе универсальных обработок на диске или портале ИТС, есть версия для управляемых форм | Нужен простой проверенный инструмент для «Такси» |
| «Инструменты разработчика» (ИР) | Бесплатный набор от сообщества, распространяется как расширение или набор обработок | Нужны отладка, анализ плана, работа с технологическим журналом |
Берите версию для управляемых форм. Консоль для обычных форм откроется только в толстом клиенте, а Бухгалтерия 3.0 и ЗУП 3.1 работают в тонком.
Как открыть консоль
- Скачайте файл обработки и сохраните его на диск, например в
C:\1C\Tools\. - Запустите базу в режиме 1С:Предприятие под пользователем с полными правами.
- Нажмите
Главное меню(значок ☰ в левом верхнем углу) →Файл→Открыть, илиCtrl+O. - Выберите файл
.epf. - Если программа покажет предупреждение о безопасности — подтвердите открытие, если доверяете источнику файла.
Открыть внешнюю обработку может только пользователь с правом интерактивного открытия внешних обработок. У обычного бухгалтера его, как правило, нет. Просить администратора выдать роль «Полные права» ради консоли не нужно: проще открыть консоль под администратором.
Почему консоль не открывается
- 🔒 Пользователю не хватает прав — откройте базу под администратором.
- ☁️ База работает в 1С:Фреш или другом облаке — там произвольные внешние обработки обычно запрещены, их нужно проходить проверку сервиса.
- 🧩 Обработка для обычных форм, а клиент тонкий — найдите версию для управляемых форм.
- 🛡️ Включена защита от опасных действий — платформа спросит подтверждение, это нормально.
Как создать консоль запросов самостоятельно: внешняя обработка за 30 минут
Своя консоль — это внешняя обработка с одной формой. Нужен Конфигуратор той же версии платформы, что и у базы. Конфигурацию базы менять не придётся: обработка живёт отдельным файлом.
Шаг 1. Создайте обработку
- Откройте Конфигуратор любой базы.
- Выберите
Файл → Новый → Внешняя обработка. - В поле «Имя» укажите
МояКонсольЗапросов, синоним — «Консоль запросов». - На вкладке «Формы» добавьте новую форму обработки и согласитесь сделать её основной.
Шаг 2. Добавьте реквизиты формы
В редакторе формы, на вкладке «Реквизиты», создайте два реквизита:
| Имя | Тип | Зачем |
|---|---|---|
ТекстЗапроса | Строка, неограниченной длины | Поле, куда пишем запрос |
РезультатТаблица | ТабличныйДокумент | Таблица с результатом |
Перетащите оба реквизита в дерево элементов формы. У поля ТекстЗапроса в свойствах включите многострочный режим и задайте высоту строк 10–15, иначе писать запрос будет неудобно.
Шаг 3. Добавьте команду и код
На вкладке «Команды» создайте команду ВыполнитьЗапрос и перетащите её на форму. Имя Выполнить не используйте: так называется оператор встроенного языка, и модуль не скомпилируется.
В модуле формы вставьте код:
&НаКлиенте
Процедура ВыполнитьЗапрос(Команда)
ВыполнитьЗапросНаСервере();
КонецПроцедуры
&НаСервере
Процедура ВыполнитьЗапросНаСервере()
РезультатТаблица.Очистить();
Попытка
Запрос = Новый Запрос(ТекстЗапроса);
Начало = ТекущаяУниверсальнаяДатаВМиллисекундах();
Таблица = Запрос.Выполнить().Выгрузить();
Длительность = ТекущаяУниверсальнаяДатаВМиллисекундах() - Начало;
Исключение
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;
ЧислоКолонок = Таблица.Колонки.Количество();
// Шапка: имена колонок
Для НомерКолонки = 1 По ЧислоКолонок Цикл
Ячейка = РезультатТаблица.Область(1, НомерКолонки, 1, НомерКолонки);
Ячейка.Текст = Таблица.Колонки[НомерКолонки - 1].Имя;
Ячейка.Шрифт = Новый Шрифт(, , Истина);
КонецЦикла;
// Строки результата
НомерСтроки = 1;
Для Каждого СтрокаТаблицы Из Таблица Цикл
НомерСтроки = НомерСтроки + 1;
Для НомерКолонки = 1 По ЧислоКолонок Цикл
Ячейка = РезультатТаблица.Область(НомерСтроки, НомерКолонки, НомерСтроки, НомерКолонки);
Ячейка.Текст = Строка(СтрокаТаблицы[НомерКолонки - 1]);
КонецЦикла;
КонецЦикла;
Сообщить(СтрШаблон("Строк: %1, время: %2 мс",
Формат(Таблица.Количество(), "ЧН=0; ЧГ=0"),
Формат(Длительность, "ЧН=0; ЧГ=0")));
КонецПроцедуры
Шаг 4. Сохраните и проверьте
Файл → Сохранить как→ файлMyQueryConsole.epf.- Откройте его в рабочей базе через
Файл → Открыть. - Вставьте пробный запрос и нажмите кнопку:
ВЫБРАТЬ ПЕРВЫЕ 10
Контрагенты.Наименование,
Контрагенты.ИНН
ИЗ
Справочник.Контрагенты КАК Контрагенты
Если в таблице появились 10 строк — консоль работает. Переменную цикла намеренно назвали СтрокаТаблицы, а не Строка: иначе она перекроет функцию Строка(), которой мы превращаем значения в текст.
Язык запросов 1С: минимум синтаксиса для работы в консоли
Язык запросов похож на SQL, но ключевые слова можно писать по-русски. Он только читает данные: изменить или удалить запись запросом нельзя, поэтому консоль безопасна для данных базы. Нагрузку при этом создать можно, об этом ниже.
Базовая форма запроса:
ВЫБРАТЬ
Реализация.Номер,
Реализация.Дата,
Реализация.Контрагент.Наименование КАК Покупатель,
Реализация.СуммаДокумента
ИЗ
Документ.РеализацияТоваровУслуг КАК Реализация
ГДЕ
Реализация.Проведен
И Реализация.СуммаДокумента > 100000
УПОРЯДОЧИТЬ ПО
Реализация.Дата УБЫВ
Что здесь важно:
- 📌 Таблицы называют по типу объекта:
Справочник.,Документ.,РегистрНакопления.,РегистрБухгалтерии.. - 🔗 Точка в
Реализация.Контрагент.Наименование— неявное соединение со справочником. Удобно, но каждая такая точка добавляет соединение в запрос к СУБД. - 🏷️
КАКзадаёт псевдоним — так называется колонка в результате. - 🔢
ПЕРВЫЕ Nограничивает число строк. Ставьте его на пробных запусках к большим таблицам.
Итоги и группировки:
ВЫБРАТЬ
Реализация.Контрагент КАК Покупатель,
КОЛИЧЕСТВО(Реализация.Ссылка) КАК Документов,
СУММА(Реализация.СуммаДокумента) КАК Сумма
ИЗ
Документ.РеализацияТоваровУслуг КАК Реализация
ГДЕ
Реализация.Проведен
СГРУППИРОВАТЬ ПО
Реализация.Контрагент
ИМЕЮЩИЕ
СУММА(Реализация.СуммаДокумента) > 1000000
ИМЕЮЩИЕ фильтрует уже сгруппированные строки, ГДЕ — исходные. Путать их — частая причина ошибки «поле не входит в группу».
Для регистров есть виртуальные таблицы: .Остатки, .Обороты, .ОстаткиИОбороты. Им передают период и условия прямо в скобках, а не в ГДЕ:
ВЫБРАТЬ
Остатки.Счет,
Остатки.Субконто1,
Остатки.СуммаОстатокДт
ИЗ
РегистрБухгалтерии.Хозрасчетный.Остатки(&НаДату, Счет В ИЕРАРХИИ (&Счет), , ) КАК Остатки
Условие внутри скобок фильтрует данные до расчёта остатков, поэтому работает быстрее и даёт правильный результат. Условие в ГДЕ по виртуальной таблице отрежет уже рассчитанные строки.
Параметры и временные таблицы в консоли запросов
Параметры
Параметр пишут через амперсанд: &НаДату, &Счет. Значения в текст не вклеивают. В готовой консоли есть вкладка параметров: после ввода текста нажмите команду заполнения параметров, консоль сама найдёт все &Имя и предложит задать тип и значение.
В своей обработке параметры задают кодом перед выполнением:
Запрос.УстановитьПараметр("НаДату", КонецДня(ТекущаяДатаСеанса()));
Запрос.УстановитьПараметр("Счет", ПланыСчетов.Хозрасчетный.РасчетыСПокупателями);
Узнать, какие параметры ждёт текст запроса, помогает метод Запрос.НайтиПараметры(): он возвращает их описания с именами и типами. На нём можно построить простую таблицу ввода параметров на форме.
Для даты-границы периода передавайте КонецДня(...) или Новый Граница(Дата, ВидГраницы.Включая). Иначе документы, проведённые в течение дня, могут не попасть в остатки на эту дату.
Временные таблицы и пакеты
Сложный отчёт удобно собирать по шагам: сначала отобрать данные во временную таблицу, затем соединить её с другими. Запросы пакета разделяют точкой с запятой:
ВЫБРАТЬ
Реализация.Контрагент КАК Контрагент,
СУММА(Реализация.СуммаДокумента) КАК Сумма
ПОМЕСТИТЬ ВТ_Продажи
ИЗ
Документ.РеализацияТоваровУслуг КАК Реализация
ГДЕ
Реализация.Проведен
И Реализация.Дата МЕЖДУ &НачалоПериода И &КонецПериода
СГРУППИРОВАТЬ ПО
Реализация.Контрагент
ИНДЕКСИРОВАТЬ ПО
Контрагент
;
////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТ.Контрагент.ИНН КАК ИНН,
ВТ.Сумма
ИЗ
ВТ_Продажи КАК ВТ
Готовая консоль показывает результат каждого запроса пакета отдельно — так видно, на каком шаге «потерялись» строки. Своя консоль из примера выше выведет только последний результат. Чтобы видеть промежуточные, замените Выполнить() на ВыполнитьПакет(): он вернёт массив результатов, по одному на каждый запрос пакета.
Если временные таблицы нужны между несколькими запусками, создайте Новый МенеджерВременныхТаблиц и присвойте его свойству Запрос.МенеджерВременныхТаблиц.
Соединения и объединения таблиц
Соединение добавляет колонки из второй таблицы, объединение — строки.
| Конструкция | Что делает | Пример задачи |
|---|---|---|
ЛЕВОЕ СОЕДИНЕНИЕ | Все строки левой таблицы, из правой — что нашлось | Все контрагенты и их продажи, даже нулевые |
ВНУТРЕННЕЕ СОЕДИНЕНИЕ | Только совпавшие строки | Контрагенты, у которых были продажи |
ПОЛНОЕ СОЕДИНЕНИЕ | Все строки обеих таблиц | Сверка двух списков: что есть только в одном |
ОБЪЕДИНИТЬ ВСЕ | Складывает строки двух запросов | Продажи и возвраты в одну ленту |
ОБЪЕДИНИТЬ | То же, но убирает полные дубли | Уникальный список ИНН из двух источников |
Пример левого соединения:
ВЫБРАТЬ
Контрагенты.Ссылка КАК Контрагент,
ЕСТЬNULL(ВТ.Сумма, 0) КАК Продажи
ИЗ
Справочник.Контрагенты КАК Контрагенты
ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Продажи КАК ВТ
ПО Контрагенты.Ссылка = ВТ.Контрагент
ГДЕ
НЕ Контрагенты.ЭтоГруппа
ЕСТЬNULL здесь обязателен: для контрагентов без продаж правая часть вернёт NULL, и итог по колонке посчитается неверно.
В ОБЪЕДИНИТЬ число и порядок колонок в частях должны совпадать. Псевдонимы берутся из первого запроса. Если колонки разного типа, тип результата станет составным.
Условие соединения по неиндексированному полю или по полю составного типа на большой таблице может выполняться минутами. Сначала проверяйте запрос с ПЕРВЫЕ 100 и на копии базы.
Как ускорить запрос и посмотреть план выполнения
Время выполнения показывает и готовая консоль, и наша — сообщением «Строк: …, время: … мс». Если запрос идёт дольше пары секунд, ищите причину по списку:
- 🐢 Условие на виртуальную таблицу регистра стоит в
ГДЕ, а не в скобках параметров. - 🔗 Много разыменований через точку по полям составного типа (
Регистратор.Контрагент) — каждое тянет соединение со всеми возможными таблицами. - 📦 Соединение с подзапросом вместо временной таблицы с индексом.
- ❓ Функции над полем в условии (
ГОД(Дата) = 2025) — индекс по полю не используется. ЛучшеДата МЕЖДУ &Начало И &Конец. - 📋
ВЫБРАТЬбез ограничений по огромному регистру, когда нужна выборка за месяц.
Где взять план запроса
Язык запросов 1С платформа переводит в SQL конкретной СУБД. Реальный план видно только на уровне СУБД, и есть три пути:
- Технологический журнал. В файле
logcfg.xmlнастраивают сбор событийDBMSSQL(для MS SQL) илиDBPOSTGRS(для PostgreSQL) с порогом длительности, и добавляют элемент<plansql/>— тогда в журнал попадут планы запросов. - Инструменты разработчика. В их консоли есть просмотр SQL-текста и плана для серверной базы.
- Средства СУБД. Для MS SQL — профилировщик и просмотр плана в SQL Server Management Studio, для PostgreSQL —
EXPLAIN ANALYZEпо тексту, взятому из журнала.
Технологический журнал с планами быстро растёт и нагружает сервер. Включайте его на короткое время, с порогом длительности и ограничением по базе, затем удаляйте logcfg.xml или отключайте сбор.
Для файловой базы плана СУБД нет. Там ориентируйтесь на время в консоли и на правила выше.
Сохранение запросов и выгрузка результата в Excel
Сохранение текстов запросов
Готовые консоли умеют сохранять набор запросов в файл и открывать его позже. Держите такие файлы в одной папке, а в начало каждого запроса добавляйте комментарий // Что ищем и для какой базы — через полгода это сэкономит поиск.
В своей обработке текст проще всего хранить в обычном текстовом файле:
ЗаписьТекста = Новый ЗаписьТекста("C:\1C\Queries\prodazhi.txt", КодировкаТекста.UTF8);
ЗаписьТекста.Записать(ТекстЗапроса);
ЗаписьТекста.Закрыть();
Учтите: процедура с атрибутом &НаСервере пишет файл на диск сервера 1С, а не вашего компьютера. В клиент-серверной базе для сохранения на свой диск нужен клиентский код с диалогом выбора файла.
Выгрузка результата в Excel
Результат в табличном документе сохраняется прямо из формы:
- Щёлкните по таблице результата.
Главное меню→Файл→Сохранить как.- Выберите тип «Лист Microsoft Excel 2007» (
.xlsx) и укажите путь.
Программно — одной строкой, если нужен автоматический отчёт:
РезультатТаблица.Записать("C:\1C\Export\result.xlsx", ТипФайлаТабличногоДокумента.XLSX);
Наша консоль превращает все значения в текст функцией Строка(). Для Excel это значит, что суммы придут текстом. Если нужно считать в Excel, записывайте в ячейку числа как есть, без Строка(), или выгружайте таблицу значений через СКД.
Частые вопросы
Можно ли испортить базу консолью запросов?
ПЕРВЫЕ 100.