helpf.pro
Регистрация

v8: Программная запись значения в св-во номенклатуры

evgeniy
29.10.2012 12:40Прочитано: 22724
Имеется внешняя обработка, которая программно записывает значение в свойство номенклатуры.
Код 1C v 8.х
 Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| СправочникНоменклатура.Ссылка КАК Номенклатура
|ИЗ
| Справочник.Номенклатура КАК СправочникНоменклатура
|ГДЕ
| СправочникНоменклатура.Ссылка В Иерархии(&ТоварыМФГ) И НЕ СправочникНоменклатура.ЭтоГруппа";
Запрос.УстановитьПараметр("ТоварыМФГ", ТоварыМФГ);
Выборка = Запрос.Выполнить().Выбрать();

СпрЗначСвОб = Справочники.ЗначенияСвойствОбъектов;
свИмпортер = ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоНаименованию("Импортер");
СпрЗначСвОб = Справочники.ЗначенияСвойствОбъектов;
сСпрЗначСвОб = СпрЗначСвОб.НайтиПоНаименованию(ЭтаФорма.ЗначениеНоменклатуры);

Если ЭтаФорма.ЗначениеНоменклатуры.Пустая() Тогда
Сообщить("Не заполнено значение номенклатуры");
Возврат;
КонецЕсли;

Пока Выборка.Следующий() Цикл
НовЗапись = РегистрыСведений.ЗначенияСвойствОбъектов.СоздатьМенеджерЗаписи();
НовЗапись.Объект = Выборка.Номенклатура;
НовЗапись.Свойство = свИмпортер.Ссылка;
НовЗапись.Значение = сСпрЗначСвОб;


НовЗапись.Записать();



КонецЦикла;

Сообщить ("Значение свойства записано");


Нужно добавить такое условие: Если в свойство уже установлено такое значение, то не записывать
Yandex
Возможно, вас также заинтересует
Реклама на портале
Mokey
30.10.2012 10:41Ответ № 1
Сначала нужно считать это свойство из базы, потом проверить значение.
Например, так:
Код 1C v 8.х
 
Пока Выборка.Следующий() Цикл
Набор = РегистрыСведений.ЗначенияСвойствОбъектов.СоздатьНаборЗаписей();
Набор.Отбор.Объект.Установить(Выборка.Номенклатура);
Набор.Отбор.Свойство.Установить(свИмпортер.Ссылка);
Набор.Прочитать();
ЗаписыватьЗаписьРегистра = Ложь;
Если Набор.Количество() = 0 Тогда
//нет такой записи, добавляем новую
НовЗапись = Набор.Добавить();
НовЗапись.Объект = Выборка.Номенклатура;
НовЗапись.Свойство = свИмпортер.Ссылка;
НовЗапись.Значение = сСпрЗначСвОб;
ЗаписыватьЗаписьРегистра = Истина;
Иначе
Запись = Набор[0];
Если НЕ Запись.Значение = сСпрЗначСвОб Тогда
//тут есть свойство, но не совпадает
Запись.Значение = сСпрЗначСвОб;
ЗаписыватьЗаписьРегистра = Истина;
КонецЕсли;
КонецЕсли;
Если ЗаписыватьЗаписьРегистра Тогда
Попытка
Набор.Записать();
Сообщить ("Значение свойства записано");
Исключение
Сообщить ("Значение свойства НЕ записано");
КонецПопытки;
КонецЕсли;
КонецЦикла;

Изменено 30.10.12 10:54:49
evgeniy
31.10.2012 10:49Ответ № 2
А в условии запроса мы ничего не дописываем? Получается что в выборку попадают все записи. А потом в цикле проверяется каждое значение свойства номенклатуры?
Mokey
31.10.2012 11:04Ответ № 3
Так у Вас запрос только для выборки ссылок номенклатуры, можно составить запрос с выбором свойств (пустых, например), но это другая тема. А Ваша просьба решается так, как я описал выше.
evgeniy
31.10.2012 12:23Ответ № 4
У меня сейчас такая проблема. В запросе я дописываю (пытаюсь, чтобы в выборку попала та номенклатура, где значение определеного свойства не заполнено

Код 1C v 8.х
 Запрос.Текст = "ВЫБРАТЬ
| СправочникНоменклатура.Ссылка КАК Номенклатура,
| ЗначенияСвойствОбъектов.Свойство.Наименование,
| ЗначенияСвойствОбъектов.Свойство,
| ЗначенияСвойствОбъектов.Объект,
| ЗначенияСвойствОбъектов.Значение
|ИЗ
| Справочник.Номенклатура КАК СправочникНоменклатура,
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
| ПО СправочникНоменклатура.Ссылка = ЗначенияСвойствОбъектов.Объект
|ГДЕ

|
| ЗначенияСвойствОбъектов.Значение Есть NULL
| И СправочникНоменклатура.Ссылка В Иерархии(&ТоварыМФГ)
| И (НЕ СправочникНоменклатура.ЭтоГруппа)";


Проблема в том, что в выборку попадает номенклатура, у которой есть например несколько свойств (например, импортер, цвет и т.д.) и если они все ПУСТЫЕ
Mokey
31.10.2012 12:31Ответ № 5
Ограничтесь по свойству непосредственно

Код 1C v 8.х
 
| (ЗначенияСвойствОбъектов.Свойство = &ТребуемоеСвойство
| И ЗначенияСвойствОбъектов.Значение Есть NULL)

.....

Запрос.Параметры.Вставить("ТребуемоеСвойство", ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоНаименованию("Импортер"));

Изменено 31.10.12 12:32:53
evgeniy
31.10.2012 13:36Ответ № 6
И так тоже пробовал, не выходит... Может быть где то еще косячу..
Mokey
31.10.2012 13:38Ответ № 7
А что значит - не выходит? Подробнее описывайте то, что не получается
evgeniy
31.10.2012 13:48Ответ № 8
Если в условии запроса написать
| ЗначенияСвойствОбъектов.Значение Есть NULL

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

Но если в условии написать
| (ЗначенияСвойствОбъектов.Свойство = &ТребуемоеСвойство
| И ЗначенияСвойствОбъектов.Значение Есть NULL)

то вообще никакой реакции. Получается что в выборку вообще ничего не попадает?
Изменено 31.10.12 13:54:58
Mokey
31.10.2012 13:53Ответ № 9
Код 1C v 8.х
 
Запрос.Текст = "ВЫБРАТЬ
| СправочникНоменклатура.Ссылка КАК Номенклатура,
| ЗначенияСвойствОбъектов.Свойство.Наименование,
| ЗначенияСвойствОбъектов.Свойство,
| ЗначенияСвойствОбъектов.Объект,
| ЗначенияСвойствОбъектов.Значение
|ИЗ
| Справочник.Номенклатура КАК СправочникНоменклатура,
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
| ПО СправочникНоменклатура.Ссылка = ЗначенияСвойствОбъектов.Объект
|ГДЕ
|
| (ЗначенияСвойствОбъектов.Свойство = &ТребуемоеСвойство
| И ЗначенияСвойствОбъектов.Значение Есть NULL)
| И СправочникНоменклатура.Ссылка В Иерархии(&ТоварыМФГ)
| И (НЕ СправочникНоменклатура.ЭтоГруппа)";
Mokey
31.10.2012 13:55Ответ № 10
(8) evgeniy, это может означать, что либо нет записей с таким свойством вообще, либо записи есть, и они все заполнены.
Запрос, который мы с Вами сейчас рассматриваем, отлавливает только СУЩЕСТВУЮЩИЕ и НЕЗАПОЛНЕННЫЕ записи с каким-то свойством.
Изменено 31.10.12 13:58:09
evgeniy
31.10.2012 14:05Ответ № 11
Данное свойство есть у каждой записи без исключения и значение не заполнены. При этом реакции совершенно никакой. Можете еще что нибудь посоветовать?
Mokey
31.10.2012 14:07Ответ № 12
нет, если нет реакции, значит таблица со свойствами пуста, либо ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоНаименованию("Импортер") не возвращает ссылку на свойство, проверьте
evgeniy
31.10.2012 14:12Ответ № 13
У товаров Номенклатуры имеется несколько свойств. ЕСЛИ все значения этих свойств очистить, ТО вот такой вот код сработает

Код 1C v 8.х
  Запрос.Текст = "ВЫБРАТЬ
| СправочникНоменклатура.Ссылка КАК Номенклатура,
| ЗначенияСвойствОбъектов.Свойство.Наименование,
| ЗначенияСвойствОбъектов.Свойство,
| ЗначенияСвойствОбъектов.Объект,
| ЗначенияСвойствОбъектов.Значение
|ИЗ
| Справочник.Номенклатура КАК СправочникНоменклатура,
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
| ПО СправочникНоменклатура.Ссылка = ЗначенияСвойствОбъектов.Объект
|ГДЕ

|
| ЗначенияСвойствОбъектов.Значение Есть NULL
| И СправочникНоменклатура.Ссылка В Иерархии(&ТоварыМФГ)
| И (НЕ СправочникНоменклатура.ЭтоГруппа)";


НО если значения свойств заполнить (нужное нам оставляем пустым), ТО КОД НЕ РАБОТАЕТ
Mokey
31.10.2012 14:13Ответ № 14
(12) Mokey,
Mokey
31.10.2012 14:20Ответ № 15
Код 1C v 8.х
  
Запрос.Текст = "ВЫБРАТЬ
| СправочникНоменклатура.Ссылка КАК Номенклатура,
| ЗначенияСвойствОбъектов.Свойство.Наименование,
| ЗначенияСвойствОбъектов.Свойство,
| ЗначенияСвойствОбъектов.Объект,
| ЗначенияСвойствОбъектов.Значение
|ИЗ
| Справочник.Номенклатура КАК СправочникНоменклатура,
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
| ПО СправочникНоменклатура.Ссылка = ЗначенияСвойствОбъектов.Объект
| И ЗначенияСвойствОбъектов.Свойство = &ТребуемоеСвойство
|ГДЕ
|
|
| СправочникНоменклатура.Ссылка В Иерархии(&ТоварыМФГ)
| И (НЕ СправочникНоменклатура.ЭтоГруппа)";


попробуйте этот код, чтобы выяснить, чему равно значение в этом свойстве, сдаётся мне, оно совсем не NULL
evgeniy
31.10.2012 14:30Ответ № 16
(12) ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоНаименованию("Импортер") возвращает ссылку. Здесь все норм
http://s019.radikal.ru/i614/1210/25/cec4098da592.jpg

Таблица со свойствами Не пуста

http://s019.radikal.ru/i611/1210/10/52673f6a577e.jpg
Изменено 31.10.12 14:31:27
evgeniy
31.10.2012 14:39Ответ № 17
(15) При выполнении кода в выборка попадает вся номенклатура у которой имеется свойство Импортер. (моя обработка отбирает нужную номенклатуру и затем записывает значение в это свойство. на форме у меня 3 поля ввода: выбор группы номенклатуры, выбор свойства, выбор значения для этого свойства
Изменено 31.10.12 14:41:26
evgeniy
31.10.2012 14:45Ответ № 18
Спасибо, все заработало ))) Вот код

Код 1C v 8.х
 Запрос.Текст = "ВЫБРАТЬ
| СправочникНоменклатура.Ссылка КАК Номенклатура,
| ЗначенияСвойствОбъектов.Свойство.Наименование,
| ЗначенияСвойствОбъектов.Свойство,
| ЗначенияСвойствОбъектов.Объект,
| ЗначенияСвойствОбъектов.Значение
|ИЗ
| Справочник.Номенклатура КАК СправочникНоменклатура,
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
| ПО СправочникНоменклатура.Ссылка = ЗначенияСвойствОбъектов.Объект
| И ЗначенияСвойствОбъектов.Свойство = &Свойство \\ Дописал сюда, как высказали
|ГДЕ
|
|
| СправочникНоменклатура.Ссылка В Иерархии(&ТоварыМФГ)
| И ЗначенияСвойствОбъектов.Значение Есть Null \\ И СЮДА
| И (НЕ СправочникНоменклатура.ЭтоГруппа)";




Почему предыдущий код не работал, а такой работает?
Изменено 31.10.12 14:47:17
Mokey
31.10.2012 14:50Ответ № 19
(17) evgeniy, ну так отлично! если нужно заполнить свойство во всей группе - то как раз мой запрос подойдёт. В параметр &ТребуемоеСвойство записываете выбранное свойство, выполняете запрос, а потом по выборке и устанавливаете искомое свойство. Только запрос тут скорости не добавит, самый первый код будет более внятным и понятным, потому что всё равно циклы пробегать.
evgeniy
31.10.2012 14:53Ответ № 20
Вопрос закрыт!
Mokey
31.10.2012 15:19Ответ № 21
На чём остановились в итоге?
evgeniy
01.11.2012 06:53Ответ № 22
(21) Использовал код, который выложил в первом посте, запрос - ответ № (18)
Подсказка: Щелникни по Имени пользователя напротив ответа, и тем самым покажешь, что сообщение адресовано ему.
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.