Имитация sql выражения LIMIT в запросе 1С

08.12.20

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

Всем известно, что в SQL синтаксисе есть выражение LIMIT. Очень полезное выражение для постраничной навигации. Но его нет в запросах 1С. Кто-то может сказать, что есть ПЕРВЫЕ, но ПЕРВЫЕ не подходит для постраничной навигации. Рассмотрим в статье, как можно имитировать LIMIT в запросах 1С.

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

ВЫБРАТЬ ПЕРВЫЕ 1000000
 Товары.Ссылка
ПОМЕСТИТЬ ВсеТовары
ИЗ
 Справочник.Номенклатура КАК Товары
УПОРЯДОЧИТЬ ПО
 Товары.Код
;
 
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ ПЕРВЫЕ 10
 ВсеТовары.Ссылка
ПОМЕСТИТЬ НачальнаяПозиция
ИЗ
 ВсеТовары КАК ВсеТовары
;
 
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ ПЕРВЫЕ 20
 ВсеТовары.Ссылка
ПОМЕСТИТЬ КонечнаяПозиция
ИЗ
 ВсеТовары КАК ВсеТовары
;
 
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
 КонечнаяПозиция.Ссылка
ИЗ
 КонечнаяПозиция КАК КонечнаяПозиция
  ЛЕВОЕ СОЕДИНЕНИЕ НачальнаяПозиция КАК НачальнаяПозиция
  ПО КонечнаяПозиция.Ссылка = НачальнаяПозиция.Ссылка
ГДЕ
 НачальнаяПозиция.Ссылка ЕСТЬ NULL

ВЫБРАТЬ ПЕРВЫЕ 1000000 — Это максимальное количество записей, которое может содержать наш справочник. Лучше взять с большим запасом, т. к. на скорости запроса это не скажется. Выражение ПЕРВЫЕ мы тут используем для того, чтобы появилась возможность упорядочивания во временной таблице.

А без упорядочивания мы будем получать список с набором случайных данных

ВЫБРАТЬ ПЕРВЫЕ 10 — это начальный элемент, с которого мы хотим начать выборку

ВЫБРАТЬ ПЕРВЫЕ 20 — это конечный элемент, до которого мы хотим сделать выборку.

Таким образом мы получим с 11 по 20 записи из справочника «Номенклатура».

1C запрос SQL LIMIT

См. также

SALE! 20%

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

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

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

10000 10400 руб.

02.09.2020    122287    673    389    

716

Для чего используют конструкцию запроса "ГДЕ ЛОЖЬ" в СКД на примере конфигурации 1С:ERP

Запросы СКД Платформа 1С v8.3 Запросы Система компоновки данных 1С:ERP Управление предприятием 2 Бесплатно (free)

В типовых конфигурациях разработчики компании 1С иногда используют в отчетах, построенных на СКД, такую конструкцию, как "ГДЕ ЛОЖЬ". Такая конструкция говорит о том, что данные в запросе не будут получены совсем. Для чего же нужен тогда запрос?

13.02.2024    5755    KawaNoNeko    23    

23

Набор-объект для СКД по тексту или запросу

Запросы СКД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Есть список полей в виде текста, или запрос - закидываем в набор СКД.

1 стартмани

31.01.2024    2006    2    Yashazz    0    

29

Запрос 1С copilot

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

Пишем на человеческом языке, что нам надо, и получаем текст запроса на языке 1С. Используются большие языковые модели (LLM GPT) от OpenAI или Яндекс на выбор.

5 стартмани

15.01.2024    6300    31    mkalimulin    25    

50

PrintWizard: поддержка представлений ЗУП в конструкторе

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

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

14.12.2023    1749    vandalsvq    7    

29

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

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

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

06.12.2023    5397    user1923546    26    

43

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

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

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

11.10.2023    16197    skovpin_sa    14    

98
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. mcgoblin 3 08.12.20 08:26 Сейчас в теме
По-моему у если связь сделать Ссылка <> Ссылка
То можно избавиться от ГДЕ
36. kamisov 150 13.12.20 11:04 Сейчас в теме
(1) по <> индекс работать не будет
user1503726; +1 Ответить
2. opx 794 08.12.20 09:18 Сейчас в теме
(1) Там есть связь Ссылка = Ссылка
Конструкция ГДЕ НачальнаяПозиция.Ссылка ЕСТЬ NULL используется для того, чтобы выбрать те записи, которые есть в КонечнаяПозиция, но нет в НачальнаяПозиция
user1503726; +1 Ответить
3. mcgoblin 3 08.12.20 09:21 Сейчас в теме
(2)А если подумать? посмотереть с другой стороны, так сказать
Если сделать связь Сcылка <> Сcылка Тогда
сразу попадают только те записи, которые есть в конечной. но нет в начальной.
Иначе
попадают все записи, и надо среди них делать отбор
КонецЕсли;
4. opx 794 08.12.20 09:24 Сейчас в теме
(3) Да. Так тоже будет отрабатывать, но намного дольше
5. mcgoblin 3 08.12.20 09:26 Сейчас в теме
(4)С каких пор запрос с условием ГДЕ работает быстрее чем без условия?
Можете предоставить замеры скорости запросов при первом запуске?
6. opx 794 08.12.20 09:30 Сейчас в теме
(5) С запросом "ГДЕ" - отрабатывает не дольше 0,5 сек на базе с кол-ом товаров 150000.
С запросом Ссылка <> Ссылка не смогу, наверное предоставить, т.к. база уже 2 минуты пытается его отработать
9. mcgoblin 3 08.12.20 10:04 Сейчас в теме
(6) Не знаю, что вы там такого сделали, но специально создал базу с ноля, создал справочник на 250К элементов и сделал запрос.
Результат запросов в миллисекундах
Прикрепленные файлы:
10. opx 794 08.12.20 10:05 Сейчас в теме
(9) Сделайте выборку с 150 000 по 150 020 элемент
11. mcgoblin 3 08.12.20 10:22 Сейчас в теме
(10)Признаю, на больших цифрах замеры показали что с где отработало быстрее со средним превосходством на 20-30%
Dmitri93; opx; +2 1 Ответить
12. mcgoblin 3 08.12.20 10:30 Сейчас в теме
(10) Тогда другое предложение по улучшению

ВЫБРАТЬ ПЕРВЫЕ "Конечная Позиция"
	Товары.Ссылка КАК Ссылка,
	Товары.Код КАК Код
ПОМЕСТИТЬ ВсеТовары
ИЗ
	Справочник.Справочник1 КАК Товары

УПОРЯДОЧИТЬ ПО
	Код
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ ПЕРВЫЕ "Сколько записей отобрать"
	ВсеТовары.Ссылка КАК Ссылка,
	ВсеТовары.Код КАК Код
ИЗ
	ВсеТовары КАК ВсеТовары

УПОРЯДОЧИТЬ ПО
	Код УБЫВ
Показать


Скорость работы такого запроса
Прикрепленные файлы:
rusmil; user1503726; +2 Ответить
13. opx 794 08.12.20 10:32 Сейчас в теме
(12) Как в таком решении выбрать элементы с 100 по 120?
14. mcgoblin 3 08.12.20 10:34 Сейчас в теме
(13)Указываете конечное значение и сколько элементов надо.

я уже поправил текст запроса
15. opx 794 08.12.20 10:36 Сейчас в теме
(14) Не заметил "Код УБЫВ"
Отличное решение
22. opx 794 08.12.20 20:32 Сейчас в теме
(14) только одна проблема остаётся: не получается определить, что список пуст (по сравнению с limit). Подскажите как это сделать?
29. mcgoblin 3 09.12.20 06:51 Сейчас в теме
(22) Я тут прочитал, что ниже писали.
И в принципе у меня таже идея, что бы не вылазить за пределы количества, сначала эти пределы надо определить,
Если список выходит за эти пределы, то просто не выполнять.
И организовать переход от страницы к странице.
В принципе лимит в первую очередь для этого и используется
user1503726; +1 Ответить
7. wowik 885 08.12.20 09:41 Сейчас в теме
Методы Выборки 1С 8.3:
Получить() — с помощью метода можно можно установить курсор на нужной записи по значению индекса. - https://programmist1s.ru/vyiborka-v-1s/

С помощью метода Получить() не получится все это сделать?
8. opx 794 08.12.20 09:43 Сейчас в теме
(7) Способов это сделать кодом очень много, но вот запросом - я не встречал
16. capitan 2466 08.12.20 19:40 Сейчас в теме
Что то подозрительно.
1. Однозначно нет смысла выбирать весь справочник если надо до 40 элемента только, т.е. выбрать первые 40
2. Выбрать первые 20 из нее же и получить максимум по полю сортировки в данном случае по коду
3. Свернуть эти таблицы и выбрать те у которых код будет больше максимума по 20
4. Профит
user1503726; +1 Ответить
17. opx 794 08.12.20 19:43 Сейчас в теме
(16) не очень понятно. Можете код запроса показать?
18. capitan 2466 08.12.20 19:44 Сейчас в теме
(17)Расписал подробнее, а запрос писать лень. Извините.
19. opx 794 08.12.20 19:46 Сейчас в теме
(18) ну ок. В вашем запросе смысла больше. Просто его не видно никому
23. capitan 2466 08.12.20 20:47 Сейчас в теме
(19)Согласен. Сказал ё, скажи и б
ВЫБРАТЬ ПЕРВЫЕ 40
	Номенклатура.Ссылка КАК Номенклатура,
	Номенклатура.Код КАК Код
ПОМЕСТИТЬ вт40
ИЗ
	Справочник.Номенклатура КАК Номенклатура

УПОРЯДОЧИТЬ ПО
	Код
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ ПЕРВЫЕ 20
	вт40.Номенклатура КАК Номенклатура,
	вт40.Код КАК Код
ПОМЕСТИТЬ вт20
ИЗ
	вт40 КАК вт40

УПОРЯДОЧИТЬ ПО
	Код
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ ПЕРВЫЕ 1
	МАКСИМУМ(вт20.Код) КАК Код
ПОМЕСТИТЬ вт1
ИЗ
	вт20 КАК вт20
;

////////////////////////////////////////////////////////////­////////////////////
УНИЧТОЖИТЬ вт20
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	вт40.Номенклатура КАК Номенклатура,
	вт40.Код КАК Код
ИЗ
	вт40 КАК вт40
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ вт1 КАК вт1
		ПО вт40.Код >= вт1.Код
Показать
user1503726; +1 Ответить
25. opx 794 08.12.20 21:26 Сейчас в теме
(23) Отличный пример. На коротких дистанциях (выборка из начала) выигрывает у моего запроса 0,05 сек. стабильно. На выборке из конца списка - выравниваются.
Только Ваш надо ещё немного допилить, чтобы пустую выбору показывал при достижении конца списка (как limit в sql)
26. capitan 2466 08.12.20 21:30 Сейчас в теме
(25)Это логично, потому что под конец списка он тоже тянет всю таблицу, что не хорошо.
Хорошо - переворачивать с середины и сортировать по убыванию
На самом деле здесь же можно загуглить как добавить счетчик в запрос и это спасет отца русской демократии - можно будет выбирать по условию между
user1503726; opx; +2 Ответить
27. capitan 2466 08.12.20 21:37 Сейчас в теме
(26)
как добавить счетчик в запрос

ВЫБРАТЬ
    Номенклатура.Ссылка КАК Номенклатура,
    КОЛИЧЕСТВО(Номенклатура_1.Ссылка) КАК Номер
ИЗ
    Справочник.Номенклатура КАК Номенклатура
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура_1
        ПО Номенклатура.Наименование >= Номенклатура_1.Наименование      // Условие сортировки для нумерации

СГРУППИРОВАТЬ ПО
    Номенклатура.Ссылка

УПОРЯДОЧИТЬ ПО
    Номенклатура.Наименование
Показать


меряйте скорость
28. opx 794 08.12.20 22:00 Сейчас в теме
(27) Нет. Так медленнее в разы. Ну или я что-то не так понял
user1503726; +1 Ответить
20. user1503726 08.12.20 20:27 Сейчас в теме
Следующий вопрос - как в динамическом списке определить текущий номер строки, начальный номер строки на экране и количество строк экрана.
И передать все это параметрами.
21. opx 794 08.12.20 20:30 Сейчас в теме
(20) Статья не про динамические списки. Да и временные таблицы в динамических списках нельзя. Но если Вы тут расскажите - будет здорово
user1503726; +1 Ответить
24. capitan 2466 08.12.20 20:50 Сейчас в теме
(20)На самом деле в динамическом списке тоже все взлетит этим запросом, если сразу ограничить сколько элементов в странице и сделать кнопку листания вперед назад,например как в этом примере +- 20
user1503726; +1 Ответить
30. Dragonim 139 09.12.20 07:51 Сейчас в теме
Расскажите пожалуйста, для общего развития, где может понадобиться подобный запрос и какую задачу он решает?
31. user1503726 09.12.20 08:08 Сейчас в теме
(30) Смотря какой запрос вы имеете ввиду. В моем случае это запоздавшее на несколько десятков лет обоснование покупки нового сервера для руководителя (поскольку последний запрос в обсуждении это роль бегунка в полосе прокрутки для гуидов вообще и обычных/управляемых форм в частности).
32. Dragonim 139 09.12.20 08:28 Сейчас в теме
(31) Извините, не понял.

Вы не могли получить данные ограничивая дату?
33. opx 794 09.12.20 09:32 Сейчас в теме
(30) Решает вопрос порционного получения данных. Например, чтобы сделать http сервис и выводить список номенклатуры с пагинацией
Или для того, чтобы выгружать номенклатуру куда-либо частями, а не за раз 200К элементов
user1503726; +1 Ответить
37. triviumfan 93 14.12.20 17:22 Сейчас в теме
(33)
чтобы сделать http сервис и выводить список номенклатуры с пагинацией

Разве не достаточно хранить код последнего элемента текущей страницы (или номер самой страницы) и получать следующую порцию так?
Выбрать ПЕРВЫЕ <КоличествоНаСтранице> 
Ссылка 
Из 
Справочник.Номенклатура Где Код > &Код

Или для того, чтобы выгружать номенклатуру куда-либо частями, а не за раз 200К элементов

Сие решение также "избыточно".
Manoshkin; +1 Ответить
34. DrAku1a 1679 12.12.20 19:41 Сейчас в теме
35. opx 794 12.12.20 21:02 Сейчас в теме
(34) Так, как в приведенной статье не получится. Это было первое, что я попробовал, но увы
38. Ivon 673 13.01.21 10:55 Сейчас в теме
Для новичков пойдет. А так уже около 5 лет использую данную конструкцию для постраничного вывода. Кстати, сортировку можно делать не только по коду, но и по ссылке.
39. opx 794 13.01.21 10:56 Сейчас в теме
(38) Я пробовал по ссылке сортировать, но по какой-то причине после выборки 70К записей сортировка по ссылке переставала работать
40. Ivon 673 13.01.21 11:03 Сейчас в теме
(39) Значит вам не повезло.
41. malikov_pro 1292 16.02.21 22:46 Сейчас в теме
(32) Проблема при использовании пагинации в том что данные на последующей странице при повторном запросе могут изменится и вариант как делить на страницы зависит от того как эти данные меняются. Интересный пример в RetailCRM API, сначала читаешь историю изменений с отбором по дате, после выбираешь нужные операции и id заказов, после считываешь заказ по id.
42. ivanov660 4332 28.06.21 12:20 Сейчас в теме
Зачем так сложно? Вообще выглядит ужасно.

1. Первая сортировка по Наименованию (или любому полю)
2. Вторая по ссылке (последняя всегда)
3. Сохраняем всегда значения последней ссылки и наименования при листании.
4. В условии равно для наименования нужно из-за наличия возможных дублей.

ВЫБРАТЬ ПЕРВЫЕ 10
	Т.Ссылка КАК Ссылка,
	Т.Наименование КАК Наименование
ИЗ
	Справочник.Номенклатура КАК Т
	
где 
Т.Ссылка>&Cсылка
 и 
 Т.Наименование>=&Наименование
 
УПОРЯДОЧИТЬ ПО
	Наименование,
	Ссылка
Показать
43. itema 11.09.21 15:27 Сейчас в теме
А с документами такая схема не работает.
Например, если заменить на документ счет на оплату, то при нескольких выполнениях запроса, могут получаются разные наборы данных.
ВЫБРАТЬ ПЕРВЫЕ 1000000
	СчетНаОплатуПокупателю.Ссылка КАК Ссылка
ПОМЕСТИТЬ ВсеТовары
ИЗ
	Документ.СчетНаОплатуПокупателю КАК СчетНаОплатуПокупателю

УПОРЯДОЧИТЬ ПО
	Ссылка
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ ПЕРВЫЕ 10
	ВсеТовары.Ссылка
ПОМЕСТИТЬ НачальнаяПозиция
ИЗ
	ВсеТовары КАК ВсеТовары
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ ПЕРВЫЕ 20
	ВсеТовары.Ссылка
ПОМЕСТИТЬ КонечнаяПозиция
ИЗ
	ВсеТовары КАК ВсеТовары
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	КонечнаяПозиция.Ссылка
ИЗ
	КонечнаяПозиция КАК КонечнаяПозиция
		ЛЕВОЕ СОЕДИНЕНИЕ НачальнаяПозиция КАК НачальнаяПозиция
		ПО КонечнаяПозиция.Ссылка = НачальнаяПозиция.Ссылка
ГДЕ
	НачальнаяПозиция.Ссылка ЕСТЬ NULL
Показать
44. opx 794 11.09.21 16:22 Сейчас в теме
(43) с документами все ещё проще.
Надо сортировку по дате использовать в первой временной таблице
45. itema 11.09.21 16:23 Сейчас в теме
(44) Пробовал, не работает
46. itema 11.09.21 16:24 Сейчас в теме
(44) Все равно если выполнить запрос несколько раз документы будут в разном порядке
47. itema 11.09.21 18:00 Сейчас в теме
ВЫБРАТЬ ПЕРВЫЕ 1000000
СчетНаОплатуПокупателю.Ссылка КАК Ссылка
ПОМЕСТИТЬ ВсеТовары
ИЗ
Документ.СчетНаОплатуПокупателю КАК СчетНаОплатуПокупателю

УПОРЯДОЧИТЬ ПО
Дата
;
48. opx 794 13.09.21 09:58 Сейчас в теме
(47) Действительно.
Работает только если упорядочить по дате во второй и третьей временной таблице
49. opx 794 13.09.21 09:59 Сейчас в теме
(47) И в результирующе таблице тоже нужен порядок
50. opx 794 13.09.21 10:03 Сейчас в теме
Вот так надо делать для документов

ВЫБРАТЬ ПЕРВЫЕ 1000000
	СчетНаОплатуПокупателю.Ссылка КАК Ссылка,
	СчетНаОплатуПокупателю.Дата,
	СчетНаОплатуПокупателю.Номер
ПОМЕСТИТЬ ВсеТовары
ИЗ
	Документ.СчетНаОплатуПокупателю КАК СчетНаОплатуПокупателю

УПОРЯДОЧИТЬ ПО
	СчетНаОплатуПокупателю.Ссылка
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ ПЕРВЫЕ 10
	ВсеТовары.Ссылка КАК Ссылка
ПОМЕСТИТЬ НачальнаяПозиция
ИЗ
	ВсеТовары КАК ВсеТовары

УПОРЯДОЧИТЬ ПО
	ВсеТовары.Дата,
	ВсеТовары.Номер
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ ПЕРВЫЕ 20
	ВсеТовары.Ссылка КАК Ссылка,
	ВсеТовары.Дата,
	ВсеТовары.Номер
ПОМЕСТИТЬ КонечнаяПозиция
ИЗ
	ВсеТовары КАК ВсеТовары

УПОРЯДОЧИТЬ ПО
	ВсеТовары.Дата,
	ВсеТовары.Номер
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	КонечнаяПозиция.Ссылка КАК Ссылка
ИЗ
	КонечнаяПозиция КАК КонечнаяПозиция
		ЛЕВОЕ СОЕДИНЕНИЕ НачальнаяПозиция КАК НачальнаяПозиция
		ПО КонечнаяПозиция.Ссылка = НачальнаяПозиция.Ссылка
ГДЕ
	НачальнаяПозиция.Ссылка ЕСТЬ NULL

УПОРЯДОЧИТЬ ПО
	КонечнаяПозиция.Дата,
	КонечнаяПозиция.Номер
Показать
51. 1cprogr_nsk 106 06.11.22 17:43 Сейчас в теме
В прикладных решениях, для чего это всё нужно? сложно представить...
Оставьте свое сообщение