Заполнение доп.реквизитов номенклатуры программно УТ 11.4

1. TamaraPicachu 2 25.10.21 12:55 Сейчас в теме
При заполнении доп. реквизитов номенклатуры, в карточке и на ценниках они отображаются, а на вкладке "реквизиты" пусто. Подскажите, пожалуйста, как правильно их заполнить?

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

			
	КонецЦикла;
Показать
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. user1671936 1 25.10.21 13:15 Сейчас в теме
(1)
Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(СтрокаДанных.Ссылка);

Если Номенклатура = Справочники.Номенклатура.ПустаяСсылка() Тогда
Продолжить;
Иначе

Об = Номенклатура.ПолучитьОбъект();

Об.ДопРеквизит1  = Строка.Реквизит1;
 И так для остальных реквизитов)

Об.Записать();
Показать
11. TamaraPicachu 2 25.10.21 14:17 Сейчас в теме
(2) Не поняла, что тут имели в виду, как это применить
4. user1671936 1 25.10.21 13:22 Сейчас в теме
(1) И в отладчике смотри какой ответ тебе приходит тут Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(СтрокаДанных.Ссылка);
8. TamaraPicachu 2 25.10.21 14:14 Сейчас в теме
(4) номенклатуру он находит и заполняет, уточняющие скрины по вопросу прикрепила в ответе к комментарию 3
6. vadim.semyonov.rzn 25.10.21 14:08 Сейчас в теме
(1)
в карточке и на ценниках они отображаются, а на вкладке "реквизиты" пусто
Пусто сразу после записи (в уже открытой форме)? Или после повторного открытия формы элемента?
10. TamaraPicachu 2 25.10.21 14:16 Сейчас в теме
(6) и сразу и после повторного открытия. И если хоть что-то изменить в любом реквизите номенклатуры, то все доп.реквизиты добавленные программно стираются
12. vadim.semyonov.rzn 25.10.21 14:24 Сейчас в теме
(10)
И если хоть что-то изменить в любом реквизите номенклатуры, то все доп.реквизиты добавленные программно стираются
Это как раз понятно. Строки тч допреквизитов заполняются из реквизитов формы каждый раз при записи. Попробуйте редактировать не строки тч объекта, а реквизиты формы, при необходимости добавляя их программно. Как формируются наименования этих реквизитов - можно подсмотреть в бсп.
Кстати, а состав допреквизитов для этого справочника установлен в "Наборах дополнительных реквизитов и сведений"? И есть ли там заполняемые реквизиты?
14. TamaraPicachu 2 25.10.21 14:31 Сейчас в теме
(12) Вот это, наверно, дельный совет, еще бы знать, где это подсмотреть, не изучала еще бсп)
15. TamaraPicachu 2 25.10.21 14:34 Сейчас в теме
да, все заполнено, иначе бы вообще не заполнялись реквизиты

(12)
И есть ли там заполняемые реквизиты?
Прикрепленные файлы:
3. zelenii 25.10.21 13:16 Сейчас в теме
Во-первых не заполненое еще один реквизит из табличной части Дополнительные реквизиты. А именно - ТекстоваяСтрока.
А во-вторых - что такое " СтрокаДанных.Свойство"? И есть ли у данной номенклатуры привязанный доп. реквизит в доп.реквизитах? Можно ли в режиме пользователя добавить данное значение в карточке номенкалтуры?
5. TamaraPicachu 2 25.10.21 14:03 Сейчас в теме
(3) прикрепила скрины, чтоб было понятнее о чем речь
Прикрепленные файлы:
9. user1671936 1 25.10.21 14:16 Сейчас в теме
(5) ну вот кусок кода

Для Каждого СтрокаДанных Из ДанныеФайла Цикл          
            
            Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(СтрокаДанных.Ссылка);

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


То есть СтрокаДанных из какого то файла, и ты получаешь объект именно СтрокаДанных. Зачем? Зачем тогда надо было Номенклатуру искать? Тут нужно получать объект именно номенклатуры, а дальше уже отладчиком смотришь, где у этого объекта находятся нужные реквизиты, присваиваешь им значения из СтрокаДанных и записываешь объект. А у тебя получается ты получаешь Объект СтрокаДанных , присваиваешь ему значения из СтрокаДанных, и пытаешься записать это все. )
13. TamaraPicachu 2 25.10.21 14:24 Сейчас в теме
(9)
Зачем тогда надо было Номенклатуру искать


У меня не получалось у СтрокаДанных.Сылка проверить пустую ссылку. Поэтому так
А по сути Строка данных.Ссылка и Номенклатура одно и тоже, так как при прочитке данных из файла делается тоже самое

Процедура  ЗаполнитьТаблицуXLS_НаСервере()
		 
	КоличествоСтрок = ТабДок.ВысотаТаблицы;
	         
	Для НомерСтроки = 2 По КоличествоСтрок Цикл
		
	СтроковыйНомер = Формат(НомерСтроки, "ЧН=0; ЧГ=0");
	СтрокаДанных = ДанныеФайла.Добавить();
	          
	Номен = ТабДок.ПолучитьОбласть("R" + СтроковыйНомер + "C" + 1).ТекущаяОбласть.Текст;	
	СтрокаДанных.Ссылка = Справочники.Номенклатура.НайтиПоНаименованию(Номен);
	Свойс =  ТабДок.ПолучитьОбласть("R" + СтроковыйНомер + "C" + 2).ТекущаяОбласть.Текст;	
	СтрокаДанных.Свойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию(Свойс);
	СтрокаДанных.Значение = ТабДок.ПолучитьОбласть("R" + СтроковыйНомер + "C" + 3).ТекущаяОбласть.Текст;	         

КонецЦикла;
Показать


И эти реквизиты записываются и отображаются в номенклатуре, но не заполняются в реквизитах.
Скрины есть в одном из ответов. Если бы проблемы была в СтрокаДанных.Ссылка, то вообще бы не записывались реквизиты
16. user1671936 1 25.10.21 14:46 Сейчас в теме
(13) в реквизитах тип значения этих реквизитов какой?
7. TamaraPicachu 2 25.10.21 14:13 Сейчас в теме
(3) У номенклатуры, у которой свойства заполнены вручную, ТекстоваяСтрока в табличной части тоже пустая.
СтрокаДанных.Свойство это как раз привязанный доп.реквизит
17. Оберон 16 25.10.21 14:56 Сейчас в теме
общий модуль УправлениеСвойствами

ЗнСвойства = УправлениеСвойствами.ЗначениеСвойства(ОбъектСсылка, "ИмяРеквизитаДляРазработчика")

УправлениеСвойствами.ЗаписатьСвойстваУОбъекта(ВладелецСвойств, ТаблицаСвойствИЗначений)


*******
для инициализации
УправлениеСвойствами.ПриСозданииНаСервере(Форма, ДополнительныеПараметры)
УправлениеСвойствами.ПриЧтенииНаСервере(Форма, ТекущийОбъект)
УправлениеСвойствами.ПередЗаписьюНаСервере(Форма, ТекущийОбъект)
УправлениеСвойствами.ОбработкаПроверкиЗаполнения(Форма, Отказ, ПроверяемыеРеквизиты, Объект)
vadim.semyonov.rzn; +1 Ответить
18. vadim.semyonov.rzn 25.10.21 15:10 Сейчас в теме
(17) И после этого еще желательно перечитать объект в форме.
28. TamaraPicachu 2 25.10.21 18:46 Сейчас в теме
(18) Пока Оберон не отвечает, может Вы подскажете, что может быть не так? )

Код исправила по рекомендациям. При первом открытии свойства заполнены, но опять только на вкладке карточка. В реквизитах пусто. При записи, закрытии и открытии, соответственно все стирается.

Процедура ЗагрузитьСвойстваНаСервере()
    
    ТаблицаДопРеквизитов = Новый ТаблицаЗначений;
    ТаблицаДопРеквизитов.Колонки.Добавить("Свойство", Новый ОписаниеТипов("ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения"));
    ТаблицаДопРеквизитов.Колонки.Добавить("Значение");

    Пользователь = Пользователи.ТекущийПользователь();
    Номер = 0;
    Для Каждого СтрокаДанных Из ДанныеФайла Цикл          
            
            Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(СтрокаДанных.Ссылка);
            
            Если Номенклатура = Справочники.Номенклатура.ПустаяСсылка()  Тогда
                Продолжить;
            Иначе
                
        Номер = Номер + 1;
        
        
        ТаблицаДопРеквизитов.Очистить();
        
        НоваяСтрока = ТаблицаДопРеквизитов.Добавить();
        НоваяСтрока.Свойство = СтрокаДанных.Свойство;
        НоваяСтрока.Значение = СтрокаДанных.Значение;
        УправлениеСвойствами.ЗаписатьСвойстваУОбъекта(Номенклатура, ТаблицаДопРеквизитов);          
        
    КонецЕсли;
Показать
20. TamaraPicachu 2 25.10.21 15:12 Сейчас в теме
(17) Нашла тоже эту функцию УправлениеСвойствами.ЗаписатьСвойстваУОбъекта(ВладелецСвойств, ТаблицаСвойствИЗначений) в других темах. Добавила, но выходит ошибка

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

		Об.Записать();
	КонецЕсли;
Показать


25.10.2021 15:03:51
Операция не может быть выполнена из-за несоответствия версии или отсутствия записи базы данных (возможно, запись была изменена или удалена)!
{ВнешняяОбработка.ЗагрузкаКонтрагентов.Форма.Форма.Форма(90)}: Об.Записать();
{ВнешняяОбработка.ЗагрузкаКонтрагентов.Форма.Форма.Форма(101)}: ЗагрузитьСвойстваНаСервере();

по причине:
Операция не может быть выполнена из-за несоответствия версии или отсутствия записи базы данных (возможно, запись была изменена или удалена)!
19. Оберон 16 25.10.21 15:12 Сейчас в теме
(18) только если форма открыта. если нет, то при открытии формы произойдет чтение автоматически
vadim.semyonov.rzn; +1 Ответить
21. Оберон 16 25.10.21 15:16 Сейчас в теме
(20) OMG!

// Записывает дополнительные реквизиты и сведения владельцу свойств.
// Изменения происходят в транзакции.
//
// Параметры:
// ВладелецСвойств - Ссылка - например, СправочникСсылка.Номенклатура, ДокументСсылка.ЗаказПокупателя и т.д.
// ТаблицаСвойствИЗначений - ТаблицаЗначений:
// * Свойство - ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения - свойство владельца.
// * Значение - Произвольный - любое значение, допустимое для свойства (указано в элементе свойства).
//
Процедура ЗаписатьСвойстваУОбъекта(ВладелецСвойств, ТаблицаСвойствИЗначений) Экспорт


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

	ТаблицаДопРеквизитов = Новый ТаблицаЗначений;
	ТаблицаДопРеквизитов.Колонки.Добавить("Свойство", Новый ОписаниеТипов("ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения"));
	ТаблицаДопРеквизитов.Колонки.Добавить("Значение");



или воспользоваться
РаботаСНоменклатуройУТ.ЗаполнитьДополнительныеРеквизитыНоменклатуры(НоменклатураСсылка, ДополнительныеРеквизиты);

или для заполнения формы:
РаботаСНоменклатуройУТ.ЗаполнитьДополнительныеРеквизитыНоменклатурыВФорме(Форма, ТаблицаИзменений);
22. TamaraPicachu 2 25.10.21 15:26 Сейчас в теме
(21) А все равно непонятно. Номенклатура и так ссылка на объект, про таблицу значений вообще непонятно тогда, раз не саму таблицу надо указывать. Потом еще что-то про процедуру) Я еще только начинаю и не могу читать между строк, не обязательно так реагировать, если кто-то Вас не понимает с полуслова
23. Оберон 16 25.10.21 15:44 Сейчас в теме +0.4 $m
(22) В общем код должен быть типа такого, немного доделайте под себя

ТаблицаДопРеквизитов = Новый ТаблицаЗначений;
ТаблицаДопРеквизитов.Колонки.Добавить("Свойство", Новый ОписаниеТипов("ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения"));
ТаблицаДопРеквизитов.Колонки.Добавить("Значение");

Для Каждого СтрокаДанных Из ДанныеФайла Цикл          
	ТаблицаДопРеквизитов.Очистить();
	Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(СтрокаДанных.Наименование);
	Если Номенклатура = Справочники.Номенклатура.ПустаяСсылка() Тогда
		Продолжить;
	КонецЕсли;
	// ДопСвойство_1
	Если ЗначениеЗаполнено(ЗнСвойства1) Тогда
		нСтрока = ТаблицаДопРеквизитов.Добавить();
		нСтрока.Свойство = "ДопСвойство_1";
		нСтрока.Значение = ЗнСвойства1;
	КонецЕсли;

	// ДопСвойство_2
	Если ЗначениеЗаполнено(ЗнСвойства2) Тогда
		нСтрока = ТаблицаДопРеквизитов.Добавить();
		нСтрока.Свойство = "ДопСвойство_2";
		нСтрока.Значение = ЗнСвойства2;
	КонецЕсли;
	
	УправлениеСвойствами.ЗаписатьСвойстваУОбъекта(Номенклатура, ТаблицаДопРеквизитов);	
КонецЦикла;

Показать
24. TamaraPicachu 2 25.10.21 15:48 Сейчас в теме
(23) Большое спасибо, попробую, отпишусь
26. пользователь 25.10.21 16:53
Сообщение было скрыто модератором.
...
25. Оберон 16 25.10.21 16:02 Сейчас в теме
(24)
используйте проверку на наличие значения свойства, что то типа:

Если ЗначениеЗаполнено(ЗнСвойства) Тогда
    нСтрока = ТаблицаДопРеквизитов.Добавить();
    нСтрока.Свойство = "ДопСвойство_1";
    нСтрока.Значение = ЗнСвойства;
КонецЕсли;

код выше изменил добавил проверки
27. TamaraPicachu 2 25.10.21 17:01 Сейчас в теме
(25) Исправила код, проверки пока не добавляла. При первом открытии свойства заполнены, но опять только на вкладке карточка( В реквизитах пусто. При записи, закрытии и открытии, соответственно все стирается.

Процедура ЗагрузитьСвойстваНаСервере()
	
	ТаблицаДопРеквизитов = Новый ТаблицаЗначений;
	ТаблицаДопРеквизитов.Колонки.Добавить("Свойство", Новый ОписаниеТипов("ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения"));
	ТаблицаДопРеквизитов.Колонки.Добавить("Значение");

	Пользователь = Пользователи.ТекущийПользователь();
	Номер = 0;
	Для Каждого СтрокаДанных Из ДанныеФайла Цикл  		
			
			Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(СтрокаДанных.Ссылка);
			
			Если Номенклатура = Справочники.Номенклатура.ПустаяСсылка()  Тогда
				Продолжить;
			Иначе
				
		Номер = Номер + 1;
		
		
		ТаблицаДопРеквизитов.Очистить();
		
		НоваяСтрока = ТаблицаДопРеквизитов.Добавить();
		НоваяСтрока.Свойство = СтрокаДанных.Свойство;
		НоваяСтрока.Значение = СтрокаДанных.Значение;
		УправлениеСвойствами.ЗаписатьСвойстваУОбъекта(Номенклатура, ТаблицаДопРеквизитов);  		
		
	КонецЕсли;
Показать
29. svsrus 178 26.10.21 01:03 Сейчас в теме +0.1 $m
		Спр = Справочники.Номенклатура.НайтиПоНаименованию(СтрокаДанных.Ссылка); //Ваше
		
		ТЗСвойств = Новый ТаблицаЗначений;
		Колонки = ТЗСвойств.Колонки;
		Колонки.Добавить("Свойство");
		Колонки.Добавить("Значение");

		МассивДопРеквизитов = УправлениеСвойствами.СвойстваОбъекта(Спр, Истина); // Получаем все доп.реквизиты номенклатуры
		Для Каждого ДопРеквизит Из МассивДопРеквизитов  Цикл
			НоваяСтрока = ТЗСвойств.Добавить();
			НоваяСтрока.Свойство = ДопРеквизит;
			//Здесь можно анализироват Наименование доп.реквизита и в заивимости от этого записывать ваше значение
			// но нужно учесть, какого типа доп.реквизит. Если строка или число, проблем нет. Если тип Дополнительное значение, 
			// то придется программно искать в справочнике ссылку на это значение.
			Если НоваяСтрока.Свойство.Наименование = СтрокаДанных.Свойство Тогда //Ваша строка из xls, скорее всего строка с названием доп.реквизита.
				НоваяСтрока.Значение = СтрокаДанных.Значение;
			КонецЕсли;
		КонецЦикла;
		
		УправлениеСвойствами.ЗаписатьСвойстваУОбъекта(Спр, ТЗСвойств);
Показать
serge-ce1; prog2019; +2 Ответить
30. TamaraPicachu 2 26.10.21 12:46 Сейчас в теме
(29) да, проблема была в типе значения, спасибо.
Оставьте свое сообщение

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