Имя: Пароль:
1C
1С v8
Как выбрать запросе вторые x элементов.?
0 Antizdoba
 
22.05.12
17:08
Добрый день. Волнует такой вопрос. Как выбрать в запрос вторые, третьи ... x элементов.Например мне нужно разбить выборку из 15000 элементов на 3 части, чтоб в каждой транзакции обрабатывать по 5000 элементов. Как в запросе выбрать первые 5000 понятно. Как выбрать следующие 5000?
1 Maxus43
 
22.05.12
17:09
>>чтоб в каждой транзакции обрабатывать по 5000
что мешает? в таких случаях счетчик делают, и как 5 тыщ достигнет - фиксируем транзакцию, сбрасываем счетчик и начинаем новую
2 andrewks
 
22.05.12
17:10
выбрать 15 тыщ, и счётчик при обходе, не?
3 Antizdoba
 
22.05.12
17:11
В таком случае запрос сделает выборку по всем элементам и на время его выполнения заблокирует таблицы. Зачем мне выбирать вторые 5000, если при обработке первых 5000 может произойти ошибка.
4 andrewks
 
22.05.12
17:12
а выборка для изменения, что-ли?
5 Rovan
 
гуру
22.05.12
17:13
(0) очень просто
1. получаешь первые х элементов
2. обрабатываешь их
3. делаешь следующий запрос с условием
....ГДЕ НЕ Ссылка В (&МассивОбработанных)
6 Antizdoba
 
22.05.12
17:15
(5) На последних шагах МассивОбработанных будет очень большой, не будет ли такой запрос выполнятся дольше, чем просто выбрать все.
7 Maxus43
 
22.05.12
17:15
(5) легко то легко, но тормозно это
8 Maxus43
 
22.05.12
17:15
(6) в запросе ДЛЯ ИЗМЕНЕНИЯ делаеш?
9 Fragster
 
гуру
22.05.12
17:16
(6) но так работают списки в 1ске. это я профайлером смотрел
10 МишКа
 
22.05.12
17:19
Вторые:

ВЫБРАТЬ ПЕРВЫЕ 5000 Ссылка
ИЗ <>
ГДЕ НЕ (Ссылка В (ВЫБРАТЬ ПЕРВЫЕ 5000 Ссылка ИЗ <>))
11 Antizdoba
 
22.05.12
17:19
(8) Получаю данные для выгрузки в другую базу
12 andrewks
 
22.05.12
17:19
(10) незачёт
13 sivalor
 
22.05.12
17:20
(0) Разделяемая блокировка ставится только если запрос выполняется в транзакции, вложенных транзакций 1С не поддерживает.
14 Fragster
 
гуру
22.05.12
17:20
(10) только правильно отсортировать надо еще
15 Fragster
 
гуру
22.05.12
17:20
(13) бугагага
16 sivalor
 
22.05.12
17:21
(15) ?
17 Maxus43
 
22.05.12
17:21
(10) а потом третие и четвёртые понадобится... не красиво
18 МишКа
 
22.05.12
17:22
(17) Третьи и четвертые: очевидны.
19 Maxus43
 
22.05.12
17:23
(18) очевидны, я говорю что не красиво...
20 Fragster
 
гуру
22.05.12
17:24
(16) поддерживает
21 Fragster
 
гуру
22.05.12
17:24
косяк с ПЕРВЫЕ, что оно параметр не поддерживает
22 andrewks
 
22.05.12
17:24
(18) вот что совсем неочевидно, так это то, что 5001-й элемент сейчас будет 5001-м элементом через 3 секунды
23 sivalor
 
22.05.12
17:25
(20) Давно ли?
24 Fragster
 
гуру
22.05.12
17:25
(23) для 1с > 7.7
25 andrewks
 
22.05.12
17:26
(20) что в твоём понимании "поддерживает"?
26 Murzz
 
22.05.12
17:28
для вторых 5000 выбрать первые 10000, отсортировать их в обратном порядке и из этих 10000 выбрать первые 5000.
Но блин лучше по счсетчику всю выборку обрабатывай. через попу все это
27 andrewks
 
22.05.12
17:28
(20) даже не так: что в твоём понимании "вложенная транзакция"?
28 sivalor
 
22.05.12
17:28
(24) Отмена вложенной транзакции приводит к отмене всех вышестоящих, в 1С только при открытии вложенной транзакции лишь увеличивается счетчик транзакций.
29 Maxus43
 
22.05.12
17:28
(24)Предложение ДЛЯ ИЗМЕНЕНИЯ предназначено для указания необходимости блокировки считываемых в транзакции данных.
Блокировка снимается после завершения транзакции.

я хз что чего поддерживает, но для ИЗМЕНЕНИЯ только в рамках транзакции, иначе тупо не блокирует
30 Fragster
 
гуру
22.05.12
17:28
(25) я могу сделать запись одного документа из другого, причем запись верхнего не упадет, даже если упадет запись вложенного (если сделать обработку исключения)
31 Fragster
 
гуру
22.05.12
17:28
(28) если сделать обработку исключения, то нет
32 PR
 
22.05.12
17:29
(3) С рожна ли заблокирует?
А ты не блокируй.
33 Maxus43
 
22.05.12
17:30
(31) во второй раз упадёт в рамках той же транзакции
34 andrewks
 
22.05.12
17:30
(30) сам понял, чё сказал? если ты сделаешь обработку исключения, то она не упадёт
35 H A D G E H O G s
 
22.05.12
17:31
(7) Временную таблицу пользуйте.
36 Fragster
 
гуру
22.05.12
17:34
(34) кстати, я в (30) не прав. проверил только что с кодом
документ Д1:

Процедура ПриЗаписи(Отказ)
   Д2 = Документы.Д2.СоздатьДокумент();
   Попытка
       Д2.Записать();
   Исключение
       Сообщить("Отвалились");
   КонецПопытки;
КонецПроцедуры


Документ Д2:

Процедура ПриЗаписи(Отказ)
   ВызватьИсключение "";
КонецПроцедуры


Падает так:
http://s019.radikal.ru/i604/1205/d1/8ba3afcaee73.png
37 Fragster
 
гуру
22.05.12
17:35
а в документации 1с пишет про вложенные транзакции
38 PR
 
22.05.12
17:35
(37) Транзакции, а не попытки.
39 Никола_
Питерский
 
22.05.12
17:41
(37) Да ты шо правда что ль ???

Ахренеть, дайте две таких документации мне,а то я вот эту херь читаю ))
http://imglink.ru/show-image.php?id=ab1ac38e9a03e11bcc0f266e824db2b9
40 Fragster
 
гуру
22.05.12
17:53
(38) а д2.Записать() это что такое?
Один фиг при пустом модуле д2, а в д1
   НачатьТранзакцию();
   Д2 = Документы.Д2.СоздатьДокумент();
   Д2.Дата = Дата;
   Д2.Записать();
   ОтменитьТранзакцию();
падает точно так же.

(39) слова "вложенные транзакции" есть:
http://s019.radikal.ru/i611/1205/20/b6e5c1d8ed6b.png
41 Fragster
 
гуру
22.05.12
17:54
(39) ну, это ж ИТС, я его открываю только когда совсем не влом
42 Fragster
 
гуру
22.05.12
17:54
странная ошибка просто
43 Miffka
 
22.05.12
17:56
(0) Пришло на ум 2 способа:
1). Выборка вроде и так порциями подгружает, насколько помню. Типа .Следующий() и до свиданья (но не уверен)

2). Первый раз "Выбрать первые" с сортировкой по ссылке (или другому уникальному полю. Желательно, индексируемому). Обработали, берём последний элемент и делаем "выбрать первые ... где Ссылка > &Ссылка5000" и т.п. (с) стр. 721 "Не использовать запросы, результатом которых могут быть очень большие выборки" книги "Профессиональная разработка в системе 1С:Предприятие 8".
44 IKSparrow
 
22.05.12
17:57
Можно так:
ВЫБРАТЬ ПЕРВЫЕ 5000 Ссылка
ИЗ Тра-Ля-Ля

ВЫБРАТЬ ВТОРЫЕ 5000 Ссылка
ИЗ Тра-Ля-Ля

ВЫБРАТЬ ТРЕТЬИ 5000 Ссылка
ИЗ Тра-Ля-Ля
45 andrewks
 
22.05.12
20:22
(40) 2. про "вложенные транзакции" - имеется  в виду синтаксически, на уровне интерпретации кода. но сам интерпретатор не обрабатывает их как положено, а, по сути, практически игнорирует
46 ILM
 
гуру
22.05.12
22:42
(44) А ведь работает же)))