Имя: Пароль:
1C
1С v8
При изменении регистра 1с хочет удалить все записи
0 dborovsky
 
03.06.13
10:36
Добрый день

Создал регистр, из файла загрузил записи в него(порядка 40 тыс строк). Теперь хочу, чтобы в будущем данный регистр был подчинен регистратору. В настройках указал регистраторы. Нажимаю запустить в режиме клиента выдает сообщение что объект изменен:... и запись регистра будут удалены. Получается есди я нажму принять, все записи будут удалены? С чем это связано и как мне решить данную проблему?
1 Maxus43
 
03.06.13
10:38
сейчас у записей нет регистратора, естественно они не могут существовать в подчинённом регистре. загружай потом записи заново, но с регистратором
2 dborovsky
 
03.06.13
10:41
я 40 тыс строк загружал 12 часов. Заново все загружать совсем не горю желанием. А по другому никак?
3 Флудер
 
03.06.13
10:42
(2) Никак
4 1Сергей
 
03.06.13
10:42
(2) если скуль, то можно извернуться
5 Maxus43
 
03.06.13
10:42
(2) нет.
З.ы. хреново загружал как то... я мильёны выгружаю из версионирования за несколько часов например
6 Maxus43
 
03.06.13
10:43
(4) айайай, не учи плохому
7 1Сергей
 
03.06.13
10:43
(6) :) зачем учить? можно ведь просто помочь небесплатно :)
8 Mitriy
 
03.06.13
10:43
Создай другой регистр копированием, туда перегрузи данные, измени свой регистр, загрузи из копии, удали ненужный регистр... Это, если критично сохранить старый регистр, если нет, то просто создай новый и туда перегрузи...
9 SherifSP
 
03.06.13
10:44
(2)Не правильно выгружаешь, 40 тыс  не больше часа выгружаются, при правильном коде
10 Mitriy
 
03.06.13
10:45
(9) ну... можно напихать двадцать пять измерений и сорок ресурсов... и все с составными типами... тогда вообще будет вечность...
11 dborovsky
 
03.06.13
10:51
вот сам код загрузки из таблицы значений. При добавлении новой записи проверяю ее на уникальность.

Подскажите, пожалуйста, тогда как бы вы изменили:

номерЗаписи = 0;
   Для Каждого текСтрока Из тзТекстФайл Цикл
                       
       ЕстьСтрока = Ложь;
       НаборЗаписейРегистрЦеныПоставщиков.Прочитать();
       
       контрагент = Справочники.Контрагенты.НайтиПоКоду(текСтрока["КонтрагентКод"]);
       НаборЗаписейРегистрЦеныПоставщиков.Отбор.Контрагент.Установить(контрагент);
       НаборЗаписейРегистрЦеныПоставщиков.Прочитать();
       
       Для Каждого записьРегистра Из НаборЗаписейРегистрЦеныПоставщиков Цикл
           Если записьРегистра.Контрагент.Код = текСтрока["КонтрагентКод"]
               И записьРегистра.Период = Дата(текСтрока["Дата"])
               И записьРегистра.Номенклатура.Код = текСтрока["НоменклатураКод"] Тогда
               
               ЕстьСтрока = Истина;
               Прервать;
           КонецЕсли;        
       КонецЦикла;
       
       
       Если ЕстьСтрока Тогда
           Продолжить;
       Иначе
           НоваяЗаписьРегистрЦеныПоставщиков = НаборЗаписейРегистрЦеныПоставщиков.Добавить();    
           
           Попытка
               датаДокумента = Дата(текСтрока["Дата"]);        
           Исключение
               
           КонецПопытки;
           
           Если ЗначениеЗаполнено(датаДокумента) Тогда
               НоваяЗаписьРегистрЦеныПоставщиков.Период = датаДокумента;
           Иначе
               НоваяЗаписьРегистрЦеныПоставщиков.Период = ТекущаяДата();
           КонецЕсли;
               
           //результат = тзНоменклатура.Найти(текСтрока["НоменклатураКод"], "Код");
           результат = Справочники.Номенклатура.НайтиПоКоду(текСтрока["НоменклатураКод"]);
           Если результат <> Неопределено Тогда
               НоваяЗаписьРегистрЦеныПоставщиков.Номенклатура = результат;
           Иначе
               продолжить;    
           КонецЕсли;
           
           //рез = тзКонтрагенты.Найти(текСтрока["КонтрагентКод"], "Код");
           рез = Справочники.Контрагенты.НайтиПоКоду(текСтрока["КонтрагентКод"]);
           Если  рез <> Неопределено Тогда
               НоваяЗаписьРегистрЦеныПоставщиков.Контрагент = рез;    
           КонецЕсли;
           
           вал = Справочники.Валюты.НайтиПоНаименованию(текСтрока["Валюта"]);
           Если Не вал.Пустая() Тогда
               НоваяЗаписьРегистрЦеныПоставщиков.Валюта = вал;    
           КонецЕсли;
           
           Если ЗначениеЗаполнено(текСтрока["Цена"]) Тогда
               НоваяЗаписьРегистрЦеныПоставщиков.Цена = текСтрока["Цена"];
           Иначе
               Продолжить;
           КонецЕсли;
           
           Попытка
               НаборЗаписейРегистрЦеныПоставщиков.Записать();
               Сообщить("Запись успешно добавлена - "+номерЗаписи);
               номерЗаписи = номерЗаписи + 1;
           Исключение
           КонецПопытки;
       КонецЕсли;
   КонецЦикла;
12 Mitriy
 
03.06.13
10:53
(11) не пугай добрых людей, см. (8)
13 ptiz
 
03.06.13
10:54
Проверка на уникальность - это жесть :)
14 dborovsky
 
03.06.13
10:55
да жесть, поэту и спрашиваю как бы вы сделали?
15 ptiz
 
03.06.13
10:57
(14) Либо убрать её нафиг, либо в ТЗ запоминать уже загруженные (лучше - с индексированными колонками, но 40 тыс строк и так сжует).
16 Фрэнки
 
03.06.13
10:57
(14) если сделал один регистр без регистратора, а теперь  нужон с регистратором, то сделал бы еще один регистр и все. Потом, в рабочем порядке и если очень сильно будет нужно, перепишу данные из первого регистра во второй.
17 dborovsky
 
03.06.13
11:00
скопировать из одного регистра в другой это все понятно, мне больше интерессно как правильно было загрузить из файла, чтобы скорость загрузки увеличилась. Убрать проверку на уникальность?  В ТЗ запоминать уже загруженные это как?
18 Фрэнки
 
03.06.13
11:01
(14) а если говорить про проверку уникальности, то вариантов можно много придумать... самое очевидное: искать не в записях, с постоянным считыванием их с базы, а загружать их в тз и там уже куртить всяко по разному, но как это будет работать на 40 тысячах надо смотреть более внимательно
19 mistеr
 
03.06.13
11:01
(14) А ты справку принципиально не читаешь, сразу в бой? А как облом, сразу бегом на Мисту?

Примеры поиска записей в регистре неужели не видел?
20 dborovsky
 
03.06.13
11:05
Видел и читал, поэтому и интересуюсь у вас, как бы вы сделали? Ок, мысль понятна. Спасибо за ответы.
21 UnAmerican
 
03.06.13
11:12
Сначала формируешь ТЗ, дальше тз в запрос и отсекаешь там лишние. Главное одним запросом, то есть одним обращением к БД. А не в цикле.
22 Фрэнки
 
03.06.13
11:19
(22) да даже проще, потому что у него "внешний источник" - загрузить все в тз, проверить на уникальность, а затем уже запихивать в регистр, ну и транзакциями обрамление вокруг процедуры записи в регистр по какому-то количеству регистираторов.
23 dborovsky
 
03.06.13
11:23
ну и транзакциями обрамление вокруг процедуры записи в регистр по какому-то количеству регистираторов - можно по подробнее, что вы имеете ввиду?
24 Black_Doctor
 
03.06.13
11:31
т.с., а вы пробовали использовать функцию свернуть для ТЗ? она ведь позволяет свернуть таблицу, вот Вам и проверка на уникальность...

Или я не прав?
25 Black_Doctor
 
03.06.13
11:34
Кроме того, можно прибегнуть к возможности перезаписи, что даст вам возможность пере-записывать уже имеющиеся записи, это предположительно будет быстрей, чем проверять каждую запись.
26 Balabass
 
03.06.13
11:40
(2) Напрашивается упомянутая не так давно картинка, но она грубая, но так хочется, как ты знал.
27 Фрэнки
 
03.06.13
11:44
(23) транзакции остаются в памяти процесса до момента своего завершения и записываются физически только после вызова процедуры ЗафиксироватьТранзакцию. Таким образом, даже при использовании регистраторов, накапливают в транзакции несколько сотен записей и потом фиксируют. На любителя
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.