Имя: Пароль:
1C
1С v8
Запись таблицы значений в регистр сведений
0 vhl
 
02.09.13
10:29
Есть задача регулярно записывать данные из таблицы значений в регистр сведений. Названия реквизитов совпадают с названиями колонок. Регистр периодический. 1 измерение, остальное - ресурсы. Количество записей в ТЗ 2-3тысячи. Может доходить до 100тысяч, но редко. Во всех строках значение измерения может быть разным. Пока делаю через создание менеджера записей для каждой строки. Но получается медленно. Есть идеи как можно записывать полностью таблицу?
1 бомболюк
 
02.09.13
10:32
А наборами записей не пробовал?
2 butterbean
 
02.09.13
10:32
дык набор записей с отбором по измерению
3 butterbean
 
02.09.13
10:33
(2)+ и периоду
4 Starhan
 
02.09.13
10:33
РегистрСведенийНаборЗаписей.<Имя регистра сведений> (InformationRegisterRecordSet.<Имя регистра сведений>)
Загрузить (Load)
Синтаксис:

Загрузить(<ТаблицаЗначений>)
Параметры:

<ТаблицаЗначений> (обязательный)

Тип: ТаблицаЗначений.
Таблица значений, по которой производится заполнение набора записей.
Описание:

Загружает набор записей значениями из переданной таблицы значений. При этом все прежние записи набора удаляются. Заполняются значения доступных для записи свойств записей регистра сведений, имена которых совпали c именами колонок таблицы значений.

Доступность:

Сервер, толстый клиент, внешнее соединение.
Пример:

Рег = РегистрыСведений.КурсыВалют;
НаборКурсов = Рег.СоздатьНаборЗаписей();
Таб = Новый ТаблицаЗначений;
// формирование таблицы значений
// ...
НаборКурсов.Загрузить(Таб);
5 Maxus43
 
02.09.13
10:34
(4) затрёт старые
(2)(3) дык по одному периоду и одному измерению тока одна запись, равносильно (0), запись менеджером каждой хаписи
6 Maxus43
 
02.09.13
10:35
Записать(Ложь) если юзать - может прокатит. Т.е. создаём набор без отборов, как в (4)... проверять надо
7 vhl
 
02.09.13
10:36
(1) На каждую строку создавать набор? RLY?
8 бомболюк
 
02.09.13
10:36
можно попробовать сначала все записи прибить разом, а потом писать наборами в режиме Записать(Ложь).
9 butterbean
 
02.09.13
10:37
(7) все зависит загружаемых от данных
если там все записи за период, то можно только отбор по периоду и не страшно что сотрет все старое
10 vhl
 
02.09.13
10:38
(6) Есть второй раз попробовать загрузить те же данные будет выдавать ошибку, что данные уже есть. А иногда нужно будет перезаписывать.
11 Enders
 
02.09.13
10:39
Если у каждой записи свой период, тогда только менеджером.
Если период одинаковый и раньше такого периода не было, тогда набор записей и отбор по периоду, а дальше загрузить.
Можно конечно изменить РС. Добавить измерение "Дата загрузки", и в ТЗ добавить эту колонку. Отбор ставить по нему, дальше грузить.
12 Starhan
 
02.09.13
10:40
(5)(10)
Затирает данные в наборе записей заполняя их заново  ТЗ, набору записей можно отдельно установить отбор. В данном случае только по периоду.
13 Starhan
 
02.09.13
10:41
Тогда затрет только записи с этим периодом.
14 Starhan
 
02.09.13
10:41
при записи набора записей >_<
15 Maxus43
 
02.09.13
10:41
(12) что то мне подсказывает что там периодов много, и итог будет почти как в (0). Хотя если там разных периодов немного то да, будет лучше
16 vhl
 
02.09.13
10:43
(8) В этом регистре несколько миллионов записей. Это не вариант.
17 Starhan
 
02.09.13
10:45
(15). Как я понял периода в ТЗ нет.
(0) какая структура у ТЗ?
18 vhl
 
02.09.13
10:47
(17) Период есть. Поля все совпадают с полями регистра. Но в каждой записи свой период :(
19 butterbean
 
02.09.13
10:50
(18) с набором все равно должно быть быстрее т.к. для записи через менеджер создается 2 набора — один для удаления, другой для записи нового
20 Maxus43
 
02.09.13
10:50
(18) вот это плохо. Тут наверняка только менеджер записи использовать.
(19) отбор как поставишь?
21 Maxus43
 
02.09.13
10:51
таки Доп измерение если добавить - число например, НомерПачки, по нему отбор ставить и записывать набор весь
22 butterbean
 
02.09.13
10:51
(20) на каждую пару период/измерение конечно свой отбор
23 Maxus43
 
02.09.13
10:52
(22) тоже самое что (0) будет, как менеджер. Прирост будет имхо минимален
24 Starhan
 
02.09.13
10:52
А зачем регистр периодический?
25 Maxus43
 
02.09.13
10:53
сколько грузится по времени щас кстати?
26 Starhan
 
02.09.13
10:53
Потом используется где-то срез последних?
27 vhl
 
02.09.13
10:56
(21) Это было бы хорошо, если бы не пришлось переписывать все отчеты, которые привязаны к данному регистру :(
28 vhl
 
02.09.13
10:57
(26) конечно
29 Фокусник
 
02.09.13
11:03
(27) Зачем? Это измерение будет "служебное" в отчетах оно не нужно :)
30 vhl
 
02.09.13
11:04
Короче сделал так:
      ТабДляЗаписи.Индексы.Добавить("Период");
    
    ТабПериодов = ТабДляЗаписи.Скопировать(,"Период");
    ТабПериодов.Свернуть("Период");
    
    Для каждого стр Из ТабПериодов Цикл
        
        Набор = РегистрыСведений.МойБольшойРегистр.СоздатьНаборЗаписей();
        Набор.Отбор.Период.установить(стр.Период);
        
        НайдСтр = ТабДляЗаписи.НайтиСтроки(Новый Структура("Период",стр.Период));
        Для каждого стр2 Из НайдСтр Цикл
        
            НовН = Набор.Добавить();
            ЗаполнитьЗначенияСвойств(НовН,стр2);
        
        КонецЦикла;
        
        Набор.Записать(Истина);
    
    КонецЦикла;
В среднем в 3 раза быстрее. Всем спасибо.
31 vhl
 
02.09.13
11:05
(29) Ты неправильный срез последних будешь получать так
32 Starhan
 
02.09.13
11:11
(30) попробуй так

Таб =  ТабДляЗаписи.Скопировать(НайдСтр);
Набор.Загрузить(Таб);

или даже так если даст

Набор.Загрузить(ТабДляЗаписи.Скопировать(НайдСтр))
33 vhl
 
02.09.13
11:20
(32) Да, так пожалуй будет лучше, спасибо!
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс