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

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    207912    1142    413    

1036

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

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

8400 руб.

20.08.2024    37645    215    111    

202

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

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

16000 руб.

10.11.2023    17163    75    39    

90

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

Расширение для создания и редактирования печатных форм в системе 1С:Предприятие 8.3. Благодаря конструктору можно значительно снизить затраты времени на разработку печатных форм, повысить качество и прозрачность разработки, а также навести порядок в многообразии корпоративных печатных форм.

22200 руб.

06.10.2023    24885    65    28    

94

Инструментарий разработчика Программист 1С v8.3 1С:Управление нашей фирмой 3.0 Платные (руб)

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

9500 руб.

17.05.2024    35890    131    53    

173

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

Первые попытки разработки на 1С с использованием больших языковых моделей (LLM) могут разочаровать. LLMки сильно галлюцинируют, потому что не знают устройства конфигураций 1С, не знают нюансов синтаксиса. Но если дать им подсказки с помощью MCP, то результат получается кардинально лучше.<br/> Далее в публикации:<br/> MCP для поиска по метаданым 1С, справке синтакс-помошника и проверки синтаксиса.

9900 руб.

25.08.2025    694    2    4    

8

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

Разработка Конструктор автоматизированных рабочих мест "Конструктор АРМ" реализована в виде расширения и является универсальным инструментом для создания АРМ любой сложности в пользовательском режиме.

3600 руб.

27.12.2024    3078    7    0    

12
Для отправки сообщения требуется регистрация/авторизация