Как скопировать ХЗ в реквизите справочника при его копировании

  1. 8 г. назад

    Сабж

  2. Хз- хранилище значения?
    Только в регистр гоянуть и оттуда скопировать.

    Ответы: (2)
  3. (1) да, хранилище значение.
    Справочник с реквизитом в табличной части типа ХранилищеЗначений
    Как правильно скопировать?

    Ответы: (3)
  4. bvn13 Как правильно скопировать?

    Под копировать - что понимается? Если копирование элемента справочника, то хранилище значений ничем не отличается от обычного реквизита.

    Ответы: (4)
  5. (3) отличается. Да, когда юзер вводит новый элемент копированием, то в реквизитах с типом ХЗ больше ничего нет, ибо .Получить() возвращает Неопределено

    Ответы: (12)
  6. Если не ошибаюсь то значение реквизита с типом ХЗ хранится в регистре сведений что то типа "значения реквизитов" и вся та беда ещё связана с ПВХ что ли, как то там замудрённо хранится всё это.

    Ответы: (6)
  7. (5) не, ты ошибаешься

  8. ХЗ - это blob

  9. Что такое blob?

    Ответы: (10)
  10. Объект?

  11. (8) бинарные данные

  12. Ясно

  13. bvn13 отличается

    ну тогда копируй в ПриКопировании

    Ответы: (13)
  14. (12) оно не копируется. Вот в чем прикол. Написал программное копирование и в ПриКопировании, и в ПриСозданииНаСервере - все проходит без ошибок, но потом получение - неопределено

    Ответы: (14) (15) (16)
  15. (13) может не так прописал? код в студию.

    Ответы: (15) (16)
  16. sf (13) может не так прописал? код в студию.

    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    	Если ЗначениеЗаполнено(ЭтаФорма.Параметры.ЗначениеКопирования) Тогда
    		ОбъектКопирования = ЭтаФорма.Параметры.ЗначениеКопирования;
    		ТекОбъект = РеквизитФормыВЗначение("Объект");
    		
    		Для й = 0 ПО ТекОбъект.Файлы.Количество()-1 Цикл
    			Попытка
    				ТекОбъект.Файлы[й].Файл = ОбъектКопирования.Файлы[й].Файл.Получить();
    			Исключение
    				Сообщить("Не скопировался файл, прикрепленный в "+й+" строке");
    			КонецПопытки;
    		КонецЦикла;
    		ТекОбъект.Записать();
    		ЗначениеВРеквизитФормы(ТекОбъект, "Объект");
    	КонецЕсли;
    КонецПроцедуры
    
    Ответы: (18)
  17. sf (13) может не так прописал? код в студию.

    Процедура ПриКопировании(ОбъектКопирования)
    	
    	ДанныеФайлов = Новый Массив;
    	
    	Для й = 0 ПО Файлы.Количество()-1 Цикл
    		Попытка
    			Адрес = Новый УникальныйИдентификатор;
    			Файл = ПоместитьВоВременноеХранилище(Новый ХранилищеЗначения(ОбъектКопирования.Файлы[й].Файл.Получить()), Адрес);
    			ДанныеФайлов.Добавить(Файл);
    		Исключение
    			ДанныеФайлов.Добавить(Неопределено);
    			Сообщить("В строке "+(й+1)+" не скопировался файл");
    		КонецПопытки;
    	КонецЦикла;
    	
    	ДополнительныеСвойства.Вставить("ДанныеФайлов", ДанныеФайлов);
    	
    КонецПроцедуры
    
    Ответы: (18)
  18. 25.10.2016 16:14:53 отредактировано Ёпрст
    ТекОбъект.Файлы[й].Файл = Новый ХранилищеЗначения(ОбъектКопирования.Файлы[й].Файл.Получить());

    так может ?

    Ответы: (19) (20)
  19. (15)(16) хм. имхо, достаточно было бы перенести из ОбъектКопирования в ЭтотОбъект

    Ответы: (20)
  20. (17) гг. именно так. я щас уже скопировал код, который не юзаю. Делал, как ты написал - один фиг

    Ответы: (20)
  21. (18) я так и делаю, см (17), (19)

    Ответы: (21)
  22. (20) что ты делаешь? ок... 5 сек

  23. 1. Файлы - это ЭтотОбъект, а не ОбъектКопирования. то есть ты копируешь из нового объекта
    2. Можно копировать сразу в ПриКопировании. ОбъектКопирования - Старый объект.
    ЭтотОбъект - новый.
    Тебе достаточно 5 строк кода в одной процедуре

    Ответы: (24) (25)
  24. 	 
    Процедура ПриКопировании(ОбъектКопирования)
    	
    	
    	Для й = 0 ПО ОбъектКопирования.Файлы.Количество()-1 Цикл
    		ЭтотОбъект.Файлы[й] = Новый ХранилищеЗначения(ОбъектКопирования.Файлы[й].Файл.Получить());
    		
    	КонецЦикла;
    	
    	
    КонецПроцедуры
    

    попробуй так

    Ответы: (26)
  25. sf то есть ты копируешь из нового объекта

    забираю обратно, тут проглядел

  26. sf 1. Файлы - это ЭтотОбъект, а не ОбъектКопирования. то есть ты копируешь из нового объекта
    2. Можно копировать сразу в ПриКопировании. ОбъектКопирования - Старый объект.
    ЭтотОбъект - новый.
    Тебе достаточно 5 строк кода в одной процедуре

    я не обернул в ПриСохданииНаСервере в ХранилищеЗначений :)

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

    вот так заработало

  27. sf

    	 
    Процедура ПриКопировании(ОбъектКопирования)
    	
    	
    	Для й = 0 ПО ОбъектКопирования.Файлы.Количество()-1 Цикл
    		ЭтотОбъект.Файлы[й] = Новый ХранилищеЗначения(ОбъектКопирования.Файлы[й].Файл.Получить());
    		
    	КонецЦикла;
    	
    	
    КонецПроцедуры
    

    попробуй так

    с этого я начал - не работает

или зарегистрируйтесь чтобы ответить!