Копирование присоединенных файлов объекта

1. Тильчик 19.06.19 12:08 Сейчас в теме
Всем привет. Возникла такая потребность - конфигурация ERP 2.4, в справочнике "Номенклатура" есть присоединенные файлы. Их нужно скопировать в справочник "Сделки"
Пишу так:
		ЗапросПоПрикрепленнымФайлам = Новый Запрос("ВЫБРАТЬ
		                                           |	НоменклатураПрисоединенныеФайлы.ПометкаУдаления КАК ПометкаУдаления,
		                                           |	НоменклатураПрисоединенныеФайлы.Наименование КАК Наименование,
		                                           |	НоменклатураПрисоединенныеФайлы.Автор КАК Автор,
		                                           |	НоменклатураПрисоединенныеФайлы.ДатаМодификацииУниверсальная КАК ДатаМодификацииУниверсальная,
		                                           |	НоменклатураПрисоединенныеФайлы.ДатаСоздания КАК ДатаСоздания,
		                                           |	НоменклатураПрисоединенныеФайлы.Зашифрован КАК Зашифрован,
		                                           |	НоменклатураПрисоединенныеФайлы.Изменил КАК Изменил,
		                                           |	НоменклатураПрисоединенныеФайлы.ИндексКартинки КАК ИндексКартинки,
		                                           |	НоменклатураПрисоединенныеФайлы.Описание КАК Описание,
		                                           |	НоменклатураПрисоединенныеФайлы.ПодписанЭП КАК ПодписанЭП,
		                                           |	НоменклатураПрисоединенныеФайлы.ПутьКФайлу КАК ПутьКФайлу,
		                                           |	НоменклатураПрисоединенныеФайлы.Размер КАК Размер,
		                                           |	НоменклатураПрисоединенныеФайлы.Расширение КАК Расширение,
		                                           |	НоменклатураПрисоединенныеФайлы.Редактирует КАК Редактирует,
		                                           |	НоменклатураПрисоединенныеФайлы.СтатусИзвлеченияТекста КАК СтатусИзвлеченияТекста,
		                                           |	НоменклатураПрисоединенныеФайлы.ТекстХранилище КАК ТекстХранилище,
		                                           |	НоменклатураПрисоединенныеФайлы.удалитьТипХраненияФайла КАК удалитьТипХраненияФайла,
		                                           |	НоменклатураПрисоединенныеФайлы.Том КАК Том,
		                                           |	НоменклатураПрисоединенныеФайлы.ФайлХранилище КАК ФайлХранилище,
		                                           |	НоменклатураПрисоединенныеФайлы.ТипХраненияФайла КАК ТипХраненияФайла,
		                                           |	НоменклатураПрисоединенныеФайлы.ХранитьВерсии КАК ХранитьВерсии,
		                                           |	НоменклатураПрисоединенныеФайлы.ДатаЗаема КАК ДатаЗаема,
		                                           |	НоменклатураПрисоединенныеФайлы.ИДФайлаЭлектронногоПисьма КАК ИДФайлаЭлектронногоПисьма
		                                           |ИЗ
		                                           |	Справочник.НоменклатураПрисоединенныеФайлы КАК НоменклатураПрисоединенныеФайлы
		                                           |ГДЕ
		                                           |	НоменклатураПрисоединенныеФайлы.ВладелецФайла = &ВладелецФайла");
		ЗапросПоПрикрепленнымФайлам.УстановитьПараметр("ВладелецФайла",МояНоменклатура.Ссылка);
		РезультатПоПрикрепленнымФайлам = ЗапросПоПрикрепленнымФайлам.Выполнить().Выбрать();
		Пока РезультатПоПрикрепленнымФайлам.Следующий() Цикл
			НовыйФайлСделки = Справочники.СделкиСКлиентамиПрисоединенныеФайлы.СоздатьЭлемент();
			НовыйФайлСделки.Заполнить(РезультатПоПрикрепленнымФайлам);
			НовыйФайлСделки.ВладелецФайла = ОбъектСделка.Ссылка;
			НовыйФайлСделки.Записать();
		КонецЦикла;
Показать


Файл создается, но при попытке открыть его выходит ошибка что двоичные данные удалены. Никто не сталкивался с такой задачей?
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
11. Тильчик 19.06.19 13:50 Сейчас в теме
вот эта строчка лишняя:
НовыйФайлСделки.Заполнить(РезультатПоПрикрепленнымФайлам);

сделал заполнение по реквизитам, взлетело
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. tusv 212 19.06.19 12:17 Сейчас в теме
(1) Что то вы полей навыбирали, а используете только одно - Ссылка
. Логично в запросе Оставить Ссылка и .ФайлХранилище
Ну наверное надо написать. Не проверял
 Пока РезультатПоПрикрепленнымФайлам.Следующий() Цикл
            НовыйФайлСделки = Справочники.СделкиСКлиентамиПрисоединенныеФайлы.СоздатьЭлемент();
            НовыйФайлСделки.Заполнить(РезультатПоПрикрепленнымФайлам);
            НовыйФайлСделки.ВладелецФайла = ОбъектСделка.Ссылка;
            НовыйФайлСделки.ФайлХранилище = Новый ХранилищеЗначений(РезультатПоПрикрепленнымФайлам.ФайлХранилище .Получить()); 
           НовыйФайлСделки.Записать();
 КонецЦикла;
4. Тильчик 19.06.19 12:39 Сейчас в теме
5. kondratevsergey1985 19.06.19 12:43 Сейчас в теме
(1)

Я так понял, у вас файлы номенклатуры хранятся в базе (а не во внешнем томе). Тогда двоичные данные этих файлов хранятся не в справочнике НоменклатураПрисоединенныеФайлы, а в регистре сведений ДвоичныеДанныеФайлов. Поэтому вам помимо создания элемента справочника СделкиСКлиентамиПрисоединенныеФайлы нужно ещё копировать соответствующие записи из регистра ДвоичныеДанныеФайлов.

Если вас смущает реквизит ФайлХранилище в справочнике НоменклатураПрисоединенныеФайлы, то это служебный реквизит, конечный файл хранится всё же в регистре ДвоичныеДанныеФайлов.
6. Тильчик 19.06.19 12:54 Сейчас в теме
(5) Как раз нет, они хранятся в томе
7. kondratevsergey1985 19.06.19 13:00 Сейчас в теме
(6)
Может тогда попробовать перед записью элемента справочника СделкиСКлиентамиПрисоединенныеФайлы присваивать ФайлХранилище = Неопределено?
8. kondratevsergey1985 19.06.19 13:01 Сейчас в теме
(7)
И реквизит ТекстХранилище тоже Неопределено
9. Тильчик 19.06.19 13:07 Сейчас в теме
10. Тильчик 19.06.19 13:08 Сейчас в теме
2. platonov.e 159 19.06.19 12:15 Сейчас в теме
Ну там вроде как нужно файл хранилища преобразовать в двоичные данные, и их уже загрузить в новый объект...
11. Тильчик 19.06.19 13:50 Сейчас в теме
вот эта строчка лишняя:
НовыйФайлСделки.Заполнить(РезультатПоПрикрепленнымФайлам);

сделал заполнение по реквизитам, взлетело
12. bigtrim 08.02.21 22:37 Сейчас в теме
Как понять по реквизитам?
Просто вручную прописать
 НовыйФайлСделки.ДатаСоздания = Выборка.ДатаСоздания;


и так все реквизиты?
Риник; +1 Ответить
14. EmpireSer 19.09.22 18:07 Сейчас в теме
(11)
А теперь попробуйте удалить соответствующий файл из номенклатуры (пометка на удаление и произвести удаление помеченных) и будете "радоваться" тому, что тот же файл в "Сделки" перестанет открываться :-)
Вам надо было, прежде чем так делать, увидеть как БСП обрабатывает удаление у таких справочников и тогда такой "просто ход" вы сразу бы отмели.

P.S. Кстати с реквизитом "ПодписанЭП" тоже словите проблемы, если у вас используется ЭЦП в работе. Там тоже нужно копирование делать по другому.
13. nano1c 172 16.09.22 12:29 Сейчас в теме
Все проще:

НовыйФайл = Справочники.ДоговорыКонтрагентовПрисоединенныеФайлы.СоздатьЭлемент();
ЗаполнитьЗначенияСвойств(НовыйФайл, ст.Ссылка2,,"Код, Владелец");
НовыйФайл.ВладелецФайла = дог.Ссылка;

НовыйФайл.Записать();
15. EmpireSer 19.09.22 18:09 Сейчас в теме
(13)
Неа, вот так скопируйте файл, а потом на исходном установите пометку удаления и произведите удаление помеченных. И в результате у вас скопированный файл тоже перестанет открываться.
16. nano1c 172 21.09.22 11:24 Сейчас в теме
(15) интересно) А чтобы была копия, нужно добавить ФайлХранилище .получить()?
17. user1831019 21.09.22 11:27 Сейчас в теме
(16) Ну да, надо делать не только копию карточки файла, но и копию самого файла.
18. EmpireSer 21.09.22 15:24 Сейчас в теме
(16)
Да.Самым лучшим способом будет:
1) Вначале получить двоичные данные исходного файла.
ПрисоединенныеФайлы.ПолучитьДвоичныеДанныеФайла(ссылка).

2) Создать новый присоединённый файл как будто просто добавляется новый, потом его отредактировать и записать заново:
ФайлАдресВоВременномХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанные);

НачатьТранзакцию();
Попытка
	НовыйПрисоединенныйФайлСсылка = ПрисоединенныеФайлы.ДобавитьФайл(Владелец, ФайлИмяБезРасширения, ФайлРасширение, , , ФайлАдресВоВременномХранилище);
	НовыйПрисоединенныйФайлОбъект = НовыйПрисоединенныйФайлСсылка.ПолучитьОбъект();
	... ну тут заполняешь те реквизиты, которые безопасно копировать...
	
	НовыйПрисоединенныйФайлОбъект.Записать();
	
	ЗафиксироватьТранзакцию();
Исключение
	ОтменитьТранзакцию();
	ВызватьИсключение;
КонецПопытки;

Возврат НовыйПрисоединенныйФайлСсылка;
Показать

Вот и всё. Можно конечно ещё сделать защиту от случайной повторной попытки скопировать один и тот же присоединённый файл и т.п., но это уже мелочи.

А вот по ЭЦП не подскажу. У нас старая БСП, где ЭЦП писались в табличную часть самого присоединённого файла (как знаю в новых это уже отдельный регистр сведений). Но всё равно примера их копирования у меня нет.
Marliiin; simgo83; +2 Ответить
19. simgo83 70 22.01.23 18:13 Сейчас в теме
Для БСП 3.1.7.190

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

    	 КонецЕсли;
	КонецЦикла; 

Показать


Где "ВыборкаДетальныеЗаписи.ФайлКартинки" ссылка на присоединенный файл
archi517; +1 Ответить
20. user779438 30.05.23 09:34 Сейчас в теме
21. user779438 30.05.23 14:53 Сейчас в теме
(20) Работает только для Источника и Получателя одного типа. Тогда как выше только чуть короче
КопируемыеФайлы = Новый Массив;
РаботаСФайлами.ЗаполнитьПрисоединенныеФайлыКОбъекту(ДокументОснование, КопируемыеФайлы);
Для Каждого КопируемыйФайл Из КопируемыеФайлы Цикл 
	АдресДвоичныхДанных = ПоместитьВоВременноеХранилище(РаботаСФайлами.ДвоичныеДанныеФайла(КопируемыйФайл));
	ПараметрыФайла = Новый Структура(
	"ВладелецФайлов,Автор,ИмяБезРасширения,РасширениеБезТочки,ВремяИзмененияУниверсальное", 
	Ссылка, КопируемыйФайл.Автор, КопируемыйФайл.Наименование, КопируемыйФайл.Расширение, 
	КопируемыйФайл.ДатаМодификацииУниверсальная);
			
	РаботаСФайлами.ДобавитьФайл(ПараметрыФайла, АдресДвоичныхДанных);			
КонецЦикла;
Показать
Redempty; user639001_sadykova; taasha25; +3 Ответить
22. lummox 05.05.24 15:55 Сейчас в теме
(21) Для одного типа достаточно одной строки:
РаботаСФайлами.СкопироватьПрисоединенныеФайлы(Знач Источник, Знач Получатель)
Оставьте свое сообщение

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