Пакетная выборка данных

25.09.25

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

Когда в методе вызываются несколько десятков запросов и хочется все это выполнить быстрее, мы используем обработку "Пакетная выборка данных" для выполнения множества запросов за одну sql команду.

Файлы

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

Наименование Скачано Купить файл
Пакетная выборка данных
.zip 11,01Kb
0 1 850 руб. Купить

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

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

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

Друзья, в обработке реализовано:

  •  Добавление и выполнение запросов в обычном / привилегированном режиме

В Заметках из Зазеркалья есть публикация, что платформа 8.5 начнет поддерживать пакетную обработку запросов. Теперь когда мы описываем пакетный запрос, есть шансы что это будет выполнено за 1 обращение к СУБД, а не как сейчас, 1 обращение на каждый пакет.

Но пока наши продуктивные базы не перешли на новую версию платформы, можно применить альтернативный подход - взять все пакеты с выборкой и соединить в 1 запрос через "ОБЪЕДИНИТЬ ВСЕ".

Чтобы реализовать данный подход в этом решении используется комбинация взаимодействия 2ух объектов / обработок:

- Обработка "Дескриптор выборки". Служит обеткой для функции выполняющий запрос данных, с возможностью модификации как самого запроса, так и преобразованием результата. На входе принимает запрос, а на выходе отдает результат. "Дескриптор выборки" - это замена функции описанной по типу:

Функция СсылкаСуществует(ПроверяемаяСсылка)

	// Проверили параметры, возможен возврат без выполнения запроса

	// Проверили параметры, модифицировали текст запроса

	// Создали / выполнили запрос

	// Обработали результат

	Возврат Результат;

КонецФункции

 - Обработка "Пакетная выборка данных". На входе принимает обработки "Дескриптор выбоки", объединяет их в коллеции и формирует единый запрос, а на выходе отдает результат общей выборки распределенный по дескрипторам выборки.

 

Рассмотрим подробнее реализацию на примере:

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

Контейнер вывода - это структура, соответствие или объект в свойства/реквизиты которых необходимо установить результат выполнения определенного дескриптора выборки. 

	// Определим контейнер вывода
	СвойстваИКоллекции = Новый Структура;

	// Инициализируем пакетную выборку
	ПакетнаяВыборкаДанных = Обработки.сп_ПакетнаяВыборкаДанных.Инициализировать();
	ПакетнаяВыборкаДанных.КонтейнерВыводаУстановить(СвойстваИКоллекции);

2. Добавим в пакет получение результата функции РаботаСФайламиСлужебный.ФайлРедактируетсяВОблаке.

Функция имеет следующий вид:

// РаботаСФайламиСлужебный
Функция ФайлРедактируетсяВОблаке(Файл)
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ ПЕРВЫЕ 1
		|	СтатусыСинхронизацииФайловСОблачнымСервисом.Файл
		|ИЗ
		|	РегистрСведений.СтатусыСинхронизацииФайловСОблачнымСервисом КАК СтатусыСинхронизацииФайловСОблачнымСервисом
		|ГДЕ
		|	СтатусыСинхронизацииФайловСОблачнымСервисом.Файл = &Файл";
	
	Запрос.УстановитьПараметр("Файл", Файл);
	
	РезультатЗапроса = Запрос.Выполнить();
	
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	
	Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
		Возврат Истина;
	КонецЦикла;
	
	Возврат Ложь;
	
КонецФункции

Чтобы иметь возможность использовать данную функцию в пакетной выборке её необходимо модифицировать. Добавим новый общий модуль "РаботаСФайламиСлужебныйПакетнаяВыборка" и выполним адаптацию функции под использование дескриптора выбоки.

// РаботаСФайламиСлужебный
Функция ФайлРедактируетсяВОблаке(Файл) Экспорт

	// Создадим дескриптор
	Дескриптор = РаботаСФайламиСлужебныйПакетнаяВыборка.ФайлРедактируетсяВОблаке_ДескрипторСоздать();

	// Заполним параметры
	Дескриптор.Параметры.Вставить("Файл", Файл);

	// Сформируем результат 
	Результат = Дескриптор.Исполнить();
	Возврат Результат;
	
КонецФункции

// РаботаСФайламиСлужебныйПакетнаяВыборка
Функция ФайлРедактируетсяВОблаке_ДескрипторСоздать() Экспорт

	//
	ЗапросТекст = 
		"ВЫБРАТЬ ПЕРВЫЕ 1
		|	СтатусыСинхронизацииФайловСОблачнымСервисом.Файл КАК Файл
		|{ВЫБРАТЬ
		|	Файл}
		|ИЗ
		|	РегистрСведений.СтатусыСинхронизацииФайловСОблачнымСервисом КАК СтатусыСинхронизацииФайловСОблачнымСервисом
		|ГДЕ
		|	СтатусыСинхронизацииФайловСОблачнымСервисом.Файл = &Файл_ИдентификаторДескриптора";

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

	ДескрипторВыборки = Обработки.сп_ДескрипторВыборки.Инициализировать(Запрос);
	ДескрипторВыборки.ОбработчикПослеВыводаДанныхУстановить("ОбработчикПослеВыводаДанныхРезультатНеПустой");

	Возврат ДескрипторВыборки;

КонецФункции

 

Обратите внимание на изменение в тексте запроса, обязательно нужно:

а) Поля выборки добавить в поля построителя

б) Добавить постфикс "_ИдентификаторДескриптора" ко всем параметрам и временным таблицам

По умолчанию, результат дескриптора выборки  - это запрос выгруженный в таблицу значений. Если необходимо дополнительно обработать результат, нужно использовать обработчики "ПередВводомДанных" или "ПослеВыводаДанных". 

Полученную функцию теперь можно использовать в пакетной выборке данных. Добавим её в контейнер вывода, с указанием адреса размещения результата - "РедактируетсяВОблаке".  

	// РедактируетсяВОблаке
	ДескрипторВыборки = РаботаСФайламиСлужебныйПакетнаяВыборка.ФайлРедактируетсяВОблаке_ДескрипторСоздать();
	ДескрипторВыборки.Параметры.Вставить("Файл", Файл);
	
	ПакетнаяВыборкаДанных.Добавить(ДескрипторВыборки, "РедактируетсяВОблаке");

3. Добавим в пакетную выборку поизвольный запрос

	// КоличествоВложений
	ЗапросТекст =
		"ВЫБРАТЬ
		|	КОЛИЧЕСТВО(1) КАК КоличествоВложений
		|{ВЫБРАТЬ
		|	КоличествоВложений}
		|ИЗ
		|	Справочник.Файлы КАК Файлы
		|ГДЕ
		|	Файлы.ВладелецФайла = &ВладелецФайла_ИдентификаторДескриптора
		|	И НЕ Файлы.ПометкаУдаления";

	Запрос = Новый Запрос(ЗапросТекст);
	Запрос.УстановитьПараметр("ВладелецФайла", ВладелецФайла);

	ДескрипторВыборки = Обработки.сп_ДескрипторВыборки.Инициализировать(Запрос);
	ПакетнаяВыборкаДанных.Добавить(ДескрипторВыборки, "*");

В качестве адреса размещения результата указали "*" - это означает что все колонки последней строки выборки будут установлены в контейнер вывода. В нашем случае в стуктуру "СвойстваИКоллекции", будет добавлен новый ключ "КоличествоВложений" со значением из последней строки в колонке "КоличествоВложений".

 

4. Заключение

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

	//
	СвойстваИКоллекции = Новый Структура;

	// Инициализируем пакетную выборку
	ПакетнаяВыборкаДанных = Обработки.сп_ПакетнаяВыборкаДанных.Инициализировать();
	ПакетнаяВыборкаДанных.КонтейнерВыводаУстановить(СвойстваИКоллекции);

	// РедактируетсяВОблаке
	ДескрипторВыборки = сп_НесоответствияПакетнаяВыборка.ФайлРедактируетсяВОблаке_ДескрипторСоздать();
	ДескрипторВыборки.Параметры.Вставить("Файл", Файл);
	
	ПакетнаяВыборкаДанных.Добавить(ДескрипторВыборки, "РедактируетсяВОблаке");
	
	// КоличествоВложений
	ЗапросТекст =
		"ВЫБРАТЬ
		|	КОЛИЧЕСТВО(1) КАК КоличествоВложений
		|{ВЫБРАТЬ
		|	КоличествоВложений}
		|ИЗ
		|	Справочник.Файлы КАК Файлы
		|ГДЕ
		|	Файлы.ВладелецФайла = &ВладелецФайла_ИдентификаторДескриптора
		|	И НЕ Файлы.ПометкаУдаления";

	Запрос = Новый Запрос(ЗапросТекст);
	Запрос.УстановитьПараметр("ВладелецФайла", ВладелецФайла);

	ДескрипторВыборки = Обработки.сп_ДескрипторВыборки.Инициализировать(Запрос);
	ПакетнаяВыборкаДанных.Добавить(ДескрипторВыборки, "*");
	
	// Выполним пакетную выборку данных и заполним контейнер вывода
	ПакетнаяВыборкаДанных.Исполнить()

Текст запроса, который будет выполнен:

	"ВЫБРАТЬ
	|	NULL КАК Поле0,
	|	NULL КАК ИдентификаторВыборки
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ ПЕРВЫЕ 1
	|	СтатусыСинхронизацииФайловСОблачнымСервисом.Файл,
	|	""0590fab2d98d4b3f870ee5c2accb3c73""
	|ИЗ
	|	РегистрСведений.СтатусыСинхронизацииФайловСОблачнымСервисом КАК СтатусыСинхронизацииФайловСОблачнымСервисом
	|ГДЕ
	|	СтатусыСинхронизацииФайловСОблачнымСервисом.Файл = &Файл_0590fab2d98d4b3f870ee5c2accb3c73
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ
	|	КОЛИЧЕСТВО(1),
	|	""2fc374c8272e46b58cf0d23b4df7b185""
	|ИЗ
	|	Справочник.Файлы КАК Файлы
	|ГДЕ
	|	Файлы.ВладелецФайла = &ВладелецФайла_2fc374c8272e46b58cf0d23b4df7b185
	|	И НЕ Файлы.ПометкаУдаления"

 

Что в итоге мы имеем:

1. Замеры времени выполнения показали -10%  на не нагруженной тестовой базе при выполнении пакетной выборки из 18 коротких запросов. В абсолютном значении - это 0,014 сек. ;)

2. Как минимум еще одна причина, по которой запрос уже давно пора обернуть в обработку и не обращаться к нему напрямую.

3. Отличный повод провести рефакторинг, еще -40% чисто исправили старые ошибки.

 

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

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

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

 

 -----

Требования:

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

 

-----

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

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

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

Вступайте в нашу телеграмм-группу Инфостарт

Оптимизация запросов Выборка данных Запросы

См. также

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

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

15500 руб.

02.09.2020    214930    1182    413    

1051

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

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

8400 руб.

20.08.2024    41681    230    117    

215

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

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

22200 руб.

06.10.2023    27024    69    30    

98

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

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

16000 руб.

10.11.2023    19162    76    39    

92

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

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

9500 руб.

17.05.2024    38338    137    55    

178

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

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

9900 руб.

25.08.2025    5038    8    10    

16

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

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

5000 руб.

27.12.2024    3834    7    0    

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