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

24.07.24

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

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

Скачать файл

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

Наименование По подписке [?] Купить один файл
Редактор запросов:
.zip 10,89Kb
4
4 Скачать (1 SM) Купить за 1 850 руб.

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

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

 

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

 

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

КонецЦикла;	

 

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

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

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

 

 -----

Требования:

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

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

 

-----

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

 

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

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

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

См. также

SALE! 15%

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

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

10000 руб.

02.09.2020    159453    874    399    

861

SALE! 15%

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

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

8400 7140 руб.

20.08.2024    7777    57    22    

66

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

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

9360 руб.

17.05.2024    23439    68    45    

117

SALE! 15%

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

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

10000 8500 руб.

10.11.2023    10431    36    24    

61

SALE! 15%

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

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

22200 19980 руб.

06.10.2023    15402    35    7    

70

SALE! 35%

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

Универсальный инструмент программиста для администрирования конфигураций. Сборник наиболее часто используемых обработок под единым интерфейсом.

4800 3120 руб.

14.01.2013    187987    1140    0    

912

SALE! 15%

Инструментарий разработчика Программист 8.3.14 1С:Конвертация данных Россия Платные (руб)

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

15000 12750 руб.

07.10.2021    17303    6    32    

42

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

Менеджер конфигураций 1С — альтернативный стартер информационных баз 1С:Предприятие.

1800 руб.

21.02.2023    7696    8    35    

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