Имя: Пароль:
1C
1C 7.7
v7: Не сохраняется измененные значение атрибута
0 Dima_ret
 
11.06.13
05:13
Нужно изменить значение реквизита "Минимальный остаток" у конкретной номенклатуры.

Делаю это вот так:    

Если СпрТовар.НайтиПоКоду("21-21") = 1 тогда
   а=СпрТовар.ТекущийЭлемент();
   Сообщить(а.ПолучитьАтрибут("МинОстаток"));
   а.УстановитьАтрибут("МинОстаток",300);
   СпрТовар.Записать();
   Сообщить(а.ПолучитьАтрибут("МинОстаток"));        
КонецЕсли

При выполнении ошибок не выдает, считывает и выводит правильное значение 540. Записывает, опять выводит нужное значение 300, но в карточке номенклатуры значение не меняется.

P.S. Я в 1С пишу первый раз, до этого писал на С#, где-то туплю, но не могу понять где.
1 Sserj
 
11.06.13
05:15
СпрТовар.УстановитьАтрибут("МинОстаток",300);
СпрТовар.Записать();
Сообщить(СпрТовар.ПолучитьАтрибут("МинОстаток"));
2 Sserj
 
11.06.13
05:16
В твоем варианте ты получаешь ССЫЛКУ на объект, при первом обращении (получитьАтрибут) все заново читается из БД и получаешь/устанавливаешь ты как бы уже не в СпрТовар а в другой копии объекта.
3 Sserj
 
11.06.13
05:23
+ еще мысля как объяснить :)
СпрТовар.ТекущийЭлемент() - возращает ссылку не на СпрТовар (как тебе показалось бы логичным в C#) а внутренний ИД этого элемента в базе, тобишь типа гуид в базе. И при обращении к элементам по этому гуиду заново перечитываются данные и в памяти формируется новый экземпляр этого справочника.
4 Dima_ret
 
11.06.13
05:24
Sserj, ага понял, исправил, работает. Огромное спасибо.
5 Dolly_EV
 
11.06.13
14:13
Ну и еще до кучи:
1. вот так короче будет:
Если СпрТовар.НайтиПоКоду("21-21") = 1 тогда
   СпрТовар.МинОстаток=300;
   СпрТовар.Записать();
КонецЕсли

2. За НайтиПоКоду("21-21") тебя твои последователи недобрым словом помянут
6 dedmoroz777
 
11.06.13
14:30
(5) НайтиПоКоду("(21-20)/(21-21)>0")=1