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

Т.е. в списке содержатся сами значения характеристики свойства объекта - т.е. значение с типом Характеристика.СвойстваОбъектов.

В списке пользователь отмечает требуемые ему значения (например размерный ряд для обуви) и происходит создание номенклатуры и характеристик к ней.

Насколько я понял, значения характеристик для конкретного объекта хранится в регистре сведений "ЗначенияСвойствОбъектов".
Измерения его:
** Объект с типом ДокументСсылка или СправочникСсылка
** Свойство с типом ПланВидовХарактеристикСсылка.СвойстваОбъектов
** Значение с типом Характеристика.СвойстваОбъектов.

Т.е. на мой взгляд достаточно было такого кода:

СпрНом    = Справочники.Номенклатура.СоздатьЭлемент();
//...
СпрНом.ВестиУчетПоХарактеристикам    = ЗначениеЗаполнено(ПВХ);
Попытка
   СпрНом.Записать();
Исключение
   Отказ = Истина;
КонецПопытки;

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

           НаборЗаписей.Отбор.Объект.Установить(НоваяСтрока.Объект);
           НаборЗаписей.Отбор.Свойство.Установить(НоваяСтрока.Свойство);
           
           Попытка
               НаборЗаписей.Записать();
           Исключение
               Отказ    = Истина;
               ОбщегоНазначения.СообщитьОбОшибке("Ошибка записи из-за "+ОписаниеОшибки());
               Продолжить;
           КонецПопытки;
       КонецЕсли;
   КонецЦикла;
КонецЕсли;

Но после выполнения данного кода закладка "Характеристики" в Номенклатуре пустая, как свойство хранится для подчиненного справочника "ХарактеристикиНоменклатуры".
Переделал код на такой:

СпрНом    = Справочники.Номенклатура.СоздатьЭлемент();
//...
СпрНом.ВестиУчетПоХарактеристикам    = ЗначениеЗаполнено(ПВХ);
Попытка
   СпрНом.Записать();
Исключение
   Отказ = Истина;
КонецПопытки;

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

На закладке "Характеристика" в спр. Номенклатура есть значения, но при попытке добавить его интерактивно - поле характеристики пустой. Поковырявшись еще понял, что элемента справочника "Свойства объектов" поле назначение должно быть "Справочник  "Характеристики номенклатуры"".

Вопрос теперь стоит в следующем.
Правильны ли мои рассуждения и правилен ли приведенный код по созданию характеристик для номенклатуры?
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.