|   |   | 
| 
 | Быстрая модификация большого регистра сведений | ☑ | ||
|---|---|---|---|---|
| 0
    
        Вик72 14.11.18✎ 15:46 | 
        Есть большой регистр сведений. У него два измерения - "Документ" и "ИДСтроки". ИДСтроки все уникальные. Для одного документа может быть, например, 50000 строк. Задача - для некоторых ИДСтроки нужно будет перезаписывать значения реквизитов. Сложность в том, что количество изменяемых строк бывает разное - как 10 строк из 50000, так и 1000, или даже все 50000 строк. Если нужно обработать много строк, то  алгоритм очевиден: делаем читаем НаборЗаписей с отбором Документ, получаем эти 50000 записей, перебираем их в цикле и записываем набор: 
 
Если обрабатываемых строк мало, то читаем и записываем построчно. 
Проблема возникает, когда нужно модифицировать 100 строк, потому что если читать и записывать набор записей построчно по ИдСтроки (даже в транзакции), скорость работы получается медленнее, чем если прочитать и записать все 50000 строк через один набор записей. Можно ли как-нибудь сделать этот процесс быстрее? Если было бы можно читать набор записей через отбор "ВСписке", это бы решило проблему: 
Но, к сожалению, "ВидСравнения" для набора записей может быть только "Равно", поэтому ради записи 100 строк из 50000, приходится читать и записывать все 50000 строк, получается, ресурсы на 49900 строк тратятся впустую. Не могу придумать, как это сделать быстрее (прямая запись в SQL не подходит) | |||
| 1
    
        Волшебник 14.11.18✎ 15:48 | 
        Пользуйся МенеджерЗаписи и убери транзакцию     | |||
| 2
    
        Михаил Козлов 14.11.18✎ 16:05 | 
        Можно попробовать "разбить" массив ИД-ов на группы по наборам (документов). 
 Если в группе мало записей - через менеджер записи, если много - через набор записей (например все ИД-ы из одного набора).. | |||
| 3
    
        H A D G E H O G s 14.11.18✎ 16:08 | 
        (0) МенеджерЗаписи - это НаборЗаписей с 1 Записью и ОбменДанными=Истина.     | |||
| 4
    
        H A D G E H O G s 14.11.18✎ 16:08 | 
        (0) Никак.     | |||
| 5
    
        H A D G E H O G s 14.11.18✎ 16:09 | 
        Есть извращенный вариант, но вам он не подойдет     | |||
| 6
    
        Tonik992 14.11.18✎ 16:14 | 
        (3) И с двумя запросами в СУБД, на Удаление и на Вставку     | |||
| 7
    
        H A D G E H O G s 14.11.18✎ 16:17 | 
        (6) НаборЗаписей в режиме ОбменДанными делает только вставку. Но это автору не сильно поможет     | |||
| 8
    
        NuclearWinter 14.11.18✎ 16:25 | ||||
| 9
    
        Вик72 14.11.18✎ 16:40 | 
        (1) Благодарю, через МенеджерЗаписи работает в 20-30 раз быстрее. Но транзакцию убирать не стоит - вне транзакции работает в 2-3 раза медленнее, чем в ней! 
 Я ранее как-то не углублялся в вопрос, и меня ввела в заблуждение глупая статья на "ИТС": "Назначение и особенности использования менеджера записи регистра сведений" <...> С точки зрения производительности использование наборов записей будет максимально эффективным. Использование менеджера записей в некоторых случаях будет столь же эффективным, а в некоторых менее, так как будут выполняться лишние действия. https://its.1c.ru/db/metod8dev/content/2722/hdoc | |||
| 10
    
        ptiz 14.11.18✎ 16:43 | 
        (9) Менеджер записи абсолютно идентичен Набору из одной записи. Видимо, код модуля мешал (срабатывавший при ОбменЗаписи <> Истина).     | |||
| 11
    
        Вик72 14.11.18✎ 16:48 | 
        (10) Получается, не идентичен) Даже если он близок с точки зрения запроса к БД, могут быть накладные расходы от сервера 1С. А модуль набора записей абсолютно пуст, и подписок никаких нет.     | |||
| 12
    
        Tonik992 14.11.18✎ 17:18 | 
        (11) Проверил. Однако, в некоторых случаях даже быстрее.     | |||
| 13
    
        Вик72 14.11.18✎ 17:23 | 
        (12) На моих данных разница реально в десятки раз!     | |||
| 14
    
        Bober 14.11.18✎ 19:11 | 
        (13) интересно.     | 
 
 | Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |