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