Имя: Пароль:
1C
 
Добавление, запись значений в регистр сведений
,
0 falselight
 
11.06.18
06:13
УТ 10.3. Регистр сведений ЗначенияСвойствОбъектов.
С обработки нужно добавить или изменить его свойства
длина, ширина, высота у справочника номенклатура.
Как это правильно делать в коде?

Подойдет ли такой пример?


НаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей();
Валюта = Справочники.Валюты.НайтиПоНаименованию("EUR");
НаборЗаписей.Отбор.Валюта.Установить(Валюта);
НаборЗаписей.Отбор.Период.Установить(НачалоДня(ТекущаяДата()));
НаборЗаписей.Прочитать();

Если НаборЗаписей.Количество() = 0 Тогда
    
    //Добавление новой записи    
    НоваяЗапсиь = НаборЗаписей.Добавить();
    НоваяЗапсиь.Валюта = Валюта;
    НоваяЗапсиь.Период = ТекущаяДата();
    НоваяЗапсиь.Курс = 10.00;
    
Иначе    
    
    //Изменение существующей записи
    НаборЗаписей[0].Валюта = Валюта;
    НаборЗаписей[0].Период = ТекущаяДата();
    НаборЗаписей[0].Курс = 10.00;
    
КонецЕсли;

//Удалить существующую запись
НаборЗаписей.Удалить(НаборЗаписей[0]);

//После добавления, изменения, удаления записей
//необходимо вызвать метод Записать
НаборЗаписей.Записать();
1 Cool_Profi
 
11.06.18
06:39
Прокатит. Ты начал делать успехи...
2 Сти
 
11.06.18
07:00
А НаборЗаписей.Удалить(НаборЗаписей[0]) зачем? Удалить то, что только что создал/изменил?
3 Смотрящий
 
11.06.18
07:03
(0) А ты уверен что получаешь одну запись ?
4 falselight
 
11.06.18
07:11
(2) В примере так было.

А если регистр непериодический независимый?
5 falselight
 
11.06.18
07:11
(3) В примере так было, я узнаю как правильно нужно.
6 Смотрящий
 
11.06.18
07:35
(5) Посмотри как пишет ут10.3 регистр сведений при записи номенклатуры
7 falselight
 
11.06.18
07:45
(6) В каком модуле?
8 falselight
 
11.06.18
07:45
(6) Типовой код лучше не смотреть вообще!!! Что бы голову не сломать.....
9 falselight
 
11.06.18
07:49
Запись в непериодический, независимый регистр сведений
ЗначенияСвойствОбъектов вот так верно?

Процедура ЗаписатьЗначениеСвойства(Номенклатура, Свойство, Значение)
    НаборЗаписей = РегистрыСведений.ЗначенияСвойствОбъектов.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Объект.Установить(Номенклатура);
    НаборЗаписей.Отбор.Свойство.Установить(Свойство);
    НаборЗаписей.Прочитать();
    Если НаборЗаписей.Количество() = 0 Тогда
        //Добавление новой записи    
        НоваяЗапсиь          = НаборЗаписей.Добавить();
        НоваяЗапсиь.Значение = Значение;
    Иначе    
        //Изменение существующей записи
        НоваяЗапсиь          = НаборЗаписей.Добавить();
        НоваяЗапсиь.Значение = Значение;
    КонецЕсли;
    НаборЗаписей.Записать();
КонецПроцедуры
10 Смотрящий
 
11.06.18
08:17
(9) НаборЗаписей вотличии от менеджера работает не с одной записьвю а с кучей. Куча определяется в .Отбор, твое записать вызовет очистку кучи и запись одной записи.
11 Остап Сулейманович
 
11.06.18
08:17
(9)
1. Зачем нужно "Если" когда код и в ветке "Да" и в ветке "Нет" один и тот же?
2. Для работы с единственной записью проще использовать МенеджерЗаписи. Например :
Запись = РегистрыСведений.ЗначенияСвойствОбъектов.СоздатьМенеджерЗаписи();
Запись.Номенклатура = ...;
Запись.Свойство = ...;
Запись.Значение = Значение;
Запись.Записать(Истина); //Параметр "Истина" позволяет не беспокоиться по поводу наличия/отсутствия записи.
12 Остап Сулейманович
 
11.06.18
08:18
(10) "записать вызовет очистку". Не вызовет. Именно очистку.
13 Смотрящий
 
11.06.18
08:20
(12) и что же оно сделает ?
14 Остап Сулейманович
 
11.06.18
08:21
+ (12) Когда выполняется "Набор.Прочитать()" - в набор выбираются все СУЩЕСТВУЮЩИЕ записи определенные отбором.
Потом вы над этим набором изгаляетесь (добавляете/корректируете/удаляете/очищаете...). При выполнении "Набор.Записать()" все что было в соответствии с отбором заменяется на то, что в наборе.
15 falselight
 
11.06.18
08:23
(11) В одной ветке есть добавить()
16 falselight
 
11.06.18
08:24
Подскажите правильный аналог (9)
17 Остап Сулейманович
 
11.06.18
08:27
(15)
Если НаборЗаписей.Количество() = 0 Тогда
    //Добавление новой записи    
    НоваяЗапсиь          = НаборЗаписей.Добавить();
    НоваяЗапсиь.Значение = Значение;
Иначе    
    //Изменение существующей записи
    НоваяЗапсиь          = НаборЗаписей.Добавить();
    НоваяЗапсиь.Значение = Значение;
КонецЕсли;

Найдите 2 отличия кроме комментария.
18 Остап Сулейманович
 
11.06.18
08:28
(16)
Если НаборЗаписей.Количество() = 0 Тогда
    НоваяЗапсиь = НаборЗаписей.Добавить();
КонецЕсли;
НаборЗаписей[0].Значение = Значение;
19 falselight
 
11.06.18
08:49
(18) Опечатка там была, вот так верно?




Процедура ЗаписатьЗначениеСвойства(Номенклатура, Свойство, Значение)
    НаборЗаписей = РегистрыСведений.ЗначенияСвойствОбъектов.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Объект.Установить(Номенклатура);
    НаборЗаписей.Отбор.Свойство.Установить(Свойство);
    НаборЗаписей.Прочитать();
    Если НаборЗаписей.Количество() = 0 Тогда
        //Добавление новой записи    
        НоваяЗапсиь          = НаборЗаписей.Добавить();
        НоваяЗапсиь.Значение = Значение;
    Иначе    
        //Изменение существующей записи
        НоваяЗапсиь.Значение = Значение;
    КонецЕсли;
    НаборЗаписей.Записать();
КонецПроцедуры
20 falselight
 
11.06.18
08:50
(10) Как верно подскажите?
21 Мимохожий Однако
 
11.06.18
08:54
После Иначе ошибка
нет перебора записей. Ты же объявил набор записей.
............
Лучше использовать .СоздатьМенеджерЗаписи()
как советовали в (9)
22 falselight
 
11.06.18
08:54
(19) Это не работает, подскажите как правильно?
23 Остап Сулейманович
 
11.06.18
08:58
(22) У тебя пост (18) не отображается?
24 Остап Сулейманович
 
11.06.18
09:03
Вот так будет работать гарантировано.

Процедура ЗаписатьЗначениеСвойства(Номенклатура, Свойство, Значение)
    НаборЗаписей = РегистрыСведений.ЗначенияСвойствОбъектов.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Объект.Установить(Номенклатура);
    НаборЗаписей.Отбор.Свойство.Установить(Свойство);
    НаборЗаписей.Прочитать();
    НаборЗаписей.Очистить(); //пока просто так. Без объяснений
    НоваяЗапсиь          = НаборЗаписей.Добавить();
    НоваяЗапсиь.Значение = Значение;
    НаборЗаписей.Записать();
КонецПроцедуры
25 falselight
 
11.06.18
09:05
(24) Спасибо, беру пробовать.

А как будет если через менеджер записи?
26 falselight
 
11.06.18
09:07
(24) http://joxi.ru/1A5KyJnhnbKMXm

ошибка!
27 Остап Сулейманович
 
11.06.18
09:07
(25)
Процедура ЗаписатьЗначениеСвойства(Номенклатура, Свойство, Значение)
    Запись = РегистрыСведений.ЗначенияСвойствОбъектов.СоздатьМенеджерЗаписи();
    Запись.Номенклатура = Номенклатура;
    Запись.Свойство = Свойство;
    Запсиь.Значение = Значение;
    Записей.Записать(Истина);
КонецПроцедуры
28 Остап Сулейманович
 
11.06.18
09:08
(27) Исправить
Процедура ЗаписатьЗначениеСвойства(Номенклатура, Свойство, Значение)
    Запись = РегистрыСведений.ЗначенияСвойствОбъектов.СоздатьМенеджерЗаписи();
    Запись.Объект = Номенклатура; //Вот здесь
    Запись.Свойство = Свойство;
    Запсиь.Значение = Значение;
    Записей.Записать(Истина);
КонецПроцедуры
29 Остап Сулейманович
 
11.06.18
09:09
(26) Так при вызове нужно Номеклатуру указывать.
30 falselight
 
11.06.18
09:12
Это пример на изменение записи.
А если нужно добавить?

Процедура ЗаписатьЗначениеСвойства(Номенклатура, Свойство, Значение)
    НаборЗаписей = РегистрыСведений.ЗначенияСвойствОбъектов.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Объект.Установить(Номенклатура);
    НаборЗаписей.Отбор.Свойство.Установить(Свойство);
    НаборЗаписей.Прочитать();
    НаборЗаписей.Очистить();

    НоваяЗапись          = НаборЗаписей.Добавить();
    НоваяЗапись.Объект   = Номенклатура;
    НоваяЗапись.Свойство = Свойство;
    НоваяЗапись.Значение = Значение;
    НаборЗаписей.Записать();
КонецПроцедуры
31 Остап Сулейманович
 
11.06.18
09:16
(30) Тогда не нужно НаборЗаписей.Очистить();
Но есть одна фишка. Не может быть несколько записей с одинаковым набором измерений. Будешь пытаться множить такие записи - получишь ошибку.
32 falselight
 
11.06.18
09:18
(31) Если без очистить, дублировать же будет??????
Создавать новые????
33 falselight
 
11.06.18
09:19
(32 +) Тут и нужно вставлять если.
Или добавлять или изменять.
34 Остап Сулейманович
 
11.06.18
09:24
(33) Ты (18) уже осознал? Или где?
35 falselight
 
11.06.18
09:41
(34) Учитывая 18 какой будет финальный вариант?
36 Остап Сулейманович
 
11.06.18
09:45
(35) На.
Процедура ЗаписатьЗначениеСвойства(Номенклатура, Свойство, Значение)
    НаборЗаписей = РегистрыСведений.ЗначенияСвойствОбъектов.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Объект.Установить(Номенклатура);
    НаборЗаписей.Отбор.Свойство.Установить(Свойство);
    НаборЗаписей.Прочитать();
    Если НаборЗаписей.Количество() = 0 Тогда
        НоваяЗапись = НаборЗаписей.Добавить();
        НоваяЗапись.Объект   = Номенклатура;
        НоваяЗапись.Свойство = Свойство;
    Иначе
        НоваяЗапись = НаборЗаписей[0];
    КонецЕсли;
    НоваяЗапись.Значение = Значение;
    НаборЗаписей.Записать();
КонецПроцедуры
37 falselight
 
11.06.18
10:01
(36) Большое спасибо!
38 1Сергей
 
11.06.18
10:34
как можно было так протупить имея пример из (0)?
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.