Имя: Пароль:
1C
1С v8
Добавить данные в независимый регистр сведений
0 Мультук
 
гуру
06.06.22
13:50
Есть независимый регистр сведений.

Например:
ДополнительныеСведения
- Объект / измерение
- Свойство / измерение
- Значение / ресурс

В нем (например) 10 млн записей (много).

Мы запросом получаем (ахалай-махалай) таблицу значений тз с аналогичной структурой (например 100 тыс строк).

Задача простая.
Новые записи добавить, старые обновить, записи которых нет в таблице - в регистре не трогать.

Вместо тривиального кода, нужно что-то пошустрее:

  Для каждого Об из ТЗ Цикл    
        Менеджер = РегистрыСведений.ДополнительныеСведения.СоздатьМенеджерЗаписи();

        Менеджер.Объект = об.Объект;
        Менеджер.Свойство = об.Свойство;
        Менеджер.Значение = Об.Значение ;
        Менеджер.Записать(Истина);
  КонецЦикла;
1 Ryzeman
 
06.06.22
13:53
Через СоздатьНаборЗаписей(), но это не сильно ускорит.
Прямым запросом сделать UPDATE - быстрее всего.
2 timurhv
 
06.06.22
13:53
Свойство - везде одно и тоже?
3 timurhv
 
06.06.22
13:54
Можно по нему отбирать, прочитать, выгрузить, в ТЗ поправить - загрузить, записать.
4 Мультук
 
гуру
06.06.22
13:55
(2) Так нельзя - будет нехорошо.
5 palsergeich
 
06.06.22
13:59
(0) 10 млн это разве много?
Фигани в потоков 10-15 и не занимайся ерундой.
было бы 100-150 лямов - можно было бы подумать и о непосредственно загрузке в скуль
6 1Сергей
 
06.06.22
14:01
Транзакции ещё не предлогали?
7 timurhv
 
06.06.22
14:03
(4) Почему? Вроде можно наложить блокировку по свойству, запросом готовую таблицу собрать, загрузить таблицу в набор записей (именно загрузить, а не добавлять записи, так быстрее).
8 timurhv
 
06.06.22
14:12
Протестировал, 90тыс записей обновилось за 9 сек в файловом режиме (отбор по свойству).
9 Мультук
 
гуру
06.06.22
14:26
(7) (8)

Регистр сведений
{еще всякое}
Об1 Св1
Об2 Св1
Об3 Св1

Табл значений
Об4 Св1

Можно увидеть код который оставит записи об1, об2, об3 и добавить запись из табл. значений ?
10 timurhv
 
06.06.22
14:48
(9) Код - нет, вот алгоритм:
- блокировка на регистр по СВ1 (чтобы не записали свойство, пока мы обновляем все записи по СВ1);
- запросом получаете все записи регистра с отбором по свойству + полное соединение записей регистра с ТЗ (с конструкцией "ЕСТЬNULL(ТЗ.Объект, РС.Объект) КАК Объект, ЕСТЬNULL(ТЗ.Свойство, РС.Свойство) КАК Свойство, ЕСТЬNULL(ТЗ.Значение, РС.Значение) КАК Свойство", соединение по объекту и свойству);
- выгружаете в новую таблицу значений;
- создаете набор записей, отбор по СВ1;
- набор записей не считываете, просто делаете загрузить таблицу из запроса;
- записываете набор записей;
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший