Редактор запросов

25.06.25

Разработка - Инструментарий разработчика

Когда к запросу применяются сотни отборов с соединением с половиной таблиц базы данных, мы используем обработку "Редактор запросов" для пакетной фильтрации и порционной выборки данных.

Файлы

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Скачано Купить файл
(только для физ. лиц)
Редактор запросов:
.zip 21,04Kb
5 1 850 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

Друзья, обработка представляет собой обертку схемы запросов, позволяющую редактировать запрос через объектную модель. В редакторе запросов реализовано:

  • Добавление отборов, полей выборки, соединений, параметров виртуальных таблиц
  • Добавление "подзапросов", запросов и пакетов запросов
  • Добавление "подзапросов" выполняемых в привилегированном режиме
  • Выполнение порционной выборки данных (спасибо за реализацию, Алексею Козленко @AIKozlenko)
  • Использование программных таблиц "Сведения объектов" (изменение от 2025.06.25)

 

Базовый запрос это выборка минимального набора полей необходимого для выполнения сортировки или дальнейшей расшифровки. В основном это "Ссылка" и все поля по которым необходимо выполнение настройки сортировки.

 

1. Выполним инициализацию редактора запросов с загрузкой базового запроса.


// Базовый запрос
БазовыйЗапросТекст = 
	"ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1000
	|	Справочник1.Ссылка КАК Ссылка,
	|	Справочник1.Реквизит1 КАК Реквизит1
	|ИЗ
	|	Справочник.Справочник1 КАК Справочник1
	|
	|УПОРЯДОЧИТЬ ПО
	|	Реквизит1";

БазовыйЗапрос = Новый Запрос(БазовыйЗапросТекст);

// Создадим редактор запросов 
РедакторЗапросов = Обработки.га_РедакторЗапросов.Инициализировать(БазовыйЗапрос);

2. Выполним добавление отбора в последний запрос.

// Добавим отбор
Значения = Новый Массив;
Значения.Добавить("Значение1");
Значения.Добавить("Значение2");

РедакторЗапросов.ПоследнийЗапросУсловиеДобавить("Справочник1.Реквизит1", "=", Значения);

Если условие сложное, возможно добавить напрямую выражением схемы запроса:

РедакторЗапросов.ПоследнийЗапросУсловиеВыражениеСхемыЗапросаДобавить("Справочник1.Реквизит1 В(&Реквизит1_0)");

Итоговый текст запроса:

 

3. Выполним соединение с дополнительной таблицей с установкой отбора.

// Добавим подзапрос и установим отбор
ПодзапросТекст = 
	"ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
	|	БазовыйЗапрос.*
	|ИЗ
	|	БазовыйЗапрос КАК БазовыйЗапрос
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.РегистрСведений1 КАК РегистрСведений1
	|		ПО БазовыйЗапрос.Ссылка = РегистрСведений1.Измерение1 	
	|ГДЕ
	|	РегистрСведений1.Ресурс1 = &Ресурс1";

Подзапрос = Новый Запрос(ПодзапросТекст);
Подзапрос.УстановитьПараметр("Ресурс1", "Значение1");

РедакторЗапросов.ПодзапросДобавить(Подзапрос);
РедакторЗапросов.ПоследнийЗапросУсловиеДобавить("РегистрСведений1.Ресурс2", ">", "Значение2");

Базовый запрос будет помещен во временную таблицу с применением "подзапроса" и удалением временной таблицы. Выражения сортировки и ограничения количества перейдут в новый запрос.

Итоговый текст запроса:

 

4. Выполним создание пакета временных таблиц с последующим использованием в "подзапросе".

// Добавим пакет временных таблиц, добавим подзапрос и установим отбор
ПакетВременныхТаблицТекст = 
	"ВЫБРАТЬ
	|	РегистрСведений2.Измерение1 КАК Измерение1,
	|	РегистрСведений2.Измерение2 КАК Измерение2,
	|	РегистрСведений2.Измерение3 КАК Измерение3
	|ПОМЕСТИТЬ ДополнительныеДанные
	|ИЗ
	|	РегистрСведений.РегистрСведений2 КАК РегистрСведений2
	|ГДЕ
	|	РегистрСведений2.Измерение1 В
	|			(ВЫБРАТЬ
	|				БазовыйЗапрос.Ссылка КАК Ссылка
	|			ИЗ
	|				БазовыйЗапрос КАК БазовыйЗапрос)";
	
ПодзапросТекст = 
	"ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
	|	БазовыйЗапрос.*
	|ИЗ
	|	БазовыйЗапрос КАК БазовыйЗапрос
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ДополнительныеДанные КАК ДополнительныеДанные
	|		ПО БазовыйЗапрос.Ссылка = ДополнительныеДанные.Измерение1";

ПакетВременныхТаблиц = Новый Запрос(ПакетВременныхТаблицТекст);
Подзапрос = Новый Запрос(ПодзапросТекст); 

РедакторЗапросов.ПакетВременныхТаблицИПодзапросДобавить(ПакетВременныхТаблиц, Подзапрос);	
РедакторЗапросов.ПоследнийЗапросУсловиеДобавить("ДополнительныеДанные.Измерение2", "=", "Значение1");

Итоговый текст запроса:

 

5. При добавлении "подзапросов" запрос выборки постоянно смещается, но доступ к базовому запросу сохраняется, в любой момент можно добавить отбор в самый первый запрос: 

// Добавим отбор в базовый запрос
РедакторЗапросов.БазовыйЗапросУсловиеДобавить("Справочник1.Реквизит2", "=", "Значение1");

Текст "подзапроса" кешируется, поэтому также сохраняется доступ и к ним

// Кеширование подзапроса
ПодзапросТекст = 
	"ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
	|	БазовыйЗапрос.*
	|ИЗ
	|	БазовыйЗапрос КАК БазовыйЗапрос
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.РегистрСведений1 КАК РегистрСведений1
	|		ПО БазовыйЗапрос.Ссылка = РегистрСведений1.Измерение1 	
	|ГДЕ
	|	РегистрСведений1.Ресурс1 = &Ресурс1";

Подзапрос = Новый Запрос(ПодзапросТекст); 

ИндексПакета = РедакторЗапросов.ПодзапросДобавить(Подзапрос);
РедакторЗапросов.ЗапросУсловиеДобавить(ИндексПакета, "РегистрСведений1.Ресурс3", "<>", "Значение1");

Итоговый текст запроса:

 

6. При необходимости выполнение "подзапроса" возможно выполнить в привилегированном режиме.

// Выполнение подзапроса в привилегированном режиме
ПодзапросТекст = 
	"ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
	|	БазовыйЗапрос.*
	|ИЗ
	|	БазовыйЗапрос КАК БазовыйЗапрос
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.РегистрСведений3 КАК РегистрСведений3
	|		ПО БазовыйЗапрос.Ссылка = РегистрСведений3.Измерение1";

Подзапрос = Новый Запрос(ПодзапросТекст);
РедакторЗапросов.ПодзапросВПривилегированномРежимеДобавить(Подзапрос);

Итоговый текст запроса:

 

7. После окончания редактирования возможно получить выборку или поместить результат в менеджер временных таблиц для дальнейшего использования.

// Получим выборку
Выборка = РедакторЗапросов.СкомпоноватьИВыбрать();


// Получим выборку и поместим результат во временную таблицу
ВыборкаОписание = РедакторЗапросов.СкомпоноватьИВыбратьСПомещениемВоВременнуюТаблицу();

// ВыборкаОписание.Выборка
// ВыборкаОписание.МенеджерВременныхТаблиц
// ВыборкаОписание.ТаблицаВМенеджере

 

8. Редактор запросов возможно использовать для порционной выборки данных. Базовый запрос выполнится и будет помещен во временную таблицу целиком, а запрос расшифровки будет скользить по базовому в цикле, с установленной порцией.

// Базовый запрос
БазовыйЗапросТекст = 
	"ВЫБРАТЬ РАЗРЕШЕННЫЕ
	|	Справочник1.Ссылка КАК Ссылка,
	|	Справочник1.Реквизит1 КАК Реквизит1
	|ИЗ
	|	Справочник.Справочник1 КАК Справочник1
	|
	|УПОРЯДОЧИТЬ ПО
	|	Реквизит1";


// Запрос расшифровки
ЗапросРасшифровкиТекст = 
	"ВЫБРАТЬ РАЗРЕШЕННЫЕ
	|	БазовыйЗапрос.Ссылка КАК Ссылка,
	|	РегистрСведений2.Измерение1 КАК Измерение1,
	|	РегистрСведений2.Измерение2 КАК Измерение2,
	|	РегистрСведений2.Измерение3 КАК Измерение3,
	|	РегистрСведений2.Ресурс1 КАК Ресурс1
	|ИЗ
	|	БазовыйЗапрос КАК БазовыйЗапрос
	|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РегистрСведений2 КАК РегистрСведений2
	|		ПО БазовыйЗапрос.Ссылка = РегистрСведений2.Измерение1";


БазовыйЗапрос 		= Новый Запрос(БазовыйЗапросТекст);
ЗапросРасшифровки 	= Новый Запрос(ЗапросРасшифровкиТекст);

РедакторЗапросов 	= Обработки.га_РедакторЗапросов.Инициализировать(БазовыйЗапрос);	
Выборка			= Неопределено;	

Пока РедакторЗапросов.СкомпоноватьИВыбратьСОбходомПостранично(Выборка, ОбходРезультатаЗапроса.Прямой, 100, ЗапросРасшифровки) Цикл

	// Выборка.Ссылка
	// Выборка.Измерение1
	// Выборка.Измерение2
	// Выборка.Измерение3
	// Выборка.Ресурс1

КонецЦикла;	

 

9. Редактор запросов позволяет использовать программную таблицу "Сведения объектов".

Описание реализации доступно в этой статье.

 

Как видите, все просто, данная разработка в помощь!

Обработка является частью модуля Стандартные подсистемы.

Проект и исходный код доступен на GitLab. 

 

 -----

Требования:

- Обработка предназначена для версии платформы >= 8.3.13, тестировалась на 8.3.21.1895

- БСП, процедура "ОбщегоНазначенияКлиентСервер.ДополнитьСтруктуру

 

-----

Ссылки:
Проект в GitLab

 

Проверено на следующих конфигурациях и релизах:

  • 1С:Библиотека стандартных подсистем, редакция 3.1, релизы 3.1.10.243

Редактор запросов Схема запроса

См. также

Инструментарий разработчика Роли и права Запросы СКД Программист Руководитель проекта 1С v8.3 Управляемые формы Запросы Система компоновки данных Платные (руб)

Инструменты для разработчиков 1С 8.3: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.

15500 руб.

02.09.2020    196427    1085    409    

1006

SALE! 15%

Инструментарий разработчика Чистка данных Свертка базы Инструменты администратора БД Системный администратор Программист Руководитель проекта 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Россия Платные (руб)

Инструмент представляет собой обработку для проведения свёртки или обрезки баз данных. Работает на ЛЮБЫХ конфигурациях (УТ, БП, ERP, УНФ, КА и т.д.). Поддерживаются серверные и файловые базы, управляемые и обычные формы. Может выполнять свертку одновременно в несколько потоков. А так же автоматически, без непосредственного участия пользователя. Решение в Реестре отечественного ПО

8400 7140 руб.

20.08.2024    32687    199    104    

188

Пакетная печать Печатные формы Инструментарий разработчика Программист 1С v8.3 Запросы 1С:Зарплата и кадры бюджетного учреждения 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Платные (руб)

Инструмент, позволяющий абсолютно по-новому взглянуть на процесс разработки печатных форм. Благодаря конструктору можно значительно снизить затраты времени на разработку печатных форм, повысить качество и "прозрачность" разработки, а также навести порядок в многообразии корпоративных печатных форм.

22200 руб.

06.10.2023    22795    62    19    

90

Инструменты администратора БД Инструментарий разработчика Роли и права Программист 1С v8.3 1C:Бухгалтерия Россия Платные (руб)

Расширение позволяет без изменения кода конфигурации выполнять проверки при вводе данных, скрывать от пользователя недоступные ему данные, выполнять код в обработчиках. Не изменяет данные конфигурации, легко устанавливается практически на любую конфигурацию на управляемых формах.

15000 руб.

10.11.2023    15555    66    33    

84

Инструментарий разработчика Программист 1С v8.3 Платные (руб)

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

9360 руб.

17.05.2024    32996    112    48    

155

Инструментарий разработчика Программист 8.3.14 Россия Платные (руб)

Расширение для конфигурации “Конвертация данных 3”. Добавляет подсветку синтаксиса, детальную контекстную подсказку, глобальный поиск по коду.

20000 руб.

07.10.2021    20169    8    32    

44

Инструментарий разработчика Программист 1С v8.3 1C:Бухгалтерия Россия Платные (руб)

Восстановление партий или взаиморасчетов, расчет зарплаты, пакетное формирование документов или отчетов - теперь все это стало доступнее. * Есть желание повысить скорость работы медленных алгоритмов! Но... * Нет времени думать о реализации многопоточности? * о запуске и остановке потоков? * о поддержании потоков в рабочем состоянии? * о передаче данных в потоки и как получить ответ из потока? * об организации последовательности? Тогда ЭТО - то что надо!!!

5000 руб.

07.02.2018    106359    248    100    

313
Оставьте свое сообщение