Имя: Пароль:
1C
1С v8
регистр сведений следующий набор записей
0 xrix
 
26.03.18
07:15
Добрый день!

Прошу помощи, так как только начинаю изучать 1с.

Есть внешняя СУБД, в ней хранятся логи.
Подключаюсь через 1С, через ADODB. Заношу все данные в Таблицу значений и записываю в регистр сведений (не периодический). Скажем через 10 минут мне нужно снова выполнить эту процедуру.
Вся проблема в том, что происходит полная перезапись всего того что уже есть в регистре, или же получилось так что записи задваиются, а мне нужно сделать так что бы записывалось только то, чего нет в регистре, т.е. только новые строки в внешней БД. В БД нет уникальных записей, есть строки которые могут полностью повторятся и нет поле ID строки
1 1Сергей
 
26.03.18
07:19
Покажи как делаешь
2 Мимохожий Однако
 
26.03.18
07:22
Информации недостаточно, а кофе для гадания закончилось. Пиши подробно, не стесняйся.
3 xrix
 
26.03.18
07:26
&НаСервере
Процедура ТЗ(RS);
    
        НаборЗаписей = РегистрыСведений.ЛогиТМГ.СоздатьНаборЗаписей();
        НаборЗаписей.Прочитать();
          ЧислоЗаписей=НаборЗаписей.Количество();
    

        
// Добавим в таблицу значений колонки

ТЗ = Новый ТаблицаЗначений;
        ТЗ.Колонки.Добавить("GMTlog");
        ТЗ.Колонки.Добавить("SrvName");
        ТЗ.Колонки.Добавить("CLUserName");
        ТЗ.Колонки.Добавить("DstHost");
        ТЗ.Колонки.Добавить("DstHostPort");
        ТЗ.Колонки.Добавить("RefSRV");
        ТЗ.Колонки.Добавить("UserTime");
        ТЗ.Колонки.Добавить("ByteLoad");
        ТЗ.Колонки.Добавить("ByteSend");
        ТЗ.Колонки.Добавить("Protocol");
        ТЗ.Колонки.Добавить("Transport");
        ТЗ.Колонки.Добавить("Rule");
        ТЗ.Колонки.Добавить("NUM");
    
    
    //Сч = 0;
    
    Если RS.BOF = Ложь Тогда
        RS.MoveFirst();
        Пока RS.EOF = Ложь Цикл
            
                                    
                Строка = ТЗ.Добавить();
                Строка.GMTlog         = RS.Fields("GmtLogTime").Value;
                Строка.SrvName         = RS.Fields("ServerName").Value;
                Строка.CLUserName     = RS.Fields("ClientUserName").Value;
                Строка.DstHost         = RS.Fields("DestHost").Value;
                Строка.DstHostPort     = RS.Fields("DestHostPort").Value;
                Строка.RefSRV          = RS.Fields("referredserver").Value;
                Строка.UserTime        = RS.Fields("processingtime").Value;
                Строка.ByteLoad        = RS.Fields("bytesrecvd").Value;
                Строка.ByteSend     = RS.Fields("bytessent").Value;
                Строка.Protocol     = RS.Fields("Protocol").Value;
                Строка.Transport     = RS.Fields("Transport").Value;
                Строка.Rule         = RS.Fields("Rule").Value;
                Строка.num             = ЧислоЗаписей + 1;
                ЧислоЗаписей         = ЧислоЗаписей + 1;

                    
                //Если Строка.num > 10 Тогда
                //    Прервать;
                //КонецЕсли;        
            RS.MoveNext();
        КонецЦикла;
    КонецЕсли;
    
Сообщить("сумма строк в регистре: " + ЧислоЗаписей);    
Сообщить("Число строк в ТЗ: " + ТЗ.Количество());
ДобавлениеЗаписиВРегистр(ТЗ, RS);

КонецПроцедуры

/////////////////////////////Запись в регистр

&НаСервере
Процедура ДобавлениеЗаписиВРегистр(ТЗ, RS);
    
    НаборЗаписей = РегистрыСведений.ЛогиТМГ.СоздатьНаборЗаписей();
    
    Для Каждого Строка из ТЗ Цикл
        //НаборЗаписей.Отбор.NUM.Установить(ЧислоЗаписей+1);    
        //НаборЗаписей.Прочитать();
        //ЗаполнитьЗначенияСвойств(НаборЗаписей.Добавить(), Строка);
                        
        Запись = НаборЗаписей.Добавить();
        Запись.NUM = Строка.Num;
        Запись.GMTlog = Строка.GMTlog;
        Запись.SrvName = Строка.SrvName;
        Запись.CLUserName = Строка.CLUserName;
        Запись.DstHost = Строка.DstHost;
        Запись.DstHostPort = Строка.DstHostPort;
        Запись.RefSRV = Строка.RefSRV;
        Запись.UserTime = Строка.UserTime;
        Запись.ByteLoad = Строка.ByteLoad;
        Запись.ByteSend = Строка.ByteSend;
        Запись.Protocol = Строка.Protocol;
        Запись.Transport = Строка.Transport;
        Запись.Rule = Строка.Rule;
    
    КонецЦикла;    
    
    НаборЗаписей.Записать()
    
КонецПроцедуры;
4 PuhUfa
 
26.03.18
07:28
(3) Структура РС какая?
5 Мимохожий Однако
 
26.03.18
07:28
После создания набора записей, надо сделать отбор (ты не сделал). Потом прочитать по этому отбору, а потом уже записывать. А так ты либо всё стираешь, т.к. не отобрал, либо делаешь дубли
6 xrix
 
26.03.18
07:33
можно по подробнее про отбор и чтение, в какой момент это нужно сделать?
7 Мимохожий Однако
 
26.03.18
07:42
(6) Ctrl-F1
8 xrix
 
26.03.18
07:43
ну спасибо
9 ПегийЛунь
 
26.03.18
07:56
10 xrix
 
26.03.18
10:05
необходимо создать новую процедуру пере записью и там делать отбор?
11 xrix
 
26.03.18
10:10
в моем понимание это работает так. Есть у меня в регистре скажем 10000 записей, через опреденное время мне снова нужно записать новый набор данных в котором уже 20000 записей 10к из которых уже записаны в регистр, соответственно при после того как сформируется таблица значений из 20000 записей будет происходить сравнение и удалятся эти дубликаты?
12 hhhh
 
26.03.18
10:11
(10) ну вы пишете

Процедура ДобавлениеЗаписиВРегистр(ТЗ, RS);
    
    НаборЗаписей = РегистрыСведений.ЛогиТМГ.СоздатьНаборЗаписей();

то есть создаете еще один набор записей. Он совершенно чист. Его и записываете.

Зачем вы это делаете?
13 hhhh
 
26.03.18
10:14
(11) вам надо как-то типа

ТЗ = НАборЗаписей.ВЫгрузить();

потом дописываете в конец ТЗ данные

потом

НаборЗаписей.Загрузить(ТЗ);
НаборЗаписей.Записать();
14 Cool_Profi
 
26.03.18
10:22
А теперь представим, что в регистре уже есть 100500 записей...
может, проще писать через менеджер?