Имя: Пароль:
1C
 
Свертка записей РС менеджером записи
,
0 rowvg
 
naïve
14.11.22
15:38
Есть регистр сведений, независимый, период День - Товар - Склад

Почему вот такой код

Процедура Команда1НаСервере()
    Запрос = Новый Запрос;
    Запрос.Текст = "
    |ВЫБРАТЬ Период, Товар, Склад
    |ИЗ РегистрСведений.Цены";
    Выборка = Запрос.Выполнить().Выбрать();
    МенеджерЗаписи = РегистрыСведений.Цены.СоздатьМенеджерЗаписи();
    Пока Выборка.Следующий() Цикл
        МенеджерЗаписи = РегистрыСведений.Цены.СоздатьМенеджерЗаписи();
    
        МенеджерЗаписи.Период = Выборка.Период;
        МенеджерЗаписи.Товар = Выборка.Товар;
        МенеджерЗаписи.Склад = Выборка.Склад;
        
        МенеджерЗаписи.Цена = 1;
        МенеджерЗаписи.Записать(Истина);    
    КонецЦикла;
КонецПроцедуры

устанавливает всем записям в регистре цену = 1, а вот такой

Процедура Команда1НаСервере()
    МенеджерЗаписи = РегистрыСведений.Цены.СоздатьМенеджерЗаписи();
    
    Запрос = Новый Запрос;
    Запрос.Текст = "
    |ВЫБРАТЬ Период, Товар, Склад
    |ИЗ РегистрСведений.Цены";
    Выборка = Запрос.Выполнить().Выбрать();
    МенеджерЗаписи = РегистрыСведений.Цены.СоздатьМенеджерЗаписи();
    Пока Выборка.Следующий() Цикл
        МенеджерЗаписи.Период = Выборка.Период;
        МенеджерЗаписи.Товар = Выборка.Товар;
        МенеджерЗаписи.Склад = Выборка.Склад;
        
        МенеджерЗаписи.Цена = 1;
        МенеджерЗаписи.Записать(Истина);    
    КонецЦикла;
КонецПроцедуры

сворачивает все записи до одной. То есть в регистре остается только одна запись с измерениями, которые в выборке были последними.
1 vicof
 
14.11.22
16:09
А немножко подумать? Совсем чуть-чуть?
2 rowvg
 
naïve
14.11.22
16:28
(1) Не выделывайся. Если знаешь - напиши, а нет - проходи мимо.
3 Kassern
 
14.11.22
16:35
(0)
  МенеджерЗаписи = РегистрыСведений.Цены.СоздатьМенеджерЗаписи();
    Пока Выборка.Следующий() Цикл
        МенеджерЗаписи = РегистрыСведений.Цены.СоздатьМенеджерЗаписи();

VS

МенеджерЗаписи = РегистрыСведений.Цены.СоздатьМенеджерЗаписи();
    Пока Выборка.Следующий() Цикл
4 rowvg
 
naïve
14.11.22
16:38
(3) Не влияющая на процесс опечатка

    МенеджерЗаписи = РегистрыСведений.Цены.СоздатьМенеджерЗаписи();
        
    Запрос = Новый Запрос;
    Запрос.Текст = "
    |ВЫБРАТЬ Период, Товар, Склад
    |ИЗ РегистрСведений.Цены";
    Выборка = Запрос.Выполнить().Выбрать();
    Пока Выборка.Следующий() Цикл
        МенеджерЗаписи.Период = Выборка.Период;
        МенеджерЗаписи.Товар = Выборка.Товар;
        МенеджерЗаписи.Склад = Выборка.Склад;
        
        МенеджерЗаписи.Цена = 1;
        МенеджерЗаписи.Записать(Истина);    
    КонецЦикла;


и  


    Запрос = Новый Запрос;
    Запрос.Текст = "
    |ВЫБРАТЬ Период, Товар, Склад
    |ИЗ РегистрСведений.Цены";
    Выборка = Запрос.Выполнить().Выбрать();
    Пока Выборка.Следующий() Цикл
        МенеджерЗаписи = РегистрыСведений.Цены.СоздатьМенеджерЗаписи();
        
        МенеджерЗаписи.Период = Выборка.Период;
        МенеджерЗаписи.Товар = Выборка.Товар;
        МенеджерЗаписи.Склад = Выборка.Склад;
        
        МенеджерЗаписи.Цена = 1;
        МенеджерЗаписи.Записать(Истина);    
    КонецЦикла;
5 rowvg
 
naïve
14.11.22
16:40
если использовать Прочитать() то работает правильно в обоих случаях. Всегда вызываю Прочитать() в таких случаях и с подобным раньше не встречался.
6 rowvg
 
naïve
14.11.22
16:51
Или без чтения данных нельзя работать с менеджером записи?
7 SleepyHead
 
гуру
14.11.22
16:56
(5) А у меня в подобной ситуации не помогало. Но я чайник тоже в 1с.

Помогло то, что всегда создавал новый менеджер, как и советовали выше.
8 rowvg
 
naïve
14.11.22
17:02
(7) С прочитать все работает
    МенеджерЗаписи = РегистрыСведений.Цены.СоздатьМенеджерЗаписи();
        
    Запрос = Новый Запрос;
    Запрос.Текст = "
    |ВЫБРАТЬ Период, Товар, Склад
    |ИЗ РегистрСведений.Цены";
    Выборка = Запрос.Выполнить().Выбрать();
    Пока Выборка.Следующий() Цикл
        МенеджерЗаписи.Период = Выборка.Период;
        МенеджерЗаписи.Товар = Выборка.Товар;
        МенеджерЗаписи.Склад = Выборка.Склад;
        
        МенеджерЗаписи.Прочитать();
        Если МенеджерЗаписи.Выбран() Тогда
            МенеджерЗаписи.Цена = 1;
            МенеджерЗаписи.Записать(Истина);    
        КонецЕсли;
    КонецЦикла;