Делаю обработку для программного создания характеристик номенклатуры набором по размерному ряду ( Розница ред.2,3) . Характеристики создаются ,наименование, владелец заполняется а вот доп.реквизиты нет, при этом значения в переменных есть на момент создания. Не судите строго за кривой код , только учусь .
По теме из базы знаний
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) Запомните! Работа с допреквизитами осуществляется через прикладной объект ПланыВидовХарактеристик. Пример ниже.
&НаСервере
Процедура СоздатьДопРеквизитНаСервере(ИмяРеквизита)
//включим константу использования
Если Не Константы.ИспользоватьДополнительныеРеквизитыИСведения.Получить() Тогда
Константы.ИспользоватьДополнительныеРеквизитыИСведения.Установить(Истина);
КонецЕсли;
//пробуем найти реквизит по наименованию
ДопРеквизитСсылка = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию(ИмяРеквизита);
Если НЕ ЗначениеЗаполнено(ДопРеквизитСсылка) Тогда
//если не нашли реквизит - создаем его
ДопРеквизитОбъект = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.СоздатьЭлемент();
ДопРеквизитОбъект.Заголовок = ИмяРеквизита;
ДопРеквизитОбъект.НаборСвойств = Справочники.НаборыДополнительныхРеквизитовИСведений.Справочник_Контрагенты;
ДопРеквизитОбъект.ТипЗначения = Новый ОписаниеТипов("Строка",,,,Новый КвалификаторыСтроки(250));
ДопРеквизитОбъект.Наименование = ДопРеквизитОбъект.Заголовок + " ("+ДопРеквизитОбъект.НаборСвойств+")";
ДопРеквизитОбъект.Виден = Истина;
ДопРеквизитОбъект.Доступен = Истина;
ДопРеквизитОбъект.ДополнительныеЗначенияИспользуются = Истина;
//зададим имя нового реквизита
ДопРеквизитОбъект.Имя = "rek_"+СтрЗаменить(ИмяРеквизита," ","");
ДопРеквизитОбъект.Записать();
ДопРеквизитСсылка = ДопРеквизитОбъект.Ссылка;
КонецЕсли;
//добавим наш реквизит в набор дополнительных реквизитов контрагента
НаборДополнительныхРеквизитовКонтрагента = Справочники.НаборыДополнительныхРеквизитовИСведений.Справочник_Контрагенты.ПолучитьОбъект();
Если НаборДополнительныхРеквизитовКонтрагента.ДополнительныеРеквизиты.Найти(ДопРеквизитСсылка, "Свойство") = Неопределено Тогда
//добавим реквизит в набор
Стр = НаборДополнительныхРеквизитовКонтрагента.ДополнительныеРеквизиты.Добавить();
Стр.Свойство = ДопРеквизитСсылка;
НаборДополнительныхРеквизитовКонтрагента.Записать();
КонецЕсли;
КонецПроцедуры
Показать
(12) Вот как в твоей, без сомнения светлой голове, уживаются одновременно
И
?
ДопРеквизитСсылка = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию(ИмяРеквизита);
ДопРеквизитОбъект.Наименование = ДопРеквизитОбъект.Заголовок + " ("+ДопРеквизитОбъект.НаборСвойств+")";
?
//Получаем список доп.реквизитов с формы
ТипСправочник = Новый ОписаниеТипов("ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения") ;
ТипСтрока = Новый ОписаниеТипов("Строка");
ТЗНаФорме = Объект.ДополнительныеРеквизиты;
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Свойство",ТипСправочник,"Свойство" );
ТЗ.Колонки.Добавить("Значение",ТипСтрока,"Значение");
Для каждого СтрокаТЗНаФорме Из ТЗНаФорме Цикл
ЗаполнитьЗначенияСвойств(ТЗ.Добавить(),СтрокаТЗНаФорме);
КонецЦикла;
//Получаем строку со свойством Цвет
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос.Текст = "ВЫБРАТЬ * ПОМЕСТИТЬ ТЗ ИЗ &ТЗ КАК ТЗ";
Запрос.УстановитьПараметр("ТЗ", ТЗ);
Запрос.Выполнить();
Запрос.Текст = "ВЫБРАТЬ
| ТЗ.Свойство КАК Свойство,
| ТЗ.Значение КАК Значение
|ИЗ
| ТЗ КАК ТЗ
|ГДЕ
| ТЗ.Свойство.Наименование ПОДОБНО ""%Цвет%""";
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
Сообщить("Необходимо выбрать свойство <Цвет>");
Возврат;
КонецЕсли;
Выборка = Запрос.Выполнить().Выгрузить();
Для Каждого СтрЦвет Из Выборка Цикл
Если Выборка.Количество()>1 Тогда
Сообщить("Необходимо указать только одно свойство <Цвет>");
Возврат;
КонецЕсли;
КонецЦикла;
//Обходим список свойства Размер и на каждый формируем характеристику
Для Каждого Стр Из ТЗ Цикл
Если Стр.Свойство = СтрЦвет.Свойство Тогда
Прервать;
Иначе
Наименование = (Стр.Значение + ", " + СтрЦвет.Значение);
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ХарактеристикиНоменклатуры.Наименование КАК Наименование
|ИЗ
| Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры
|ГДЕ
| ХарактеристикиНоменклатуры.Владелец = &Владелец
| И ХарактеристикиНоменклатуры.Наименование = &Наименование";
Запрос.УстановитьПараметр("Наименование", Наименование);
Запрос.УстановитьПараметр("Владелец", ВладелецСсылка);
Если Запрос.Выполнить().Выбрать().Количество()<=0 Тогда //Если нет, то задаем характеристику номенклатуре
Характеристика = Справочники.ХарактеристикиНоменклатуры.СоздатьЭлемент();
Характеристика.Владелец = ВладелецСсылка;
Характеристика.Наименование = Наименование;
НоваяСтрока = Характеристика.ДополнительныеРеквизиты.Добавить();
НоваяСтрока.Свойство = Стр.Свойство;
НоваяСтрока.Значение = Стр.Значение;
НоваяСтрока.Свойство = СтрЦвет.Свойство;
НоваяСтрока.Значение = СтрЦвет.Значение;
Попытка
Характеристика.Записать();
Исключение
ОбщегоНазначения.СообщитьПользователю("Ошибка при записи новой характеристики");
КонецПопытки;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Показать
Реквизита два, первый "Цвет" в одном экземпляре а вот второго "Размер" произвольное количество и вот когда запросом к ТЗ отбираю строку цвет нужно описание типов на все колонки, и если со свойством проблем нет то значение делаю строка и судя по всему в этом и проблема так как у реквизита тип значения не строка а дополнительное значение, думаю как обойти проблему.
(26)
(26)
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот