Имя: Пароль:
1C
 
При записи в РС обнаруживаются одинаковые записи.
0 Контакт
 
05.06.08
13:01
рег1= РегистрыСведений.zakup_otkaz.СоздатьНаборЗаписей();
Пока  RS.EOF()=0 Цикл
                 
               рег = рег1.Добавить();
               Рег.id_ges = RS.fields("id_ges").value();
               Рег.kol=RS.fields("kol").value();
               Рег.data_otk= RS.fields("data_otk").value;  
               Рег.tochka = RS.fields("tochka").value;
               Рег.naim = RS.fields("naim").value;
               Рег.cena=RS.fields("cena").value;
               Рег.id_nom=RS.fields("id_nom").value;
               Рег.pr_otkaz=RS.fields("pr_otkaz").value;
               RS.MoveNext();
               is=is+1;
               ИндикаторРаботы.Значение=ИндикаторРаботы.Значение+1 ;
               Если is=3000 тогда
                   Попытка Рег1.Записать();
                   Сообщить("запись:"+ is);
                   is=0;    
                   //Константы.ДатаПоследнейЗагрузки.Установить(Дата(Рег.data_otk);
                   Исключение сообщить("Произошла ошибка: "+ОписаниеОшибки());
                   Возврат;
                   КонецПопытки;                    
               КонецЕсли;        
   КонецЦикла;

Народ что делать когда несколько строк равны между собой при id_ges=kol=data_otk=tochka=naim=cena=id_nom=pr_otkaz вылетает ошибка при записи что такие записи повторяются. а нужно записать рег1.
Надумка такая что если записи совпадаю в "Исключение" вставить код

пока RS.EOF() = 0 Цикл    
Рег = РегистрыСведений.zakup_otkaz.СоздатьМенеджерЗаписи();    
               Рег.data_otk= RS.fields("data_otk").value;  
               Рег.id_ges = RS.fields("id_ges").value;
                     Рег.naim = RS.fields("naim").value;
               Рег.tochka = RS.fields("tochka").value;
               Рег.id_nom=RS.fields("id_nom").value;
               Рег.pr_otkaz=RS.fields("pr_otkaz").value;
               Рег.kol=RS.fields("kol").value;
               Рег.cena=RS.fields("cena").value;
               Рег.Записать();
               i=i+1;
                RS.MoveNext();

Но как это осушествить
1 ТелепатБот
 
гуру
05.06.08
13:01
2 Fragster
 
гуру
05.06.08
13:05
а ты вот так специально с русско-английской смесью нам мозг решил взорвать, или у тебя везде так?
3 Fragster
 
гуру
05.06.08
13:06
а вообще - по ключевым полям измерений - все записи регистра сведений должны быть уникальны
4 Mitriy
 
05.06.08
13:07
(0) не даст одинаковые записи сделать... чо-нить меняй, либо измерение типа НомерСтроки сделай...
5 Контакт
 
05.06.08
13:10
Ок.(2)(3) (4)!! тогда как мне исключить эту запись повторения. чтоб она не писалась в РС.
6 Fragster
 
гуру
05.06.08
13:10
(5) запихай в таблицу и сверни
7 Контакт
 
05.06.08
13:11
(2) Думал лучше так будет для понимания суть проблемы )))
8 Контакт
 
05.06.08
13:13
(6) Да насворачивал в таблицу ТЗ.Свернуть("data_otk,id_ges,naim,tochka,id_nom,pr_otkaz,kol,cena");
никуя. тема даже есть v8: v8: Ошибка при записи в регистр сведений (8)
9 Fragster
 
гуру
05.06.08
13:14
чем рег.cena лучше для понимания сути проблемы, чем рег.цена, и т.д.?
10 Fragster
 
гуру
05.06.08
13:14
(8) по уникальным полям сворачивай
11 Контакт
 
05.06.08
13:14
Извините за Мат) погода фиговая в перми. Дождит
12 Mitriy
 
05.06.08
13:15
(8)А если так?
ТЗ.Свернуть("data_otk,id_ges,naim,tochka,id_nom,pr_otkaz, cena", "kol")
13 Контакт
 
05.06.08
13:16
(9) Гы. Не Виноват я. До меня было так. менять не хотЦЦа.
14 Fragster
 
гуру
05.06.08
13:17
в смысле по измерениям, для которых установлено ведущее и основной отбор
15 Mitriy
 
05.06.08
13:17
чо измерения, а чо ресурсы в регистре?
и еще, на случай всяк, у набора записей регистра есть методы: Выгрузить и Загрузить, чтобы не оч париться...
16 Mitriy
 
05.06.08
13:18
(15) к (13)
17 Контакт
 
05.06.08
13:19
Регистр Сведений:
Измерения (id_ges,naim,tochka,id_nom,pr_otkaz)
Ресурс (kol,cena)
18 Контакт
 
05.06.08
13:20
(15) Уважаемые знаю я.
Если is=1024 тогда                  ТЗ.Свернуть("data_otk,id_ges,naim,tochka,id_nom,pr_otkaz,kol,cena");
                   НаборЗаписей = РегистрыСведений.zakup_otkaz.СоздатьНаборЗаписей();
                   НаборЗаписей.Загрузить(ТЗ);
                   ТЗ.Очистить();
                   
                   Попытка
                       НаборЗаписей.Записать();
                       Сообщить("запись:"+ is);
                       is=0;
                       RS.MoveNext();
 
                   Исключение сообщить("Произошла ошибка: "+ОписаниеОшибки());
19 Fragster
 
гуру
05.06.08
13:21
а зачем регистр сведений для такого вида учета вообще использовать? если кол и цена? и как должны вносится те данные, у которых все измерения совпадают? ИМХО изначально проектировал базу человек, нифига не знакомый с 1с и регистрами накопления...
20 Fragster
 
гуру
05.06.08
13:25
ТЗ.Свернуть("data_otk,id_ges,naim,tochka,id_nom,pr_otkaz" , "kol,cena"); вот только надо учесть, что цена и количество - сложатся... надо знать, какие данные должны быть в регистре, в смысле, что такое цена и количество.
21 Контакт
 
05.06.08
13:25
(19) Как мне эти сведения запихать в 1С без повторений строк id_ges=kol=data_otk=tochka=naim=cena=id_nom=pr_otkaz
22 Контакт
 
05.06.08
13:26
(20) нафига мне Сумма по "kol,cena"?!
23 Fragster
 
гуру
05.06.08
13:26
что есть кол, и что есть цена? что это вообще за регистр сведений? скажи нам, что он олицетворяет в реальной жизни?
24 Mitriy
 
05.06.08
13:28
(23) на того тебе это, что если у тя количество или цена отличаются при прочих равных, то записать не даст - надо, чтобы хоть в одном измерении различия встречались...
25 Контакт
 
05.06.08
13:30
(23)КОл-это количество Товара названиия-naim, его кода - id_ges, а cena - это Цена единицы товара.
26 Dionisious
 
05.06.08
13:31
(0) пиши не в набор записей, а создавай менеджер записи. Медленее будет работать но зато будет.
27 Контакт
 
05.06.08
13:32
(24) To   Mitriy Как если встречаются одинковые записи. исключить эти двойные одинакоые записи и записать одну. будет тогда Гуд. я уже писал в (21)
28 Fragster
 
гуру
05.06.08
13:32
количество товара где? ИМХО нужно как минимум цену - в измерения перекинуть...
29 Dionisious
 
05.06.08
13:33
(25) чушь какая то.
30 Контакт
 
05.06.08
13:33
(26) Спасибо. нет уж за один день накапливаются около 10000 записей. Отдел без работы сидеть будет)
31 Dionisious
 
05.06.08
13:35
(30) ну тогда используй ТЗ перед добавлением в ТЗ проверяй есть ли там строки по одбору. Только все равно медлено.
32 Dionisious
 
05.06.08
13:35
(31)+ иначе: меняй структуру регистра. ИМХО других вариантов нет.
33 Mitriy
 
05.06.08
13:37
(27) придумывай, как считать среднюю цену или еще какую максимальную/минимальную, либо (28), либо (4), либо по периоду разводи, но чо-то в измерениях должно быть разное...
34 Контакт
 
05.06.08
13:53
(4) Это вариант думаю проделать вставлю счетчик при
Регистр Сведений:
Измерения (ДевственныйСчетчик,id_ges,naim,tochka,id_nom,pr_otkaz)

ДевственныйСчетчик=0;

Пока  RS.EOF()=0 Цикл
               
               рег = рег1.Добавить();
Рег.ДевственныйСчетчик=ДевственныйСчетчик+1;
               Рег.id_ges = RS.fields("id_ges").value();
               Рег.kol=RS.fields("kol").value();
......
Если is=3000 тогда
                   Попытка Рег1.Записать();
                   Сообщить("запись:"+ is);
                   is=0;    
         
                   Исключение сообщить("Произошла ошибка: "+ОписаниеОшибки());
                   Возврат;
                   КонецПопытки;                    
               КонецЕсли;        
   КонецЦикла;
35 Fragster
 
гуру
05.06.08
13:54
тебе еще не говорили, что база тормозит?
36 Контакт
 
05.06.08
14:00
(35) пусть скажут только я тогда сделаю
Рег = РегистрыСведений.zakup_otkaz.СоздатьМенеджерЗаписи();
))гы
До хера долго будет переписыватся. пробывал когда на обед ходил. пришел. а он все еще пишет.
37 Mitriy
 
05.06.08
14:02
(34) ентот код не поможет, имхо Рег.ДевственныйСчетчик всегда равен 1...
38 Mitriy
 
05.06.08
14:04
(37)+ и вааще чо-то все как-то тупо выглядит, прощу прощения, задача изначально неправильно поставлена, имхо, много гемора предвидится, причем бесконечного...
39 Fragster
 
гуру
05.06.08
14:04
(37) +1
40 Контакт
 
05.06.08
14:04
(34) епт. увидел что не дописал. а вот так поможет лешить девственность счетчику.

Регистр Сведений:
Измерения (ДевственныйСчетчик,id_ges,naim,tochka,id_nom,pr_otkaz)

ДевственныйСчетчик=0;

Пока  RS.EOF()=0 Цикл
               
               рег = рег1.Добавить();
ДевственныйСчетчик=ДевственныйСчетчик+1;
Рег.ДевственныйСчетчик=ДевственныйСчетчик;
               Рег.id_ges = RS.fields("id_ges").value();
               Рег.kol=RS.fields("kol").value();
......
Если is=3000 тогда
                   Попытка Рег1.Записать();
                   Сообщить("запись:"+ is);
                   is=0;    
         
                   Исключение сообщить("Произошла ошибка: "+ОписаниеОшибки());
                   Возврат;
                   КонецПопытки;                    
               КонецЕсли;        
   КонецЦикла;
41 Fragster
 
гуру
05.06.08
14:05
(38) ну так я уже спрашивал про предметную область, отражаемую регистром... «а в ответ тишина...»
42 Контакт
 
05.06.08
14:11
(41) какая тишина. все понятно. поясняю. на SQL записываются записи отказов. И хотелось бы переносить из SQL в 1С эти записи. типо вести историю. Самое оптимальное это РС. записей в SQL набралось около 1 млн. по каждому отказу назначть ответственного, дата начала разбирательства почему отказ и т.п.
43 Fragster
 
гуру
05.06.08
14:14
а почему не ригистр накопления, например? или не периодический регистр сведений? вообще по принципу хранения данных у 1с намного больше возмежностей, чем чисто в теблицах БД, это и нужно использовать.
44 Контакт
 
05.06.08
14:18
регистр сведений: непериодический и независымый!
45 Fragster
 
гуру
05.06.08
14:22
(43) это я вообще-то сказал к тому, что тупо переносить данные из таблиц скуля в 1с - подход неправильный.
если хочешь целиком перенести, да еще и чтобы данные с одинаковыми ключами не потерялись - пиши либо с девственным счетчиком (но вероятность ошибки все равно есть), либо в справочник (!sic) с соответствующими реквизитами. Но мой совет, сначала представить эффективную структуру данных, а не тупо переносить.
46 Контакт
 
05.06.08
14:24
не катит так

   ТЗ.Свернуть("data_otk,id_ges,naim,tochka,id_nom,pr_otkaz,cena"," kol");

Ошибку выдает.
{Отчет.Отчет2.Форма.Форма(516)}: Ошибка при вызове метода контекста (Записать): Запись с такими ключевыми полями существует! : 21.03.2008 0:00:00 : 4 442 599 :  : КД093701 : 3 853 184 : нет сертификата в Перми :  (Регистр сведений: Zakup otkaz; Номер строки: 1363)
           НаборЗаписей.Записать();
по причине:
Запись с такими ключевыми полями существует! : 21.03.2008 0:00:00 : 4 442 599 :  : КД093701 : 3 853 184 : нет сертификата в Перми :  (Регистр сведений: Zakup otkaz; Номер строки: 1363)

Как исключить то запись? и в этот момент эти строки записать Рег = РегистрыСведений.zakup_otkaz.СоздатьМенеджерЗаписи();
47 Fragster
 
гуру
05.06.08
14:29
так то, что ты просрешь эту запись - это ничего, чтоли?
48 Контакт
 
05.06.08
14:34
(47) Даааа... Хватит одной этой записи. Просто изночально в SQL записывать стали не так с повторяющими записями.

Как произвести переборку по повторяющими записями за периуд. и записать только одну запись.

Такая запись может выпасть 1 на 20000
49 Fragster
 
гуру
05.06.08
14:36
перенеси цену в измерения, сверни таблицу по всему, кроме количества, количество - суммируй и это добро уже пихай в регистр
50 Контакт
 
05.06.08
14:37
(45) Тупо перенести-означает правильно перенести. тут мужрить не надо. где повторяющие записи записать одну. делов то((( тока как.
51 Контакт
 
05.06.08
14:41
(49) и что получится. что у повторяющихся записей в регист запишется сумма по колличеству?
52 iSeRG
 
05.06.08
14:42
А чего DISTINCT или группировку при выборке со скуля не используешь?
53 Fragster
 
гуру
05.06.08
14:46
(51) ага, но если на просранные записи насрать - то и так должно покатить
(52) а оно все равно вернет все с уникальными количествами и ценами - а в РС - это ресурсы - не прокатит, либо надо и количество и цену в измерения пихать
54 Контакт
 
05.06.08
14:47
(52) Все использую изначально выборку делаю по дате а потом буду обновлять по минус один день.

   RS.Open("SELECT Count(*) kolq  FROM  dbo.zakup_otkaz  where data_otk between CONVERT(DATETIME, '" + ДатаНачТекст + "', 103) and  CONVERT(DATETIME, '" + ДатаКонТекст + "', 103) ", Connection);
55 Контакт
 
05.06.08
14:49
(51) а потом как мне при формирование отчетов вылавливать эти просранные записи они же записались в регистр полноценно ?!
56 Fragster
 
гуру
05.06.08
14:50
(54) так это ж только количество возвращает о_О
57 iSeRG
 
05.06.08
14:50
(53) ясно, что группировать надо по измерениям. А вот что с ресурсами делать хз. Если все записи с одинаковыми измерениями имеют одинаковые ресурсы, то МАКСИМУМ по ним, а если нет, то РС неправильно спроектирован.

Учитывая, что после сворачивания ТЗ, 1С ругается, то имеются уже записанные записи.
58 Fragster
 
гуру
05.06.08
14:53
при способе записи из (0) - просранные - значит просранные. причем при «дозаписи» - еще может и «ДевственныйСчетчик» не помочь. я же говорю прежде чем переносить - надо подумать, зачем оно надо в 1с ибо не все возможно...
59 Контакт
 
05.06.08
14:54
(54) ой. Это нужно для ИндикаторРаботы.МаксимальноеЗначение= RS.fields("kolq").value();

вот он кодик ддорогой выборки RS.Open("SELECT * FROM dbo.zakup_otkaz  where data_otk between CONVERT(DATETIME, '" + ДатаНачТекст + "', 103) and  CONVERT(DATETIME, '" + ДатаКонТекст + "', 103) ", Connection);
60 Контакт
 
05.06.08
14:56
(58)> причем при «дозаписи» - еще может и «ДевственныйСчетчик» не помочь. тут уже как мин будут две уникальные поля в записи это дата data_otk и «ДевственныйСчетчик»))
61 iSeRG
 
05.06.08
14:58
(59) ну и где у тебя там группировка или DISTINCT ?
62 Fragster
 
гуру
05.06.08
15:02
короче, выгрузи все в ТЗ, добавь колонку с типом число, заполни единицей, сверни по всему, что у тебя является измерениями, при этом суммируя по этой колонке.
смотри, где у тебя больше 1 в этой колонке получилось - эти записи при всем желании будут просраны без приблуд, добавляющих уникальность. а при дописывании новых данных - смотри, что у тебя уже есть в регистре - ибо комбинация значений измерений должна быть уникальна во всем регистре сведений - так как она определяет саму запись. либо используй не регистр сведений, а что-нибудь другое.
63 Fragster
 
гуру
05.06.08
15:03
(61) дистинкт не спасет - он на все колонки распространяется, а в 1с уникальны должны быть комбинации измерений, а не измерений+регистров
64 Fragster
 
гуру
05.06.08
15:04
(60) ну, это да, упустил...
65 Контакт
 
05.06.08
15:12
(62) О, другое дело попробую организовать это. типо как это в коде реализовать
// Создание таблицы значений
       ТЗ = Новый ТаблицаЗначений;
       
               ТЗ.Колонки.Добавить("ДевственныйСчетчик",ОписаниеТиповЧ);
       ТЗ.Колонки.Добавить("data_otk",ОписаниеТиповС);
       ТЗ.Колонки.Добавить("id_ges",ОписаниеТиповЧ);
       ТЗ.Колонки.Добавить("naim",ОписаниеТиповС);
       ТЗ.Колонки.Добавить("tochka",ОписаниеТиповС);
       ТЗ.Колонки.Добавить("id_nom",ОписаниеТиповЧ);
       ТЗ.Колонки.Добавить("pr_otkaz",ОписаниеТиповС);
       ТЗ.Колонки.Добавить("kol",ОписаниеТиповЧ);
       ТЗ.Колонки.Добавить("cena",ОписаниеТиповЧ);
       
       Пока RS.EOF()=0 Цикл
                           ИндикаторРаботы.Значение=ИндикаторРаботы.Значение+1;
НоваяСтрока = ТЗ.Добавить();
НоваяСтрока.ДевственныйСчетчик=1;
НоваяСтрока.id_ges = RS.fields("id_ges").value();
НоваяСтрока.kol=RS.fields("kol").value();
НоваяСтрока.data_otk= RS.fields("data_otk").value;  
НоваяСтрока.tochka = RS.fields("tochka").value;
НоваяСтрока.naim = RS.fields("naim").value;
НоваяСтрока.cena=RS.fields("cena").value;
НоваяСтрока.id_nom=RS.fields("id_nom").value;
               НоваяСтрока.pr_otkaz=RS.fields("pr_otkaz").value;
               RS.MoveNext();
       КонецЦикла;
ТЗ.Свернуть("data_otk,id_ges,naim,tochka,id_nom,pr_otkaz,cena"," kol");
       RS.Close();

а дальше как в конце не допонял?
66 iSeRG
 
05.06.08
15:21
(63) забей на DISTINCT :) все зависит от ситуации.
67 Fragster
 
гуру
05.06.08
15:26
ТЗ.Свернуть("data_otk,id_ges,naim,tochka,id_nom,pr_otkaz,cena","kol, девственныйСчетчик");

Для каждого Стр из ТЗ Цикл
 Если Стр.ДевственныйСчетчик>1 Тогда
   // вот в этой строке и косяк!
 КонецЕсли;
КонецЦикла;
68 Fragster
 
гуру
05.06.08
15:27
смотрю, цену уже в измерения перекинул :)
69 Контакт
 
05.06.08
15:31
(68) ага. периуд сделал месяц. щас переписывается предварительно свернув таблицу вот так ТЗ.Свернуть("data_otk,id_ges,naim,tochka,id_nom,pr_otkaz,cena"," kol");
1С подвисла. что будет если в ТЗ запихнуть около 100тыс.записей. справится? )гы
70 Контакт
 
05.06.08
15:36
все еще висит. Жду....
71 Контакт
 
05.06.08
15:41
жду еще 5 мин и вырубаю 1С через контрАльтДелет
72 Fragster
 
гуру
05.06.08
15:43
надо было прогресс-бар какой-нить с обновлением через каждые 1000 строк придумать - хоть прогресс был бы виден
73 Контакт
 
05.06.08
15:44
если получится то кусочками запись зделаю по 5000. а то весит не по детски.

(67)Это попробую Если не удастцца так ТЗ.Свернуть("data_otk,id_ges,naim,tochka,id_nom,pr_otkaz,cena"," kol"); т
74 Fragster
 
гуру
05.06.08
15:45
учти, что нужно принимать в расчет то, что уже лежит в регистре. за и параметры «записать» смотри - я не помню, по умолчанию оно затирает то, что в регистре есть, или нет....
75 Контакт
 
05.06.08
15:49
(72)дык. емая. все я реализовал процес Бар показывает когда считывается записи на должном уровне. а когда доходит до ТЗ.Свернуть() Записать() там ни как процесс бар не организуешь.
76 Контакт
 
05.06.08
15:52
(72)Вроде не затирает. я придварительно по неделям попробывал. все ОК была. решил прогнать по полной программе.
77 Контакт
 
05.06.08
15:54
ООоооо..Ого-ого. получилось. записей 210 тыс. )))
78 Fragster
 
гуру
05.06.08
15:55
крута
79 Fragster
 
гуру
05.06.08
15:56
и что, без косяков?
80 Контакт
 
05.06.08
15:57
ТЗ = Новый ТаблицаЗначений;
....
....
НаборЗаписей = РегистрыСведений.zakup_otkaz.СоздатьНаборЗаписей();
Пока RS.EOF()=0 Цикл
Рег = ТЗ.Добавить();
.....
210 тыс. раз
....
RS.MoveNext();
КонецЦикла;
           ТЗ.Свернуть("data_otk,id_ges,naim,tochka,id_nom,pr_otkaz,cena"," kol");
           НаборЗаписей.Загрузить(ТЗ);
           НаборЗаписей.Записать();
           ТЗ.Очистить();

           RS.Close();
           Константы.ДатаПоследнейЗагрузки.Установить(ДатаКон);
81 Контакт
 
05.06.08
15:58
Верно. без касяков пока.
а что у меня с двоиными записями случилось по kol?
как мне теперь их исключать....в дальнейшем
82 Fragster
 
гуру
05.06.08
16:03
попробуй
Select data_otk, .... , Sum(kol) from ... Group by «все из селекта, кроме Sum(kol)» - пусть скуль сворачивает за тебя ;)
83 Fragster
 
гуру
05.06.08
16:04
а в (80) - RS.Close() сразу почле цикла делай - пусть сервер сразу освобождается, а не после того, как таблица свернется ;)
84 Контакт
 
06.06.08
08:27
(82) что то начал пробывать тестить в SQL ни фига не выходит.

Select data_otk,id_ges,naim,tochka,id_nom,pr_otkaz,cena, Sum(kol)
FROM   zakup_otkaz
Group by  ALL

(83) Сделал.
85 Контакт
 
06.06.08
08:43
У МЕНЯ ВОПРОС. Почему ДАННЫЕ КОГДА ЗАПИСЫВАЮ В РС, ДО ОНи ПОВЕРХ СТАРЫХ ПИШУТСЯ.

RS.Close();
           ТЗ.Свернуть("data_otk,id_ges,naim,tochka,id_nom,pr_otkaz,cena"," kol");
           НаборЗаписей.Загрузить(ТЗ);
           НаборЗаписей.Записать();
           ТЗ.Очистить();
86 Контакт
 
06.06.08
15:13
Все же Оказалась такая строка что в ней все параметры равны.