Консоль запросов для 1С 8.3: готовая обработка или своя за полчаса

· 10 мин

Содержание

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

Готовая консоль удобнее: в ней есть конструктор запроса, вкладка параметров, просмотр временных таблиц. Свою пишут, когда готовые файлы запрещены политикой безопасности или нужна консоль с минимумом функций, которую не страшно отдать коллеге. Механизм одинаковый для всех конфигураций на платформе 8.3: БП, ЗУП, УТ, ERP.

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

Есть два распространённых варианта готовых консолей.

ВариантГде взятьКогда выбирать
Консоль запросов от фирмы 1СВ наборе универсальных обработок на диске или портале ИТС, есть версия для управляемых формНужен простой проверенный инструмент для «Такси»
«Инструменты разработчика» (ИР)Бесплатный набор от сообщества, распространяется как расширение или набор обработокНужны отладка, анализ плана, работа с технологическим журналом

Берите версию для управляемых форм. Консоль для обычных форм откроется только в толстом клиенте, а Бухгалтерия 3.0 и ЗУП 3.1 работают в тонком.

Как открыть консоль

  1. Скачайте файл обработки и сохраните его на диск, например в C:\1C\Tools\.
  2. Запустите базу в режиме 1С:Предприятие под пользователем с полными правами.
  3. Нажмите Главное меню (значок ☰ в левом верхнем углу) → Файл → Открыть, или Ctrl+O.
  4. Выберите файл .epf.
  5. Если программа покажет предупреждение о безопасности — подтвердите открытие, если доверяете источнику файла.

Открыть внешнюю обработку может только пользователь с правом интерактивного открытия внешних обработок. У обычного бухгалтера его, как правило, нет. Просить администратора выдать роль «Полные права» ради консоли не нужно: проще открыть консоль под администратором.

Почему консоль не открывается

  • 🔒 Пользователю не хватает прав — откройте базу под администратором.
  • ☁️ База работает в 1С:Фреш или другом облаке — там произвольные внешние обработки обычно запрещены, их нужно проходить проверку сервиса.
  • 🧩 Обработка для обычных форм, а клиент тонкий — найдите версию для управляемых форм.
  • 🛡️ Включена защита от опасных действий — платформа спросит подтверждение, это нормально.

Как создать консоль запросов самостоятельно: внешняя обработка за 30 минут

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

Шаг 1. Создайте обработку

  1. Откройте Конфигуратор любой базы.
  2. Выберите Файл → Новый → Внешняя обработка.
  3. В поле «Имя» укажите МояКонсольЗапросов, синоним — «Консоль запросов».
  4. На вкладке «Формы» добавьте новую форму обработки и согласитесь сделать её основной.

Шаг 2. Добавьте реквизиты формы

В редакторе формы, на вкладке «Реквизиты», создайте два реквизита:

ИмяТипЗачем
ТекстЗапросаСтрока, неограниченной длиныПоле, куда пишем запрос
РезультатТаблицаТабличныйДокументТаблица с результатом

Перетащите оба реквизита в дерево элементов формы. У поля ТекстЗапроса в свойствах включите многострочный режим и задайте высоту строк 10–15, иначе писать запрос будет неудобно.

Шаг 3. Добавьте команду и код

На вкладке «Команды» создайте команду ВыполнитьЗапрос и перетащите её на форму. Имя Выполнить не используйте: так называется оператор встроенного языка, и модуль не скомпилируется.

В модуле формы вставьте код:

&НаКлиенте
Процедура ВыполнитьЗапрос(Команда)
	ВыполнитьЗапросНаСервере();
КонецПроцедуры

&НаСервере
Процедура ВыполнитьЗапросНаСервере()

	РезультатТаблица.Очистить();

	Попытка
		Запрос = Новый Запрос(ТекстЗапроса);
		Начало = ТекущаяУниверсальнаяДатаВМиллисекундах();
		Таблица = Запрос.Выполнить().Выгрузить();
		Длительность = ТекущаяУниверсальнаяДатаВМиллисекундах() - Начало;
	Исключение
		Сообщить(ОписаниеОшибки());
		Возврат;
	КонецПопытки;

	ЧислоКолонок = Таблица.Колонки.Количество();

	// Шапка: имена колонок
	Для НомерКолонки = 1 По ЧислоКолонок Цикл
		Ячейка = РезультатТаблица.Область(1, НомерКолонки, 1, НомерКолонки);
		Ячейка.Текст = Таблица.Колонки[НомерКолонки - 1].Имя;
		Ячейка.Шрифт = Новый Шрифт(, , Истина);
	КонецЦикла;

	// Строки результата
	НомерСтроки = 1;
	Для Каждого СтрокаТаблицы Из Таблица Цикл
		НомерСтроки = НомерСтроки + 1;
		Для НомерКолонки = 1 По ЧислоКолонок Цикл
			Ячейка = РезультатТаблица.Область(НомерСтроки, НомерКолонки, НомерСтроки, НомерКолонки);
			Ячейка.Текст = Строка(СтрокаТаблицы[НомерКолонки - 1]);
		КонецЦикла;
	КонецЦикла;

	Сообщить(СтрШаблон("Строк: %1, время: %2 мс",
		Формат(Таблица.Количество(), "ЧН=0; ЧГ=0"),
		Формат(Длительность, "ЧН=0; ЧГ=0")));

КонецПроцедуры

Шаг 4. Сохраните и проверьте

  1. Файл → Сохранить как → файл MyQueryConsole.epf.
  2. Откройте его в рабочей базе через Файл → Открыть.
  3. Вставьте пробный запрос и нажмите кнопку:
ВЫБРАТЬ ПЕРВЫЕ 10
	Контрагенты.Наименование,
	Контрагенты.ИНН
ИЗ
	Справочник.Контрагенты КАК Контрагенты

Если в таблице появились 10 строк — консоль работает. Переменную цикла намеренно назвали СтрокаТаблицы, а не Строка: иначе она перекроет функцию Строка(), которой мы превращаем значения в текст.

Какую консоль запросов выбрать?

Язык запросов 1С: минимум синтаксиса для работы в консоли

Язык запросов похож на SQL, но ключевые слова можно писать по-русски. Он только читает данные: изменить или удалить запись запросом нельзя, поэтому консоль безопасна для данных базы. Нагрузку при этом создать можно, об этом ниже.

Базовая форма запроса:

ВЫБРАТЬ
	Реализация.Номер,
	Реализация.Дата,
	Реализация.Контрагент.Наименование КАК Покупатель,
	Реализация.СуммаДокумента
ИЗ
	Документ.РеализацияТоваровУслуг КАК Реализация
ГДЕ
	Реализация.Проведен
	И Реализация.СуммаДокумента > 100000
УПОРЯДОЧИТЬ ПО
	Реализация.Дата УБЫВ

Что здесь важно:

  • 📌 Таблицы называют по типу объекта: Справочник., Документ., РегистрНакопления., РегистрБухгалтерии..
  • 🔗 Точка в Реализация.Контрагент.Наименование — неявное соединение со справочником. Удобно, но каждая такая точка добавляет соединение в запрос к СУБД.
  • 🏷️ КАК задаёт псевдоним — так называется колонка в результате.
  • 🔢 ПЕРВЫЕ N ограничивает число строк. Ставьте его на пробных запусках к большим таблицам.

Итоги и группировки:

ВЫБРАТЬ
	Реализация.Контрагент КАК Покупатель,
	КОЛИЧЕСТВО(Реализация.Ссылка) КАК Документов,
	СУММА(Реализация.СуммаДокумента) КАК Сумма
ИЗ
	Документ.РеализацияТоваровУслуг КАК Реализация
ГДЕ
	Реализация.Проведен
СГРУППИРОВАТЬ ПО
	Реализация.Контрагент
ИМЕЮЩИЕ
	СУММА(Реализация.СуммаДокумента) > 1000000

ИМЕЮЩИЕ фильтрует уже сгруппированные строки, ГДЕ — исходные. Путать их — частая причина ошибки «поле не входит в группу».

Для регистров есть виртуальные таблицы: .Остатки, .Обороты, .ОстаткиИОбороты. Им передают период и условия прямо в скобках, а не в ГДЕ:

ВЫБРАТЬ
	Остатки.Счет,
	Остатки.Субконто1,
	Остатки.СуммаОстатокДт
ИЗ
	РегистрБухгалтерии.Хозрасчетный.Остатки(&НаДату, Счет В ИЕРАРХИИ (&Счет), , ) КАК Остатки

Условие внутри скобок фильтрует данные до расчёта остатков, поэтому работает быстрее и даёт правильный результат. Условие в ГДЕ по виртуальной таблице отрежет уже рассчитанные строки.

Параметры и временные таблицы в консоли запросов

Параметры

Параметр пишут через амперсанд: &НаДату, &Счет. Значения в текст не вклеивают. В готовой консоли есть вкладка параметров: после ввода текста нажмите команду заполнения параметров, консоль сама найдёт все &Имя и предложит задать тип и значение.

В своей обработке параметры задают кодом перед выполнением:

Запрос.УстановитьПараметр("НаДату", КонецДня(ТекущаяДатаСеанса()));
Запрос.УстановитьПараметр("Счет", ПланыСчетов.Хозрасчетный.РасчетыСПокупателями);

Узнать, какие параметры ждёт текст запроса, помогает метод Запрос.НайтиПараметры(): он возвращает их описания с именами и типами. На нём можно построить простую таблицу ввода параметров на форме.

Для даты-границы периода передавайте КонецДня(...) или Новый Граница(Дата, ВидГраницы.Включая). Иначе документы, проведённые в течение дня, могут не попасть в остатки на эту дату.

Временные таблицы и пакеты

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

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

////////////////////////////////////////////////////////////
ВЫБРАТЬ
	ВТ.Контрагент.ИНН КАК ИНН,
	ВТ.Сумма
ИЗ
	ВТ_Продажи КАК ВТ

Готовая консоль показывает результат каждого запроса пакета отдельно — так видно, на каком шаге «потерялись» строки. Своя консоль из примера выше выведет только последний результат. Чтобы видеть промежуточные, замените Выполнить() на ВыполнитьПакет(): он вернёт массив результатов, по одному на каждый запрос пакета.

Если временные таблицы нужны между несколькими запусками, создайте Новый МенеджерВременныхТаблиц и присвойте его свойству Запрос.МенеджерВременныхТаблиц.

Соединения и объединения таблиц

Соединение добавляет колонки из второй таблицы, объединение — строки.

КонструкцияЧто делаетПример задачи
ЛЕВОЕ СОЕДИНЕНИЕВсе строки левой таблицы, из правой — что нашлосьВсе контрагенты и их продажи, даже нулевые
ВНУТРЕННЕЕ СОЕДИНЕНИЕТолько совпавшие строкиКонтрагенты, у которых были продажи
ПОЛНОЕ СОЕДИНЕНИЕВсе строки обеих таблицСверка двух списков: что есть только в одном
ОБЪЕДИНИТЬ ВСЕСкладывает строки двух запросовПродажи и возвраты в одну ленту
ОБЪЕДИНИТЬТо же, но убирает полные дублиУникальный список ИНН из двух источников

Пример левого соединения:

ВЫБРАТЬ
	Контрагенты.Ссылка КАК Контрагент,
	ЕСТЬNULL(ВТ.Сумма, 0) КАК Продажи
ИЗ
	Справочник.Контрагенты КАК Контрагенты
		ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Продажи КАК ВТ
		ПО Контрагенты.Ссылка = ВТ.Контрагент
ГДЕ
	НЕ Контрагенты.ЭтоГруппа

ЕСТЬNULL здесь обязателен: для контрагентов без продаж правая часть вернёт NULL, и итог по колонке посчитается неверно.

В ОБЪЕДИНИТЬ число и порядок колонок в частях должны совпадать. Псевдонимы берутся из первого запроса. Если колонки разного типа, тип результата станет составным.

Условие соединения по неиндексированному полю или по полю составного типа на большой таблице может выполняться минутами. Сначала проверяйте запрос с ПЕРВЫЕ 100 и на копии базы.

Как ускорить запрос и посмотреть план выполнения

Время выполнения показывает и готовая консоль, и наша — сообщением «Строк: …, время: … мс». Если запрос идёт дольше пары секунд, ищите причину по списку:

  • 🐢 Условие на виртуальную таблицу регистра стоит в ГДЕ, а не в скобках параметров.
  • 🔗 Много разыменований через точку по полям составного типа (Регистратор.Контрагент) — каждое тянет соединение со всеми возможными таблицами.
  • 📦 Соединение с подзапросом вместо временной таблицы с индексом.
  • ❓ Функции над полем в условии (ГОД(Дата) = 2025) — индекс по полю не используется. Лучше Дата МЕЖДУ &Начало И &Конец.
  • 📋 ВЫБРАТЬ без ограничений по огромному регистру, когда нужна выборка за месяц.

Где взять план запроса

Язык запросов 1С платформа переводит в SQL конкретной СУБД. Реальный план видно только на уровне СУБД, и есть три пути:

  1. Технологический журнал. В файле logcfg.xml настраивают сбор событий DBMSSQL (для MS SQL) или DBPOSTGRS (для PostgreSQL) с порогом длительности, и добавляют элемент <plansql/> — тогда в журнал попадут планы запросов.
  2. Инструменты разработчика. В их консоли есть просмотр SQL-текста и плана для серверной базы.
  3. Средства СУБД. Для MS SQL — профилировщик и просмотр плана в SQL Server Management Studio, для PostgreSQL — EXPLAIN ANALYZE по тексту, взятому из журнала.

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

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

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

Сохранение текстов запросов

Готовые консоли умеют сохранять набор запросов в файл и открывать его позже. Держите такие файлы в одной папке, а в начало каждого запроса добавляйте комментарий // Что ищем и для какой базы — через полгода это сэкономит поиск.

В своей обработке текст проще всего хранить в обычном текстовом файле:

ЗаписьТекста = Новый ЗаписьТекста("C:\1C\Queries\prodazhi.txt", КодировкаТекста.UTF8);
ЗаписьТекста.Записать(ТекстЗапроса);
ЗаписьТекста.Закрыть();

Учтите: процедура с атрибутом &НаСервере пишет файл на диск сервера 1С, а не вашего компьютера. В клиент-серверной базе для сохранения на свой диск нужен клиентский код с диалогом выбора файла.

Выгрузка результата в Excel

Результат в табличном документе сохраняется прямо из формы:

  1. Щёлкните по таблице результата.
  2. Главное меню → Файл → Сохранить как.
  3. Выберите тип «Лист Microsoft Excel 2007» (.xlsx) и укажите путь.

Программно — одной строкой, если нужен автоматический отчёт:

РезультатТаблица.Записать("C:\1C\Export\result.xlsx", ТипФайлаТабличногоДокумента.XLSX);

Наша консоль превращает все значения в текст функцией Строка(). Для Excel это значит, что суммы придут текстом. Если нужно считать в Excel, записывайте в ячейку числа как есть, без Строка(), или выгружайте таблицу значений через СКД.

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

Можно ли испортить базу консолью запросов?
Данные — нет: язык запросов только читает. Но тяжёлый запрос к большому регистру нагрузит сервер и замедлит работу всем пользователям. Пробуйте на копии или с ПЕРВЫЕ 100.
Почему консоль не видит данные, которые есть в программе?
Запросы из консоли выполняются с ограничениями прав текущего пользователя. Если у него настроены ограничения доступа на уровне записей, часть строк не попадёт в результат. Запустите консоль под администратором.
Чем консоль запросов отличается от конструктора запроса в Конфигураторе?
Конструктор только собирает текст запроса, но не выполняет его. Консоль выполняет текст на живых данных базы и показывает результат.
Подходит ли консоль для 1С:Предприятия 8.2?
Нужна версия обработки под ту платформу и тип форм, на которых работает база. Для 8.2 с обычными формами подойдёт консоль для обычных форм, которая работает в толстом клиенте.
Можно ли изменить данные через консоль?
Запросом — нет. Некоторые расширенные консоли позволяют выполнить произвольный код, но менять данные в рабочей базе так рискованно: нет проверок, которые делает форма документа. Правьте через интерфейс или обработку с журналом изменений.