Настраиваемый генератор числовой последовательности для запроса

08.05.16

Разработка - Запросы

В большинстве широко известных решений для генерации числовой последовательности в запросе порядок длины последовательности должен быть определен при написании текста запроса. Это вызывает определенные трудности при его модификации. Предлагается решение, свободное от этого недостатка. Решение ориентировано на модификацию запроса с использованием объекта "схема запроса".

Пусть имеется запрос следующего вида:

ВЫБРАТЬ 2*Х + У КАК Х ИЗ (ВЫБРАТЬ 0 КАК Х) А, (ВЫБРАТЬ 0 КАК У ОБЪЕДИНИТЬ ВЫБРАТЬ 1) Б

 

Запрос возвращает таблицу чисел:

     Х     
     0
     1

 

Ключевая особенность рассматриваемого запроса в том, что, подставив текст всего запроса  вместо вложенного запроса "А", можно получить запрос

ВЫБРАТЬ 2*Х + У КАК Х ИЗ (
ВЫБРАТЬ 2*Х + У КАК Х ИЗ (ВЫБРАТЬ 0 КАК Х) А, (ВЫБРАТЬ 0 КАК У ОБЪЕДИНИТЬ ВЫБРАТЬ 1) Б
) А, (ВЫБРАТЬ 0 КАК У ОБЪЕДИНИТЬ ВЫБРАТЬ 1) Б

возвращающий таблицу:

     Х     
     0
     1
     2
     3

и так далее, получая на каждом шаге таблицу вдвое больщего размера.

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

ИсходныйЗапрос.Операторы[0].Источники[0].Источник.Запрос.УстановитьТекстЗапроса(
		ИсходныйЗапрос.ПолучитьТекстЗапроса());

Вторым достоинством предлагаемого запроса является его самодостаточность: он не опирается ни на какие другие таблицы.

Число подстановок определяется формулой ]Ln(N) / Ln(2)[ - 1, где N- количество чисел (размер) последовательности, ][ - операция нахождения ближайшего сверху целого, а  Ln(N) / Ln(2) - формула для расчета логарифм по основанию два.

В итоге текст запроса генерации последовательности можно получить с помощью такого фрагмента кода:

	

СхемаЗапроса = Новый СхемаЗапроса;
ИсходныйЗапрос = СхемаЗапроса.ПакетЗапросов[0];
ИсходныйЗапрос.УстановитьТекстЗапроса(
	"ВЫБРАТЬ 2*Х + У Х ИЗ (ВЫБРАТЬ 0 Х) А, (ВЫБРАТЬ 0 У ОБЪЕДИНИТЬ ВЫБРАТЬ 1) Б"
);
Охват = 2;
Пока Охват < Количество Цикл
	ИсходныйЗапрос.Операторы[0].Источники[0].Источник.Запрос.УстановитьТекстЗапроса(
		ИсходныйЗапрос.ПолучитьТекстЗапроса());
	Охват = 2 * Охват
КонецЦикла;
ИсходныйЗапрос.Операторы[0].Отбор.Добавить("2*Х + У < &Количество");
ТекстЗапроса = ИсходныйЗапрос.ПолучитьТекстЗапроса()); 

На практике исходный запрос можно поместить сразу на фиксированное место в модифицируемый затем пакет запросов (потребуется решить вопрос очистки и последующего восстановления реквизита "ТаблицаДляПомещения").

Гибкость предложенной структуры еще и в том, что для генерации последовательности можно применять и другие, отличные от двойки основания. Например, для основания 5 исходный запрос будет иметь вид:

ВЫБРАТЬ 5*Х + У КАК Х
ИЗ (ВЫБРАТЬ 0 Х) А,
(ВЫБРАТЬ 0 У ОБЪЕДИНИТЬ ВЫБРАТЬ 1 ОБЪЕДИНИТЬ ВЫБРАТЬ 2 ОБЪЕДИНИТЬ ВЫБРАТЬ 3 ОБЪЕДИНИТЬ ВЫБРАТЬ 4) Б


Соответствующим образом изменится и число подстановок. Оно будет определяться формулой: ]Ln(N) / Ln(5)[ - 1.

Принцип, наверное, понятен.

Обычно на практике используются основания 2, 4, 5, 6, 10. Но все же предпочтительнее использовать основание 2.

Дело в том, что в этом случае достигается максимальная экономия холостых циклов: когда полученное декартовым произведением число отсекается затем условием ГДЕ. Например, при основании 10 ряд из 101-го числа может быть сформирован из множества чисел от 0 до 999, 899 из которых будет затем отброшено. В самом худшем случае для основания 2 при неудобном количестве из 513 чисел в последовательности из произведения размером 1024 записи будут отфильтрованы всего 511 чисел, то есть почти вдвое меньше.

Кроме того, при использовании основания 2 итоговая длина текста запроса оказывается короче как в символах, так и в строках.

Стоит, однако, сказать, что наименьшими затратами в плане количества соединений и холостых циклов отличается запрос генерации последовательности, формируемый функцией ProtoText, приведенной в статье [Порождающий запрос]. Его применение сдерживает принципиальное использование неизвестного заранее количества временных таблиц, из-за чего при вставке сгенерированного запроса в схему запроса "плывут" индексы всех следующих запросов в пакете.

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

ВЫБРАТЬ 2*Х + У КАК Х 
ИЗ (ВЫБРАТЬ 0 Х ОБЪЕДИНИТЬ ВЫБРАТЬ 1) А, (ВЫБРАТЬ 0 У ОБЪЕДИНИТЬ ВЫБРАТЬ 1) Б

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

 

Полезные ссылки:

Генерация числовой последовательности

Генерация числовой последовательности и последовательности дат при помощи языка запросов

Работаем с датами в запросе

Порождающий запрос 

Формирование списка дат в заданном диапазоне в тексте запроса

Некоторые полезные новичкам платформы 1С8.х приёмы работы с запросами - 2 часть (пример 7 Последовательность чисел, дат)

Порядковый номер в запросе (Новым простым способом)

Объектная модель запроса "Схема запроса" - теория и примеры использования

числовая последовательность числовой ряд в запросе генерация схема запроса

См. также

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

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

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

12000 руб.

02.09.2020    102099    565    385    

611

Начните уже использовать хранилище запросов

HighLoad оптимизация Запросы

Очень немногие из тех, кто занимается поддержкой MS SQL, работают с хранилищем запросов. А ведь хранилище запросов – это очень удобный, мощный и, главное, бесплатный инструмент, позволяющий быстро найти и локализовать проблему производительности и потребления ресурсов запросами. В статье расскажем о том, как использовать хранилище запросов в MS SQL и какие плюсы и минусы у него есть.

11.10.2023    13665    skovpin_sa    14    

82

Нахождение уникальных наборов строк таблицы запросом

Запросы Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

23.07.2023    5109    tormozit    79    

39

Модель запроса SQL

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

Следующее решение является развитием модели запроса 1С. В этой модели конструируется запрос на SQL с использованием таблиц БД на 1С и внешних источников. Можно использовать все типы запросов: выборка, изменение, удаление. В качестве источника данных можно указать таблицу значений. Работать с запросом SQL из 1С никогда еще не было так просто! :)

1 стартмани

22.06.2023    2757    kalyaka    8    

17

Структура запроса

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

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

1 стартмани

21.06.2023    4734    53    obmailok    35    

53

MS SQL Server: изучаем планы запросов

Запросы HighLoad оптимизация Запросы Бесплатно (free)

Многие знают, что для ускорения работы запроса нужно «изучить план». При этом сам план обычно обескураживает: куча разноцветных иконок и стрелочек; ничего не понятно, но очень интересно! Аналитик производительности Александр Денисов на конференции Infostart Event 2021 Moscow Premiere рассказал, как выполняется план запроса и что нужно сделать, чтобы с его помощью находить проблемы производительности.

20.06.2023    11004    Филин    37    

101

Как собрать отладчиком отдельные части запроса в один

Запросы Платформа 1С v8.3 Запросы Россия Бесплатно (free)

Подробное описание функционала загрузки данных запроса из отладчика в консоли "Анализатор сложных запросов".

21.03.2023    3898    manuel    2    

20
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. necropunk 9 10.05.16 12:27 Сейчас в теме
Отлично. Интересно, какие у вас на работе задачи, что требуют подобных изысканий... Как всегда прекрасный материал, спасибо.
2. ildarovich 7791 11.05.16 17:08 Сейчас в теме
Не сказал бы, что у меня на работе какие-то особенные задачи. Многие из них довольно скучные. Дело больше в желании найти красивое и эффективное решение практической задачи и полученном от этого удовольствии.

Lacoste4life; SerVer1C; Noxie41; necropunk; +4 Ответить
3. DrAku1a 1609 12.05.16 02:23 Сейчас в теме
(2) полагаю, вопрос надо задать немного по-другому: Как Вам удаётся находить такие красивые и сложные практические задачи?
К слову, Ваше имя - уже как знак качества: плюс статье так и хочется поставить ещё до начала чтения!
4. vasiliy_b 284 13.05.16 13:48 Сейчас в теме
Тоже увидел заголовок статьи и хотел уже было пройти мимо, но увидев автора, решил таки почитать, и не разочаровался. Спасибо.
5. Yashazz 4629 24.06.16 09:26 Сейчас в теме
Я чрезвычайно уважаю автора за стильность подхода к "сферическим решениям", но рад и видеть использование смешанных технологий. Я обычно практикую именно такие варианты - помесь хитрых запросов с их модификацией кодом или схемой. Похожее решение (вставку запроса как подзапроса) тоже использую, правда, иногда это становится малопрозрачным)))
Оставьте свое сообщение