Имя: Пароль:
1C
1С v8
8.2 Чтение и запись регистра сведений
0 Надежда25
 
02.11.11
14:16
Добрый день!
Очень нужна помощь. v8.2. Есть справочник Номенклатура с табличной частью Характеристики (тип РегистрСведенийНаборЗаписей.ЗначенияСвойствНоменклатуры). Регистр независимый, непериодический. Измерения: Номенклатура, Свойство, ресурс: ЗначениеСвойства. При открытии формы элемента справочника надо читать из регистра, при записи - записывать. Не происходит ни того, ни другого. Вот код:
&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
НаборЗаписей = РегистрыСведений.ЗначенияСвойствНоменклатуры.СоздатьНаборЗаписей();
Для Каждого Запись Из НаборЗаписей Цикл
  НаборЗаписей.Отбор.Номенклатура.Установить(Объект.Ссылка);
  ТекущийОбъект.ХарактеристикиСвойство = Запись.Свойство;
       ТекущийОбъект.ХарактеристикиЗначениеСвойства =   Запись.ЗначениеСвойства;
КонецЦикла;
НаборЗаписей.Прочитать();
НаборЗаписей.Записать();
КонецПроцедуры

&НаСервере
Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
Для Каждого Стр Из ТекущийОбъект.Характеристики Цикл
  Запись = РегистрыСведений.ЗначенияСвойствНоменклатуры.СоздатьМенеджерЗаписи();
  Запись.Номенклатура = ТекущийОбъект.Ссылка;
  Запись.Свойство = Стр.Свойство;
  Запись.ЗначениеСвойства = Стр.ЗначениеСвойства;
  Запись.Записать();
КонецЦикла;
КонецПроцедуры
1 Axel2009
 
02.11.11
14:21
при чтении для каждого набора записей можно установить только один отбор. либо список указывать. и зачем при чтении записывать?
2 luckyluke
 
02.11.11
14:23
(0) в момент когда ты перебираешь записи - набор записей пустой.
Попробуй так:
&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
НаборЗаписей = РегистрыСведений.ЗначенияСвойствНоменклатуры.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Номенклатура.Установить(Объект.Ссылка);
НаборЗаписей.Прочитать();
Для Каждого Запись Из НаборЗаписей Цикл
  ТекущийОбъект.ХарактеристикиСвойство = Запись.Свойство;
       ТекущийОбъект.ХарактеристикиЗначениеСвойства =   Запись.ЗначениеСвойства;
КонецЦикла;
КонецПроцедуры
3 Надежда25
 
02.11.11
14:30
(2) Все равно не пишет.
4 ice777
 
02.11.11
14:31
(3) а Записать()
5 Надежда25
 
02.11.11
14:48
Сейчас так:
&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
   НаборЗаписей = РегистрыСведений.ЗначенияСвойствНоменклатуры.СоздатьНаборЗаписей();
   НаборЗаписей.Отбор.Номенклатура.Установить(Объект.Ссылка);
   НаборЗаписей.Прочитать();
   Для Каждого Запись Из НаборЗаписей Цикл
         ХарактеристикиСвойство = Запись.Свойство;
       ХарактеристикиЗначениеСвойства =   Запись.ЗначениеСвойства;
       НаборЗаписей.Записать(Истина);
     КонецЦикла;
   КонецПроцедуры
В отладчике вижу, что читает, но на форме пусто.
6 Axel2009
 
02.11.11
14:53
а где добавление новой строки в табличную часть обработки? это не 7ка
7 Надежда25
 
02.11.11
15:25
Я не знаю, как это сделать. Какой конкретно метод читать? Это на сервере? А на клиенте тоже надо обновить, или само?
8 Axel2009
 
02.11.11
15:26
Добавить()
9 evgen2011
 
02.11.11
15:34
(0) без фото не взлетит )
10 Леха Дум
 
02.11.11
15:52
(5) Жесть... Зачем перезаписывать при чтении те же самые данные? Да еще в цикле перебора набора.
11 Надежда25
 
02.11.11
15:58
(10) не поняла. Надо прочитать данные из регистра сведений в табличную часть справочника. Можно сделать проще? Хотя и это читает, но на форме не отображает.
12 Леха Дум
 
02.11.11
16:11
Таблица на форме какой тип значения имеет? Дерево, таблица значений, динамический список?
13 Надежда25
 
02.11.11
16:13
Тип: РегистрСведенийНаборЗаписей.ЗначенияСвойствНоменклатуры
14 hhhh
 
02.11.11
16:24
(13) а в поле Данные что написано?
15 Axel2009
 
02.11.11
16:25
там нужно отбор устанавливать по объекту и вызывать прочитать. ничего присваивать не нужно. это уже реализовано в ЗначенияСвойствОбъектов в типовой
16 ice777
 
02.11.11
16:33
(5) не в том месте записываешь.)
без сисек не взлетит.
17 Леха Дум
 
02.11.11
16:52
Если очень хочется, то наверно так:

Набор = РегистрыСведений.ЗначенияСвойствНоменклатуры.СоздатьНаборЗаписей();
Набор.Отбор.Номенклатура.ВидСравнения = ВидСравнения.Равно;
Набор.Отбор.Номенклатура.Значение = ТекущийОбъект.Ссылка;
Набор.Отбор.Номенклатура.Использование = Истина;
Набор.Прочитать();
ЗначениеВРеквизитФормы(Набор, "ЗдесьНаписатьИмяРеквизитаФормы");
18 Леха Дум
 
02.11.11
16:53
+(17) конечно же в событии:

&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
19 Надежда25
 
03.11.11
10:32
(17) Спасибо за ответ, но не работает. Ошибка при вызове метода контекста (ЗначениеВРеквизитФормы)
ЗначениеВРеквизитФормы(Набор, "Свойство");
Недопустимое значение параметра (параметр номер '2')

В отладчике Набор.Отбор Значение Номенклатура ="Сигары", Свойство ="".
20 hhhh
 
03.11.11
11:19
(19) причем здесь отбор? Как называется у тебя элемент формы твоя таблица? Неужели "Свойство"? Не верю.
21 Надежда25
 
03.11.11
11:31
(20) Точно, спасибо большое. ЗначениеВРеквизитФормы(Набор, "Характеристики");
А как записать, причем если записи были изменены - удалить старые, записать новые?
22 dumb851
 
03.11.11
11:35
НаборЗаписей.Прочитать(); - чтение данных из базы
НаборЗаписей.Записать();  - запись тех же данных обратно в базу

вот ничего и не меняется
23 Надежда25
 
03.11.11
12:02
Пишу:
&НаСервере
Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
  Набор = РегистрыСведений.ЗначенияСвойствНоменклатуры.СоздатьНаборЗаписей();
  Набор.Отбор.Номенклатура.Установить(ТекущийОбъект.Ссылка);
  НоваяЗапись = Набор.Добавить();
  НоваяЗапись. Номенклатура = ТекущийОбъект.Ссылка;
  НоваяЗапись.Свойство = Объект.Характеристики.Свойство;
  НоваяЗапись.ЗначениеСвойства = Объект.Характеристики.ЗначениеСвойства;
  Набор.Записать();
КонецПроцедуры
Поле объекта не обнаружено (Свойство)
   НоваяЗапись.Свойство = Объект.Характеристики.Свойство;
24 Леха Дум
 
03.11.11
12:03
если есть ЗначениеВРеквизитФормы, то наверно есть и обратное действо?

Набор = РеквизитФормыВЗначение("Характеристики");
Набор.Записать();
25 Надежда25
 
03.11.11
12:20
Вот так измененные записи перезаписываются, а новые - нет, хотя и не ругается.
&НаСервере
Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
  Набор = РегистрыСведений.ЗначенияСвойствНоменклатуры.СоздатьНаборЗаписей();
  Набор.Отбор.Номенклатура.Установить(ТекущийОбъект.Ссылка);
  Для Каждого Стр Из ТекущийОбъект.Характеристики Цикл
  НоваяЗапись = Набор.Добавить();
  НоваяЗапись. Номенклатура = ТекущийОбъект.Ссылка;
  НоваяЗапись.Свойство = Стр.Свойство;
  НоваяЗапись.ЗначениеСвойства = Стр.ЗначениеСвойства;
  Набор = РеквизитФормыВЗначение("Характеристики");
  Набор.Записать();
КонецЦикла;
26 Леха Дум
 
03.11.11
12:45
Попробуй как нарисовал в (24), только не забудь, что поле записи "Номенклатура" должно быть заполнено. Его можно заполнять в процессе добавления на форме, а можно перебрать набор:

Набор = РеквизитФормыВЗначение("Характеристики");
Для Каждого Запись Из Набор Цикл
  Запись.Номенклатура = ТекущийОбъект.Ссылка;
КонецЦикла;
Набор.Записать();

И НЕ НАДО ЗАПИСЫВАТЬ В ЦИКЛЕ перебора записей НАБОР!
ФОТКУ СВОЮ В СТУДИЮ!
27 Надежда25
 
03.11.11
12:56
Если не в цикле, то не пойму, как присвоить Свойство.
Набор.Отбор.Свойство.Установить(??? здесь перепробовано все);
&НаСервере
Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
  Набор = РегистрыСведений.ЗначенияСвойствНоменклатуры.СоздатьНаборЗаписей();
  Набор.Отбор.Номенклатура.Установить(ТекущийОбъект.Ссылка);
  Набор.Отбор.Свойство.Установить(ХарактеристикиСвойство); - ругается
  Набор = РеквизитФормыВЗначение("Характеристики");
  Набор.Записать();
КонецПроцедуры
28 Леха Дум
 
03.11.11
13:04
&НаСервере
Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
Набор = РеквизитФормыВЗначение("Характеристики");
Для Каждого Запись Из Набор Цикл
  Запись.Номенклатура = ТекущийОбъект.Ссылка;
КонецЦикла;
Набор.Записать();
КонецПроцедуры

попробуйте хотя бы прочитать СП по тем методам и объектам, что используются в коде
не вижу фотки в личке