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