Всем привет. Возникла такая потребность - конфигурация ERP 2.4, в справочнике "Номенклатура" есть присоединенные файлы. Их нужно скопировать в справочник "Сделки"
Пишу так:

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

Файл создается, но при попытке открыть его выходит ошибка что двоичные данные удалены. Никто не сталкивался с такой задачей?
---
вот эта строчка лишняя:
```1c
    НовыйФайлСделки.Заполнить(РезультатПоПрикрепленнымФайлам);
```

сделал заполнение по реквизитам, взлетело
---
Что то вы полей навыбирали, а используете только одно - Ссылка
. Логично в запросе Оставить Ссылка и .ФайлХранилище
Ну наверное надо написать. Не проверял

```1c
    Пока РезультатПоПрикрепленнымФайлам.Следующий() Цикл
    НовыйФайлСделки = Справочники.СделкиСКлиентамиПрисоединенныеФайлы.СоздатьЭлемент();
    НовыйФайлСделки.Заполнить(РезультатПоПрикрепленнымФайлам);
    НовыйФайлСделки.ВладелецФайла = ОбъектСделка.Ссылка;
    НовыйФайлСделки.ФайлХранилище = Новый ХранилищеЗначений(РезультатПоПрикрепленнымФайлам.ФайлХранилище .Получить());
    НовыйФайлСделки.Записать();
    КонецЦикла;
```
---
- не работает
---
Я так понял, у вас файлы номенклатуры хранятся в базе (а не во внешнем томе). Тогда двоичные данные этих файлов хранятся не в справочнике НоменклатураПрисоединенныеФайлы, а в регистре сведений ДвоичныеДанныеФайлов. Поэтому вам помимо создания элемента справочника СделкиСКлиентамиПрисоединенныеФайлы нужно ещё копировать соответствующие записи из регистра ДвоичныеДанныеФайлов.

Если вас смущает реквизит ФайлХранилище в справочнике НоменклатураПрисоединенныеФайлы, то это служебный реквизит, конечный файл хранится всё же в регистре ДвоичныеДанныеФайлов.
---
Как раз нет, они хранятся в томе
---
Может тогда попробовать перед записью элемента справочника СделкиСКлиентамиПрисоединенныеФайлы присваивать ФайлХранилище = Неопределено?
---
И реквизит ТекстХранилище тоже Неопределено
---
сейчас попробую
---
Нет, такая же ошибка
---
Ну там вроде как нужно файл хранилища преобразовать в двоичные данные, и их уже загрузить в новый объект...
---
вот эта строчка лишняя:
```1c
    НовыйФайлСделки.Заполнить(РезультатПоПрикрепленнымФайлам);
```

сделал заполнение по реквизитам, взлетело
---
Как понять по реквизитам?
Просто вручную прописать

```1c
    НовыйФайлСделки.ДатаСоздания = Выборка.ДатаСоздания;
```

и так все реквизиты?
---
А теперь попробуйте удалить соответствующий файл из номенклатуры (пометка на удаление и произвести удаление помеченных) и будете "радоваться" тому, что тот же файл в "Сделки" перестанет открываться :-)
Вам надо было, прежде чем так делать, увидеть как БСП обрабатывает удаление у таких справочников и тогда такой "просто ход" вы сразу бы отмели.

P.S. Кстати с реквизитом "ПодписанЭП" тоже словите проблемы, если у вас используется ЭЦП в работе. Там тоже нужно копирование делать по другому.
---
Все проще:

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

        НовыйФайл.Записать();
---
Неа, вот так скопируйте файл, а потом на исходном установите пометку удаления и произведите удаление помеченных. И в результате у вас скопированный файл тоже перестанет открываться.
---
интересно) А чтобы была копия, нужно добавить ФайлХранилище .получить()?
---
Ну да, надо делать не только копию карточки файла, но и копию самого файла.
---
Да.Самым лучшим способом будет:
1) Вначале получить двоичные данные исходного файла.

```1c
    ПрисоединенныеФайлы.ПолучитьДвоичныеДанныеФайла(ссылка).
```

2) Создать новый присоединённый файл как будто просто добавляется новый, потом его отредактировать и записать заново:

```1c
    ФайлАдресВоВременномХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанные);

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

    НовыйПрисоединенныйФайлОбъект.Записать();

    ЗафиксироватьТранзакцию();
    Исключение
    ОтменитьТранзакцию();
    ВызватьИсключение;
    КонецПопытки;

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

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

А вот по ЭЦП не подскажу. У нас старая БСП, где ЭЦП писались в табличную часть самого присоединённого файла (как знаю в новых это уже отдельный регистр сведений). Но всё равно примера их копирования у меня нет.
---
Для БСП 3.1.7.190

```1c
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
    Если ВыборкаДетальныеЗаписи.ИзменениеНоменклатуры и ЗначениеЗаполнено(ВыборкаДетальныеЗаписи.НоменклатураКИзменению) тогда
    ОбъектНоменклатуры = ВыборкаДетальныеЗаписи.НоменклатураКИзменению.ПолучитьОбъект();
    Иначе
    ОбъектНоменклатуры= Справочники.Номенклатура.СоздатьЭлемент();
    КонецЕсли;

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

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

Где "ВыборкаДетальныеЗаписи.ФайлКартинки" ссылка на присоединенный файл
---
Почему для БСП не воспользоваться СкопироватьПрисоединенныеФайлы?
---
Работает только для Источника и Получателя одного типа. Тогда как выше только чуть короче

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

    РаботаСФайлами.ДобавитьФайл(ПараметрыФайла, АдресДвоичныхДанных);
    КонецЦикла;
```
---
Для одного типа достаточно одной строки:

```1c
    РаботаСФайлами.СкопироватьПрисоединенныеФайлы(Знач Источник, Знач Получатель)
```