Добавление в дополнительный реквизит

1. Lexx32 20 24.05.19 08:12 Сейчас в теме
Привет всем, подскажите новичку, есть типовая конфигурация УФ, пишу внешнюю обработку которая переберет все документы, и табличные части, в ТЧ есть реквизит серия - справочник.серииноменклатуры , создан к нему дополнительный реквизит цена, нужно заполнить во всех строках эту цену, в справочнике серии в наименовании - перезаполнить по шаблону, и поменять в ТЧ. Делаю так.
	ШаблонСерии="";
	Выборка=Документы.ПоступлениеТоваров.Выбрать();
	Пока Выборка.Следующий()=1 Цикл
		СтПартия = Справочники.ПартииНоменклатуры.ПолучитьПартиюДокумента(Выборка,Выборка.ДоговорКонтрагента.Контрагент,Истина);
		Для Каждого Ст Из Выборка.Товары Цикл
			ССС = НайтиДокументПоНомеруНаСервере(Строка(Выборка.Номер));
			Пост = ССС.ПолучитьОбъект();
			Для каждого сс из Пост.Товары Цикл
				сс.СтатусУказанияПартий = 2;
				сс.Партия = СтПартия;
				Сер = Справочники.СерииНоменклатуры.НайтиПоНаименованию(сс.серияНоменклатуры,Истина);
				//[Номер]+" до "+Формат([ГоденДо] , "ДФ='dd.MM.yy'")+" цена "+[Цена (НаименованиеВидНоменклатуры)]
				ШаблонСерии = сс.СерияНоменклатуры.Номер+" до "+Формат(сс.СерияНоменклатуры.ГоденДо , "ДФ='dd.MM.yy'")+" цена "+сс.Цена; 
				ОСер = Сер.ПолучитьОбъект();
				ОСер.Наименование = ШаблонСерии;
				НовоеСвойство = ОСер.ДополнительныеРеквизиты.Добавить();
				НовоеСвойство.Свойство = "Цена";
				НовоеСвойство.Значение = сс.цена;
				ОСер.Записать();
				сс.СерияНоменклатуры = ОСер;
			КонеЦЦИкла;
			Пост.записать();	
			Прервать;
		КонецЦикла;
	КонецЦикла;	

Показать

Ошибок не выкидывает, но и шаблон серий не создается, хотя в отладке - заполняется.. Подскажите как исправить..
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Valerianich 6 24.05.19 08:25 Сейчас в теме
Цитата: НовоеСвойство.Свойство = "Цена";

НовоеСвойство.Свойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыСведения.НайтиПоНаименованию("Цена");

Примерно так.
SagittariusA; +1 Ответить
4. Lexx32 20 24.05.19 13:49 Сейчас в теме
(2)
ПланыВидовХарактеристик.ДополнительныеРеквизитыСведения.НайтиПоНаименованию("Цена");

Не работает
6. Valerianich 6 24.05.19 13:54 Сейчас в теме
(4) А так:
НовоеСвойство.Свойство =
ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Цена")?)
7. SagittariusA 24.05.19 13:57 Сейчас в теме
(4)
Покажите карточку этого доп. реквизита
9. Lexx32 20 24.05.19 14:09 Сейчас в теме
(7) https://cloud.mail.ru/public/5td6/ddrBy9yes - скрин карточки созданного дополнительного реквизита
https://cloud.mail.ru/public/ZGB8/5NiNJztc1 - скрин карточки вида номенклатуры
10. SagittariusA 24.05.19 14:12 Сейчас в теме
(9)
А можете открыть этот реквизит? Посмотрите картинку (выше по ветке), которую я прислал.
У доп. реквизита есть "Наименование" и "Имя", вот Имя как раз используется для поиска этого реквизита.
11. Lexx32 20 24.05.19 14:20 Сейчас в теме
(10)https://cloud.mail.ru/public/4p8g/nz5kXTxBw - По началу я так и пробовал искать по имени Цена и устанавливать значение.. по готовой функции..
&НаСервере
Функция ЗаписатьЗначениеДопРеквизита(Ссылка, Свойство, Значение)
	
    Попытка
        ОбъектСсылки = Ссылка.ПолучитьОбъект();
		
	ПараметрыОтбора = Новый Структура;
	ПараметрыОтбора.Вставить("Свойство",Свойство);
	Массив = ОбъектСсылки.ДополнительныеРеквизиты.НайтиСтроки(ПараметрыОтбора);
		
	Если Массив.Количество() = 0 Тогда
        НовоеСвойство = ОбъектСсылки.ДополнительныеРеквизиты.Добавить();
	    НовоеСвойство.Свойство = Свойство;
	    НовоеСвойство.Значение = Значение;
	Иначе
	    Массив[0].Значение = Значение;
	КонецЕсли;	
	
	ОбъектСсылки.Записать();	
    Исключение
	Возврат Ложь;
    КонецПопытки
	
КонецФункции

Показать

Но чет этот вариант не срабатывает
12. SagittariusA 24.05.19 14:21 Сейчас в теме
(11)
Посмотрите ниже! Сворачивающаяся ссылка "Для разработчиков".
Прикрепленные файлы:
14. Lexx32 20 24.05.19 14:26 Сейчас в теме
(12) Я новичок, никогда не пользовался ссылками, в готовую функцию можно передавать эту ссылку?? Или это будет как Свойство в текстовом формате??
16. SagittariusA 24.05.19 14:32 Сейчас в теме
(14)
Вам в свойство нужно передать ссылку на ПВХ ДополнительныеРеквизитыИСведения.
Найти её нужно через
ИскомоеСвойство= 
ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("АВотТутИмяРеквизитаИзФормы")
18. Lexx32 20 24.05.19 14:49 Сейчас в теме
15. SagittariusA 24.05.19 14:27 Сейчас в теме
(11)
Можете использовать БСП.
"УправлениеСвойствами.ЗаписатьСвойстваУОбъекта()"

// Записывает дополнительные реквизиты и сведения владельцу свойств.
// Изменения происходят в транзакции.
// 
// Параметры:
//  ВладелецСвойств - Ссылка - например, СправочникСсылка.Номенклатура, ДокументСсылка.ЗаказПокупателя, ...
//  ТаблицаСвойствИЗначений - ТаблицаЗначений - с колонками:
//    * Свойство - ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения - свойство владельца.
//    * Значение - Произвольный - любое значение, допустимое для свойства (указано в элементе свойства).
//
Процедура ЗаписатьСвойстваУОбъекта(ВладелецСвойств, ТаблицаСвойствИЗначений) Экспорт
	
	ТаблицаДопРеквизитов = Новый ТаблицаЗначений;
	ТаблицаДопРеквизитов.Колонки.Добавить("Свойство", Новый ОписаниеТипов("ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения"));
	ТаблицаДопРеквизитов.Колонки.Добавить("Значение");
	
	ТаблицаДопСведений = ТаблицаДопРеквизитов.СкопироватьКолонки();
	
	Для Каждого СтрокаТаблицыСвойств Из ТаблицаСвойствИЗначений Цикл
		Если СтрокаТаблицыСвойств.Свойство.ЭтоДополнительноеСведение Тогда
			НоваяСтрока = ТаблицаДопСведений.Добавить();
		Иначе
			НоваяСтрока = ТаблицаДопРеквизитов.Добавить();
		КонецЕсли;
		ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаТаблицыСвойств, "Свойство,Значение");
	КонецЦикла;
	
	ЕстьДопРеквизиты = ТаблицаДопРеквизитов.Количество() > 0;
	ЕстьДопСведения  = ТаблицаДопСведений.Количество() > 0;
	
	МассивСвойств = СвойстваОбъекта(ВладелецСвойств);
	
	МассивДопРеквизитов = Новый Массив;
	МассивДопСведений = Новый Массив;
	
	Для Каждого ДопСвойство Из МассивСвойств Цикл
		Если ДопСвойство.ЭтоДополнительноеСведение Тогда
			МассивДопСведений.Добавить(ДопСвойство);
		Иначе
			МассивДопРеквизитов.Добавить(ДопСвойство);
		КонецЕсли;
	КонецЦикла;
	
	НачатьТранзакцию();
	Попытка
		Если ЕстьДопРеквизиты Тогда
			ВладелецСвойствОбъект = ВладелецСвойств.ПолучитьОбъект();
			ЗаблокироватьДанныеДляРедактирования(ВладелецСвойствОбъект.Ссылка);
			Для Каждого ДопРеквизит Из ТаблицаДопРеквизитов Цикл
				Если МассивДопРеквизитов.Найти(ДопРеквизит.Свойство) = Неопределено Тогда
					Продолжить;
				КонецЕсли;
				МассивСтрок = ВладелецСвойствОбъект.ДополнительныеРеквизиты.НайтиСтроки(Новый Структура("Свойство", ДопРеквизит.Свойство));
				Если МассивСтрок.Количество() Тогда
					СтрокаСвойства = МассивСтрок[0];
				Иначе
					СтрокаСвойства = ВладелецСвойствОбъект.ДополнительныеРеквизиты.Добавить();
				КонецЕсли;
				ЗаполнитьЗначенияСвойств(СтрокаСвойства, ДопРеквизит, "Свойство,Значение");
			КонецЦикла;
			ВладелецСвойствОбъект.Записать();
		КонецЕсли;
		
		Если ЕстьДопСведения Тогда
			Для Каждого ДопСведение Из ТаблицаДопСведений Цикл
				Если МассивДопСведений.Найти(ДопСведение.Свойство) = Неопределено Тогда
					Продолжить;
				КонецЕсли;
				
				МенеджерЗаписи = РегистрыСведений.ДополнительныеСведения.СоздатьМенеджерЗаписи();
				
				МенеджерЗаписи.Объект = ВладелецСвойств;
				МенеджерЗаписи.Свойство = ДопСведение.Свойство;
				МенеджерЗаписи.Значение = ДопСведение.Значение;
				
				МенеджерЗаписи.Записать(Истина);
			КонецЦикла;
			
		КонецЕсли;
		ЗафиксироватьТранзакцию();
	Исключение
		ОтменитьТранзакцию();
		ВызватьИсключение;
	КонецПопытки;
	
КонецПроцедуры
Показать
17. Lexx32 20 24.05.19 14:47 Сейчас в теме
(15) Переделал в такой вариант буду тестить..
	МодульУправлениеСвойствами = "";
	ШаблонСерии="";
	Выборка=Документы.ПоступлениеТоваров.Выбрать();
	Пока Выборка.Следующий()=1 Цикл
		СтПартия = Справочники.ПартииНоменклатуры.ПолучитьПартиюДокумента(Выборка,Выборка.ДоговорКонтрагента.Контрагент,Истина);
		Для Каждого Ст Из Выборка.Товары Цикл
			ССС = НайтиДокументПоНомеруНаСервере(Строка(Выборка.Номер));
			Пост = ССС.ПолучитьОбъект();
			Для каждого сс из Пост.Товары Цикл
				сс.СтатусУказанияПартий = 2;
				сс.Партия = СтПартия;
				Сер = Справочники.СерииНоменклатуры.НайтиПоНаименованию(сс.серияНоменклатуры,Истина);
				//[Номер]+" до "+Формат([ГоденДо] , "ДФ='dd.MM.yy'")+" цена "+[Цена (НаименованиеВидНоменклатуры)]
				ШаблонСерии = сс.СерияНоменклатуры.Номер+" до "+Формат(сс.СерияНоменклатуры.ГоденДо , "ДФ='dd.MM.yy'")+" цена "+сс.Цена; 
				ОСер = Сер.ПолучитьОбъект();
				ОСер.Наименование = ШаблонСерии;
				ТаблицаСвойств = Новый ТаблицаЗначений;
				ТаблицаСвойств.Колонки.Добавить("Свойство");
				ТаблицаСвойств.Колонки.Добавить("Значение");
				
    			СтрТЗ = ТаблицаСвойств.Добавить();
				СтрТЗ.Свойство = "Цена_e71e167379d04e608a1f5db4229a3396";
				СтрТЗ.Значение = сс.цена;
				
				МодульУправлениеСвойствами = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствами");
				МодульУправлениеСвойствами.ЗаписатьСвойстваУОбъекта(Осер.Ссылка, ТаблицаСвойств);
				
				сс.СерияНоменклатуры = ОСер;
			КонеЦЦИкла;
			Пост.записать();	
			Прервать;
		КонецЦикла;
	КонецЦикла;	

Показать
19. SagittariusA 24.05.19 14:50 Сейчас в теме
(17)
Не так, сэр!
СтрТЗ = ТаблицаСвойств.Добавить();
СтрТЗ.Свойство = "Цена_e71e167379d04e608a1f5db4229a3396";
СтрТЗ.Значение = сс.цена;



А так
СтрТЗ = ТаблицаСвойств.Добавить();
СвойствоЦена = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Цена_e71e167379d04e608a1f5db4229a3396");
                СтрТЗ.Свойство = СвойствоЦена;
                СтрТЗ.Значение = сс.цена;
20. SlavaKron 24.05.19 14:51 Сейчас в теме
(19) Только "Цена_e71e167379d04e608a1f5db4229a3396" - это не наименование.
21. SagittariusA 24.05.19 14:56 Сейчас в теме
(20)
Возможно что оно, обычно так формируется, если его не заполнить.
22. Lexx32 20 24.05.19 15:17 Сейчас в теме
(20) Переделал так
	МодульУправлениеСвойствами = "";
	ШаблонСерии="";
	Выборка=Документы.ПоступлениеТоваров.Выбрать();
	Пока Выборка.Следующий()=1 Цикл
		СтПартия = Справочники.ПартииНоменклатуры.ПолучитьПартиюДокумента(Выборка,Выборка.ДоговорКонтрагента.Контрагент,Истина);
		Для Каждого Ст Из Выборка.Товары Цикл
			ССС = НайтиДокументПоНомеруНаСервере(Строка(Выборка.Номер));
			Пост = ССС.ПолучитьОбъект();
			Для каждого сс из Пост.Товары Цикл
				сс.СтатусУказанияПартий = 2;
				сс.Партия = СтПартия;
				Сер = Справочники.СерииНоменклатуры.НайтиПоНаименованию(сс.серияНоменклатуры,Истина);
				//[Номер]+" до "+Формат([ГоденДо] , "ДФ='dd.MM.yy'")+" цена "+[Цена (НаименованиеВидНоменклатуры)]
				ШаблонСерии = сс.СерияНоменклатуры.Номер+" до "+Формат(сс.СерияНоменклатуры.ГоденДо , "ДФ='dd.MM.yy'")+" цена "+сс.Цена; 
				ОСер = Сер.ПолучитьОбъект();
				ОСер.Наименование = ШаблонСерии;
				ТаблицаСвойств = Новый ТаблицаЗначений;
				ТаблицаСвойств.Колонки.Добавить("Свойство");
				ТаблицаСвойств.Колонки.Добавить("Значение");
				
				ИскомоеСвойство= 
				ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Цена_e71e167379d04e608a1f5db4229a3396");

    			СтрТЗ = ТаблицаСвойств.Добавить();
				СтрТЗ.Свойство = ИскомоеСвойство ; //"Цена_e71e167379d04e608a1f5db4229a3396";
				СтрТЗ.Значение = сс.цена;
				
				МодульУправлениеСвойствами = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствами");
				МодульУправлениеСвойствами.ЗаписатьСвойстваУОбъекта(Осер.Ссылка, ТаблицаСвойств);
				
				сс.СерияНоменклатуры = ОСер;
			КонеЦЦИкла;
			Пост.записать();	
			Прервать;
		КонецЦикла;
	КонецЦикла;	

Показать

При отладке в ИскомоеСвойство="", я так понимаю что вообще ничего не находится?? Может нужно где то указать к какому элементу справочника мы добавляем значение дополнительного реквизита??
25. SagittariusA 24.05.19 16:05 Сейчас в теме
(22)
Прошу прощения, корректно:
ИскомоеСвойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Имя", "Цена_e71e167379d04e608a1f5db4229a3396");


Так как это системное имя это реквизит "Имя" у ПВХ.
26. Lexx32 20 24.05.19 16:18 Сейчас в теме
(25) Да я понял, но проще наименование прикручивать, чем для кадого вида номенклатуры писать свой обработчик.. И тем не менее Большое спасибо за поправки..
13. SlavaKron 24.05.19 14:22 Сейчас в теме
(9)
>Такси
>Панель навигации в закладках
А что так можно было?
3. SagittariusA 24.05.19 13:41 Сейчас в теме
А имя как раз указывается в момент создания доп реквизита.
Прикрепленные файлы:
5. Lexx32 20 24.05.19 13:53 Сейчас в теме
(3) Проблема в том что у меня заранее создан реквизит Цена, и для каждого элемента нужно его только заполнить, если делать как в (2) то создается новый реквизит, он же при открытии элемента становится перечеркнутым.. А вообще этот элемент потом не становится в ТЧ документа, там становится пусто.. Как будто серию теперь нужно выбрать... Может сделать проверку на имеющийся реквизит??
8. SagittariusA 24.05.19 14:04 Сейчас в теме
(5)
Вот как раз и нужно его найти и поставить
23. independ 1520 24.05.19 15:32 Сейчас в теме
Проверьте в любой консоли запросов, что вернет ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения
24. Lexx32 20 24.05.19 16:00 Сейчас в теме
Все получилось, цена записывается, вот код
	МодульУправлениеСвойствами = "";
	ШаблонСерии="";
	Выборка=Документы.ПоступлениеТоваров.Выбрать();
	Пока Выборка.Следующий()=1 Цикл
		СтПартия = Справочники.ПартииНоменклатуры.ПолучитьПартиюДокумента(Выборка,Выборка.ДоговорКонтрагента.Контрагент,Истина);
		Для Каждого Ст Из Выборка.Товары Цикл
			ССС = НайтиДокументПоНомеруНаСервере(Строка(Выборка.Номер));
			Пост = ССС.ПолучитьОбъект();
			Для каждого сс из Пост.Товары Цикл
				сс.СтатусУказанияПартий = 2;
				сс.Партия = СтПартия;
				Сер = Справочники.СерииНоменклатуры.НайтиПоНаименованию(сс.серияНоменклатуры,Истина);
				//[Номер]+" до "+Формат([ГоденДо] , "ДФ='dd.MM.yy'")+" цена "+[Цена (НаименованиеВидНоменклатуры)]
				ШаблонСерии = сс.СерияНоменклатуры.Номер+" до "+Формат(сс.СерияНоменклатуры.ГоденДо , "ДФ='dd.MM.yy'")+" цена "+сс.Цена; 
				ОСер = Сер.ПолучитьОбъект();
				ОСер.Наименование = ШаблонСерии;
				ТаблицаСвойств = Новый ТаблицаЗначений;
				ТаблицаСвойств.Колонки.Добавить("Свойство");
				ТаблицаСвойств.Колонки.Добавить("Значение");

				ИскомоеСвойство=
				ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Цена ("+сс.Номенклатура.ВидНоменклатуры+")");
				//ИскомоеСвойство= 

    			СтрТЗ = ТаблицаСвойств.Добавить();
				СтрТЗ.Свойство = ИскомоеСвойство ; //"Цена_e71e167379d04e608a1f5db4229a3396";
				СтрТЗ.Значение = сс.цена;
				
				МодульУправлениеСвойствами = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствами");
				МодульУправлениеСвойствами.ЗаписатьСвойстваУОбъекта(Осер.Ссылка, ТаблицаСвойств);
				
				сс.СерияНоменклатуры = ОСер;
			КонеЦЦИкла;
			Пост.записать();	
			Прервать;
		КонецЦикла;
	КонецЦикла;	

Показать

Единтсвенно в ТЧ документа серия не заменяется на новую (записанную с шаблоном) но это уже другая история.
Всем спасибо.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот