Имя: Пароль:
1C
1С v8
Пагинатор для запроса: получение результата страницами
0 Asmody
 
15.02.18
11:18
Есть запрос, который возвращает 100500+ записей. Требуется получать результат порциями по N записей.
Вот как бы сделать такую красоту, не выполняя запрос каждый раз?
1 Ненавижу 1С
 
гуру
15.02.18
11:19
1. в 1С?
2. зачем?
2 Волшебник
 
модератор
15.02.18
11:19
Нужно упорядочить по полю и получать ПЕРВЫЕ N записей ГДЕ поле > значение
3 vde69
 
15.02.18
11:20
для этого есть "выборка", это динамический обьект и он считывает информацию по мере необходимости

или я не так понял?
4 Asmody
 
15.02.18
11:20
(1) В 1С. надо.
5 Ненавижу 1С
 
гуру
15.02.18
11:21
Тогда (2) и поле должно быть уникальным
6 Волшебник
 
модератор
15.02.18
11:23
(5) Не обязательно. Можно сделать условие ГДЕ поле > значение-1

В каждой порции данные будут немного повторяться, но главный результат будет достигнут
7 drcrasher
 
15.02.18
11:23
и остаётся вопрос: зачем?
8 Волшебник
 
модератор
15.02.18
11:24
На мисте так сделано
9 Philix
 
15.02.18
11:24
(5) и не меняться в результате обработки выборки первых N записей. Иначе можно погрузиться в вечную выборку одного и того же :)
10 Cyberhawk
 
15.02.18
11:25
(3) Откуда считывает?
11 arsik
 
гуру
15.02.18
11:26
(0) Динамический список
12 vde69
 
15.02.18
11:27
(10) с сервера
13 Asmody
 
15.02.18
11:27
Зачем-зачем. Есть внешний сервис, который дергает данные из 1С и делает нужное. Все 100500 записей разом ему не переварить, надо порциями.
14 бомболюк
 
15.02.18
11:28
1С так не умеет, она для динамических списков использует метод (2). ADO может что то похожее, называется AsyncFetch.
15 Cyberhawk
 
15.02.18
11:28
(12) Что за "сервер"? Судя по (0), ему хочется одним запросом к БД обойтись
16 Cyberhawk
 
15.02.18
11:29
(13) Пиши результат запроса в регистр, и пусть сервис потом дергает данные из регистра
17 Asmody
 
15.02.18
11:29
(15) Наоборот, я могу обойтись запросом на каждый вызов. Но я не хочу каждый раз тащить все записи.
18 Timon1405
 
15.02.18
11:30
а обращаться к БД без 1с можно?
https://technet.microsoft.com/ru-ru/library/gg699618(v=sql.110).aspx
19 vde69
 
15.02.18
11:30
(12) на сколько я понимаю результат хранится на сервере во временных файлах и по мере обращения к конкретным полям выборки происходит чтение соответствующих областей временных файлов
20 Asmody
 
15.02.18
11:31
(16) Из регистра записи тоже будут дергаться запросом. Тоже самое получится.
21 Cyberhawk
 
15.02.18
11:31
(20) Так в регистре будет срез всех данных на момент "большого" запроса. А потом уже порционное получение.
22 Cyberhawk
 
15.02.18
11:32
"обойтись запросом на каждый вызов. Но я не хочу каждый раз тащить все записи" // Так ты не знаешь как получать за каждый вызов порцию данных запросом, так что ли?
23 Asmody
 
15.02.18
11:33
(21) В этом случае еще надо будет мутить обновление данных в регистре, ослежвание считанных-несчитанных… Геморно
24 Cyberhawk
 
15.02.18
11:34
(23) Так почему у тебя за один вызов сервиса идет получение данных в большем объеме, чем ты хочешь за этот вызов отдать?
25 Asmody
 
15.02.18
11:35
(22) Видишь на главной мисты под списком тем циферки? Тык, получаю 20 записей, тык - следующие 20. При этом из базы тащится ровно те 20 записей, а не миллион. Вот такое мне надо, только в 1С.
26 Волшебник
 
модератор
15.02.18
11:36
(25) Попробуй пролистать дальше, поймёшь принцип
27 Asmody
 
15.02.18
11:36
Просто в mysql есть LIMIT N, M
28 Cyberhawk
 
15.02.18
11:36
(25) Так это зависит от самих данных в таблице же.
Что такое "следующие 20" - это ровно те, что шли бы после предыдущего получения данных или любые 20, отличающиеся от первых? Таблица упорядоченная?
29 vde69
 
15.02.18
11:37
(23) а так тебе надо гемороится с проверкой, что кто то не записал новую запись в ту часть которую ты уже прошел.

если надо быстро и ты допускаешь, что небольшая часть записей могут потеряться, то самое лучшее (2)

а если важно обработать все - то придется писать в базу "обработан"
30 Волшебник
 
модератор
15.02.18
11:39
(27) Просто он тоже тормозит, поэтому пришлось изобрести решение (2)
31 Asmody
 
15.02.18
12:04
Блин, нельзя использовать ВЫБРАТЬ ПЕРВЫЕ &КоличествоЗаписей...
32 Cyberhawk
 
15.02.18
12:08
(31) Регистр сведений и свой курсор как душе угодно )
33 Asmody
 
15.02.18
12:09
(32) это не stateless…
34 Cyberhawk
 
15.02.18
12:10
(33) Так что с (28)? Что будет "следующие N" с соблюдением твоего стейтлеса?
35 Остап Сулейманович
 
15.02.18
12:19
(34) А зачем вы вопросом на вопрос отвечаете?

Простейшая задача. Показывать на странице по 100 наименований из 25 000. Юзер ткнул в страничку, которая должна показать товар с 12700 по 12799.
Как? Не включая ненужные первые 12699 записей в выборку запроса?

ИМХО в 1С - только получив первые 12799. А потом из выборки забрав только последние 100.
36 Вафель
 
15.02.18
12:24
можно и запросом

выбрать первые 100
(ВЫБРАТЬ ПЕРВЫЕ 1000 ..)
Упорядочить по Поле УБЫВ
37 Asmody
 
15.02.18
12:31
Переосмыслил вариант (2). Теперь сервис будет спрашивать "дай N записей, начиная с ключа K". Только запрос должен быть с "первичным ключом". В моём случае это подходит.
38 Волшебник
 
модератор
15.02.18
12:31
(37) Ну слава богу. Я уж подумал, что выпал из реальности.
39 Вафель
 
15.02.18
12:32
(37) не ужто ты раньше этого не знал?
40 Asmody
 
15.02.18
12:55
(39) Знал. Хотелось меньшей кровью обойтись.
41 Cyberhawk
 
15.02.18
14:35
(35) "вопросом на вопрос отвечаете?" // Проспись что ли
42 Asmody
 
16.02.18
08:38
Кстати, способ (2) подходит только для прохода в одну сторону. Для прохода в другую сторону надо менять параметры и условия. Для полноценного пагинатора (т.е. доступа к "странице" данных по номеру) этот способ не подходит.
43 Mort
 
16.02.18
09:06
Data commander 3 это умеет
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.