Здравствуйте форумчане. Пишу самописную конфигурацию, надо добавить возможность прикреплять файлы к документам (файлы разные от картинок до вордовских доков). Покурил форумы на эту темы и написал следующий код в документе.

```1c
    &НаКлиенте
    Процедура ЗагрузитьДокумент(Команда)

    Оповещение = Новый ОписаниеОповещения("ОбработатьВыборФайла", ЭтотОбъект);
    НачатьПомещениеФайла(Оповещение, , , Истина, УникальныйИдентификатор);

    КонецПроцедуры

    &НаКлиенте
    Процедура ОбработатьВыборФайла(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт

    //Если пользователь отказался от выбора файла, то закрываем форму
    Если Не Результат Тогда
    Возврат;
    КонецЕсли;

    Модифицированность = Истина;

    ЗаписатьВложениеНаСервере(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры);

    КонецПроцедуры

    &НаСервере
    Процедура ЗаписатьВложениеНаСервере(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры)

    ВыбранныйФайл = Новый Файл(ВыбранноеИмяФайла);

    НовыйФайл = Справочники.ПрисоединенныеФайлы.СоздатьЭлемент();
    НовыйФайл.Наименование = ВыбранныйФайл.Имя;
    НовыйФайл.СсылкаНаДокумент = Объект.Ссылка;

    //Записываем данные файла из временного хранилища в реквизит формы справочника.
    Если ЭтоАдресВременногоХранилища(Адрес) Тогда
    НовыйФайл.Файл = Новый ХранилищеЗначения(ПолучитьИзВременногоХранилища(Адрес));
    КонецЕсли;

    НовыйФайл.Записать();

    КонецПроцедуры
```

И вот такой в форме списка справочника, где хранятся файлы. У реквизита "Файл" справочника стоит тип "хранилище значений"

```1c
    &НаКлиенте
    Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;

    СсылкаНаФайл = ПолучитьНавигационнуюСсылку(ПолучитьХранилище(Элементы.Список.ТекущиеДанные.Код), "Файлы");
    ПолучитьФайл(СсылкаНаФайл, Элементы.Список.ТекущиеДанные.Файл);
    КонецПроцедуры

    &НаСервере
    Функция ПолучитьХранилище(Код)
    Объект = Справочники.ПрисоединенныеФайлы.НайтиПоКоду(Код);
    Возврат Объект.Файл
    КонецФункции
```

Загружается файл вроде нормально и ссылка формируется. Но при попытке загрузить файл выходит ошибка (скриншот прилагаю)

В режиме предприятия пишет "Ошибка получения навигационной ссылки. Возможно передана некорректная ссылка". Прошу вашей помощи, чтобы разобраться в проблеме.
---
У меня вот так работает
  файл1 = Новый ДвоичныеДанные(ПутьКФайлу);
  ФайлДанных = Новый ХранилищеЗначения (Файл1,Новый СжатиеДанных (9));
где ФайлДанных тип Хранилище значений
---
так, это на клиенте

 значение = ФайлДанных.Получить();

 ИмяВременногоФайла = КаталогВременныхФайлов() + Наименование;
        значение.Записать(ИмяВременногоФайла);
        ЗапуститьПриложение(ИмяВременногоФайла);
---
У меня вот так работает
  файл1 = Новый ДвоичныеДанные(ПутьКФайлу);
  ФайлДанных = Новый ХранилищеЗначения (Файл1,Новый СжатиеДанных (9));
где ФайлДанных тип Хранилище значений
---
а ПутьКФайлу это адрес навигационной ссылки?
---
Это путь к файлу на диске, например "c:\1.txt", соот-но если это сервер, то файл надо передать на сервер как временный файл и указать путь ко временному файлу на сервере
---
При загрузке проблем не возникло, но при попытке открыть файл вылезла ошибка.

Как вы читаете файл из хранилища?
---
почитайте работа с файлами
---
У вас ограничен перечень типов файлов которые можно загружать? Я блокнот перетаскиваю, а вот например обработки 1С не могу
---
да. Задается в фильтре.
---
Может вам рассмотреть встраивание БСП в конфигурацию?
Там есть работа с присоединенными файлами.
Подробная инструкция по встраиванию и работе есть на ИТС.
---
Да, хотелось бы понять самому как это реализовать. К БСП успею вернуться, а разбирать сам механизм на основе БСП это убиться. Там в типовой, код очень запутанный, я пытался уже.
---
разбирать сам механизм на основе БСП это убиться
Вы неправильно пытаетесь "готовить" БСП. В большинстве случаев Вам не надо в ней "разбираться". Достаточно добавить нужную подсистему к Вашей конфигурации, и далее использовать ее методы. Как правило, каждый сценарий использования отдельно взятой функции БСП прост, лаконично описан в коде и на ИТС, а также используется в типовых, и эти примеры использования хороши как образцы, шаблоны.

Вы же, когда, к примеру, используете метод платформы СтрНайти(), не пытаетесь "разобраться", как он работает и какой там на С++ алгоритм обработки символов.
---
так, это на клиенте

 значение = ФайлДанных.Получить();

 ИмяВременногоФайла = КаталогВременныхФайлов() + Наименование;
        значение.Записать(ИмяВременногоФайла);
        ЗапуститьПриложение(ИмяВременногоФайла);
---
Уже лучше, при обращении был определен файл, но там проблема с доступом. И я не думаю, что будет хорошо расширять права у пользователей.
---
В целом получилось. Подскажите - временный файл это любой на компьютере?
---
если вы имеете ввиду наименование, то да, есть функция ПолучитьИмяВременногоФайла которая генерирует имя временного файла. Просто это универсальный механизм, вместо временного файла можете создавать любой в любой папке, но тогда Windows, его потом автоматом не почистит.
---
Спасибо. Не подскажите способ определения расширения загружаемого файла?
---
загружаемого в хранилище? Если да, то зачем, это любой двоичный файл, если при отрытии, то процедура ЗапуститьПриложение сама найдет на компе приложение, открывающее файл с данным расширением, если не найдет, спросит чем открыть. Главное, чтобы при помещении в хранилище наименование файла было с расширением.
---
```1c
    &НаКлиенте
    Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    СтруктураФайла = ПолучитьХранилище(Элементы.Список.ТекущиеДанные.Код);
    ФайлДанных = СтруктураФайла.Файл;
    НаименованиеФайла = ПолучитьИмяВременногоФайла() + СтруктураФайла.ИмяФайла;
    ФайлДанных.Записать(НаименованиеФайла);
    ЗапуститьПриложение(НаименованиеФайла);
    КонецПроцедуры

    &НаСервере
    Функция ПолучитьХранилище(Код)
    Объект = Справочники.ПрисоединенныеФайлы.НайтиПоКоду(Код);
    СтруктураФайла = Новый Структура;
    СтруктураФайла.Вставить("Файл", Объект.Файл.Получить());
    СтруктураФайла.Вставить("ИмяФайла", Объект.ИмяФайла); ;
    Возврат СтруктураФайла
    КонецФункции
```

Файл это двоичные данные. В реквизите объекта "ИмяФайла" у меня строка с названием "Скриншот 28-10-2019 103201.jpg", но система не смогла определить корректную программу
---
посмотрите в отладчике НаименованиеФайла, оно у вас без расширения, вот и не запускается, надо так
ПолучитьИмяВременногоФайла("jpg"). т.е. из вашего объекта Имя файла вычленяете расширение и подставляете его в ПолучитьИмяВременногоФайла