Имя: Пароль:
1C
1С v8
Правильный порядок записи регистра сведений
0 alexshape
 
15.11.17
16:37
Привет Всем, есть регистр сведений в котором нужно изменить данные:

1. Я отбираю данные из регистра Через конструкцию вида
набор.Отбор.Измерение1.Установить(Значение);
2. Далее я изменяю в этом наборе значение "Измерение1"
3. Выдает ошибку что нельзя изменять значения Измерений которые участвуют в отборе.

Как обойти данную проблему?
1 Cyberhawk
 
15.11.17
16:48
Создать набор с нужными данными, записать, а ненужные данные удалить
2 SeregaMW
 
15.11.17
17:09
(1) Не согласен с начало надо удалить а потом создать! ;-)
3 Cyberhawk
 
15.11.17
17:10
(2) Садись, два. Если сначала удалить, а потом при создании будет ошибка, то повторно создать уже не получится.
Это если без транзакции, конечно же.
4 SeregaMW
 
15.11.17
17:25
(3) Прекрасно работает!                НаборЗапПлощадь = РегистрыСведений.ГУТА_ИнформацияОПомещениях.СоздатьНаборЗаписей();
                    НаборЗапПлощадь.Отбор.Период.Установить(НаДату);
                    НаборЗапПлощадь.Отбор.Помещение.Установить(НовыйЭлементСпрПом.Ссылка);
                    НаборЗапПлощадь.Прочитать();
                    НаборЗапПлощадь.Очистить();
                    НовЗапись = НаборЗапПлощадь.Добавить();
                    НовЗапись.Период = НаДату;
                    НовЗапись.Помещение = НовыйЭлементСпрПом.Ссылка;
                    НовЗапись.Площадь = СтрТаб.ПлощадьПомещенияПоБТИ;
                    НовЗапись.ТипПомещения = СтрТаб.ТипПомещения;
                
                        НаборЗапПлощадь.Записать();
5 Ненавижу 1С
 
гуру
15.11.17
17:29
(4) так не сработает, у тебя ошибка будет: "нельзя изменять значения Измерений которые участвуют в отборе"
6 Мыш
 
15.11.17
17:30
(0) Нужно удалить запись с одним значением измерения и затем создать запись с другим значением измерения.
7 Ненавижу 1С
 
гуру
15.11.17
17:31
1. создать набор записей со старым отбором и прочитать его
2. создать другой набор записей с новым отбором
3. скопировать данные из старого в новый, изменяя данные касательные отбора
4. записать новый набор
5. создать набор записей со старым отбором и не читая записать его (то есть удалить!)
8 Cyberhawk
 
15.11.17
17:32
(4) Помимо сказанного в (5) не ясно, зачем ты читаешь набор перед его очисткой
9 SeregaMW
 
15.11.17
17:33
(5,6,7,8) Согласен!
10 Cyberhawk
 
15.11.17
17:33
Хотя... без Прочитать() в нем записей и не будет, ничего не очистится по идее
11 Мыш
 
15.11.17
17:34
(10) Очистится
12 SeregaMW
 
15.11.17
17:51
Прекрасно работает вот такой код!


Процедура КнопкаВыполнитьНажатие(Кнопка)
        НаборЗапПлощадь = РегистрыСведений.ГУТА_ИнформацияОПомещениях.СоздатьНаборЗаписей();
            //        НаборЗапПлощадь.Отбор.Период.Установить(НаДату);
                    НаборЗапПлощадь.Отбор.Помещение.Установить(НовыйЭлементСпрПом.Ссылка);
                    НаборЗапПлощадь.Записать();
                
                    НовЗапись = НаборЗапПлощадь.Добавить();
                    НовЗапись.Период = НаДату;
                    НовЗапись.Помещение = НовыйЭлементСпрПом.Ссылка;
                    НовЗапись.Площадь = ПлощадьПомещенияПоБТИ;
                    НовЗапись.ТипПомещения = ТипПомещения;
                    Попытка
                        НаборЗапПлощадь.Записать();
                        Сообщить("Элемент справочника ""Помещения для сдачи в аренду"" с наименованием - " + НовыйЭлементСпрПом.Наименование + " успешно записан.");
                    Исключение
                        Сообщить(ОписаниеОшибки());
                    КонецПопытки;

КонецПроцедуры
13 SeregaMW
 
15.11.17
17:51
(0) Покажи листинг!
14 Chameleon1980
 
15.11.17
17:55
отбор
прочитать
кукуку
записать
15 alexshape
 
15.11.17
18:10
(12) Мне не нужно создавать новую запись, а нужно исправить старую
16 Chameleon1980
 
15.11.17
18:22
(15) в (14) что не понятно?
17 breezee
 
15.11.17
18:32
(15) А в чем разница? Вы знаете что у записей регистров нет ссылок на себя?
18 alexshape
 
16.11.17
10:33
Разобрался, Всем спасибо, Итог такой:

1. Выбираю записи
2. Копирую текущую запись
3. Изменяю что нужно
4. Удаляю старый набор
5. Записываю новый набор в режиме "Не замещать"

Код:

НаборЗаписей = РегистрыСведений.МОЭСК_КомментарииКДокументам.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.ОтветПолучен.Установить(Ложь);
    НаборЗаписей.Отбор.РуководителиПроинформированыОПросрочке.Установить(Ложь);
    НаборЗаписей.Отбор.КлиентПроинформирован.Установить(Ложь);
    НаборЗаписей.Прочитать();
    
    Для каждого Запись Из НаборЗаписей Цикл
        
        НовыйНаборДляЗаписи = РегистрыСведений.МОЭСК_КомментарииКДокументам.СоздатьНаборЗаписей();
        НоваяЗапись  = НовыйНаборДляЗаписи.Добавить();
        ЗаполнитьЗначенияСвойств(НоваяЗапись, Запись);
        
        Если УсловиеВыполняется  Тогда
            
            НоваяЗапись.РуководителиПроинформированыОПросрочке = Истина;
            НоваяЗапись.ОтветПолучен = Истина;
            НоваяЗапись.ТекстОтвета = "Это Победа";

        КонецЕсли;
        
    КонецЦикла;
    
    
    Если НаборЗаписей.Количество() > 0 Тогда
        НаборЗаписей.Очистить();
        НаборЗаписей.Записать();
        НовыйНаборДляЗаписи.Записать(Ложь);        
    КонецЕсли;