|   |   | 
| 
 | Как выбрать запросе вторые 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) А ведь работает же)))     | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |