Имя: Пароль:
1C
1С v8
Независимый периодический регистр сведений, при обновлении удаляются записи
,
0 Benevalete
 
09.08.16
08:29
Самописная конфигурация, помогите найти недочет в коде(код не мой)
Выборка - это ком-объект из другой информационной базы
    
Рег = РегистрыСведений.СотрудникиОрганизации.СоздатьНаборЗаписей();

    ДатаИзВыборки = '00010101';    
    ПоследняяДата = '00010101';
    ПоследнийТН = "00000";
    
    Если Выборка.Количество() <> 0 Тогда
        Пока Выборка.Следующий() Цикл
            Если ДатаИзВыборки <> Выборка.ПериодРег Тогда  
                Если ДатаИзВыборки <> '00010101' Тогда  
                    Рег.Записать(); //Зачем записывать тут - чтобы не записывать когда еще нет ни одной записи?    
                КонецЕсли;
                ДатаИзВыборки = Выборка.ПериодРег;
                Рег = РегистрыСведений.СотрудникиОрганизации.СоздатьНаборЗаписей();  
                Рег.Отбор.Период.Установить(ДатаИзВыборки);  
              КонецЕсли;
            Зап = Рег.Добавить();
    
            Зап.Сотрудник = Справочники.Пропуски.НайтиПоКоду(Выборка.ТабельныйНомер);
                
    
            ПоследняяДата = ДатаИзВыборки;
            ПоследнийТН = Справочники.Пропуски.НайтиПоКоду(Выборка.ТабельныйНомер);
            Зап.Период = ДатаИзВыборки;
            
        КонецЦикла;
        Попытка
            Рег.Записать();
        Исключение
            Сообщить("Ошибка " + Выборка.ТабельныйНомер + " Дата " + ДатаИзВыборки);    
        КонецПопытки;    
    КонецЕсли;

http://prnt.sc/c3dn85 скриншот: при обновление с 1.07 по любое число пропадает запись, как будто затирается, если же обновлять с 30.06 по любое число, то запись остается
Выборка.ПериодРег - это дата кадрового события, для записи которая пропадает это 01.07.2016 00:00:01
1 DrZombi
 
гуру
09.08.16
08:34
(0) Просветись...
Для удаления записи нужны всего две команды

1.   Рег = РегистрыСведений.СотрудникиОрганизации.СоздатьНаборЗаписей();
2.   Рег.Записать();//Зачем записывать тут - чтобы не записывать когда еще нет ни одной записи?    

Для того, что бы удалить не все, а только по какому либо измерению, то в наборе организуют отбор, а потом вызывают Записать.

...
Если после отбора вызвать команду "Прочитать", то при вызове команды "Записать", Регистр сохранит свои записи :)
2 DrZombi
 
гуру
09.08.16
08:35
(1) >>>> Для удаления записи нужны всего две команды

Удаляются ВСЕ записи :)
3 DrZombi
 
гуру
09.08.16
08:36
+(1)  Претензия к 1С, они чет поленились организовать нормальную команду "Удалить". Решили сократить кодомарательство :)
4 Benevalete
 
09.08.16
08:50
(1) (2) Да, я знаю, подобный код очищает регистр полностью, тк записывается пустой набор записей (3) В 1С есть нормальная команда удалить, для нее также есть отбор, подробно расписана в синтакс помошнике
5 Горогуля
 
09.08.16
08:51
(4) поздравляю, чо
6 Benevalete
 
09.08.16
08:52
(1) То есть правильно будет как-то так:

Рег = РегистрыСведений.СотрудникиОрганизации.СоздатьНаборЗаписей();

    ДатаИзВыборки = '00010101';    
    ПоследняяДата = '00010101';
    ПоследнийТН = "00000";
    
    Если Выборка.Количество() <> 0 Тогда
        Пока Выборка.Следующий() Цикл
            Если ДатаИзВыборки <> Выборка.ПериодРег Тогда  
                Если ДатаИзВыборки <> '00010101' Тогда
             Рег.Отбор.Период.Установить(Выборка.ПериодРег)
Рег.прочитать()
                    Рег.Записать();    

                КонецЕсли;
                ДатаИзВыборки = Выборка.ПериодРег;
                Рег = РегистрыСведений.СотрудникиОрганизации.СоздатьНаборЗаписей();  
                Рег.Отбор.Период.Установить(ДатаИзВыборки);  
              КонецЕсли;
            Зап = Рег.Добавить();
    
            Зап.Сотрудник = Справочники.Пропуски.НайтиПоКоду(Выборка.ТабельныйНомер);
                
    
            ПоследняяДата = ДатаИзВыборки;
            ПоследнийТН = Справочники.Пропуски.НайтиПоКоду(Выборка.ТабельныйНомер);
            Зап.Период = ДатаИзВыборки;
            
        КонецЦикла;
        Попытка
            Рег.Записать();
        Исключение
            Сообщить("Ошибка " + Выборка.ТабельныйНомер + " Дата " + ДатаИзВыборки);    
        КонецПопытки;    
    КонецЕсли;
7 Benevalete
 
09.08.16
08:53
(5) Если сказать больше нечего, не лезь со своим "чо" )
8 Горогуля
 
09.08.16
08:54
(7) а ещё я чавкаю, когда ем. чо?
9 DDwe
 
09.08.16
08:55
Не ссорьтесь дамы и господа.
10 Горогуля
 
09.08.16
08:57
(9) зпт ;)
11 DrZombi
 
гуру
09.08.16
09:02
(4) Знаешь, что тогда спрашивать? Учись разбираться в своем коде. У тебя Только удаляет записи  :)
12 DrZombi
 
гуру
09.08.16
09:02
(6) Не знаю... тебе решать Как правильно :)
13 DrZombi
 
гуру
09.08.16
09:03
(4) >> В 1С есть нормальная команда удалить, для нее также есть отбор, подробно расписана в синтакс помошнике

Ты не путай, Удалить из списка отобранных записей. И Удалить запись в Регистре непосредственно :)
14 DrZombi
 
гуру
09.08.16
09:05
+(6) ... Ты чет похоже плохо внял тексту в (1)... Еще раз прочитай, и думай :)

Понафтыкал везде "Читать". :)
15 Benevalete
 
09.08.16
09:39
(11) В своем коде разобраться проблем нет, а вот чужой уже другое дело, тем более я новичок :)
16 Benevalete
 
09.08.16
09:41
(14) Буду очень признательна, если простым языком объясните значение метода прочитать(). Отбор - накладывает отбор, записать() сохраняет записи, а для чего метод прочитать?
17 DDwe
 
09.08.16
09:46
(10) специально "," )))
18 DrZombi
 
гуру
09.08.16
09:56
(16) "Сперва была тьма"...

1. СоздатьНаборЗаписей - Объявляешь переменную, что будешь работать с НАБОРОМ записей.
2. У набора есть отбор, посмотри в Синтаксис помощнике.
3. Есть команда "Прочитать" - Она как бы считывает записи из Регистра и хранит у себя в памяти или где то там :)
4. Записать - Если ты выполнил команду "Прочитать", то команда "Записать" поместит прочитанный список обратно в Регистр.
5. Следовательно "Удалить" записи делается так же просто, как прочитать. Если ты нечего не читал, то в Регистр поместится пустой список, следовательно, если там были записи, то они удалятся.
6. Пользуйся Гуглом, большинство твоих вопросов, уже обсосано аж с 2009 года :)
19 Benevalete
 
09.08.16
10:47
(18) Спасибо, тьма начала рассеиваться :)
20 hhhh
 
09.08.16
10:57
(19) да,
Прочитать() и тут же Записать() - это дикость.