К статье
Практический материал

Разработка и Конфигурация · 10 мин

1С: как получить ссылку на файл

Как в 1С получить ссылку на файл: навигационная ссылка, временное хранилище, присоединенные файлы, ПолучитьСсылку. Примеры кода на встроенном языке и типичные ошибки.

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

В типовых конфигурациях (БСП, ERP, УТ, Бухгалтерия) файлы обычно хранятся не как реквизиты, а как элементы справочников «Файлы» или «<ИмяОбъекта>ПрисоединенныеФайлы», а сами двоичные данные — в регистре сведений или в томе на диске. Поэтому «ссылка на файл» — это чаще всего ссылка на элемент такого справочника, а не путь на диске.

Ниже разобраны все рабочие варианты: от получения ссылки по известному объекту до формирования URL для веб-сервиса, с проверкой результата и разбором типичных ошибок.

Определяем, какая именно «ссылка» нужна

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

  • Ссылка на объект метаданных — СправочникСсылка на элемент «Файлы» или «ПрисоединенныеФайлы». Нужна, чтобы программно читать данные файла, записывать его в реквизиты, строить отчеты.
  • Навигационная ссылка — строка вида e1cib/data/Справочник.Файлы?ref=.... Нужна, чтобы пользователь открыл файл кликом в интерфейсе, в письме или в сообщении.
  • Адрес временного хранилища — строка, возвращаемая ПоместитьВоВременноеХранилище(). Нужна для передачи двоичных данных между клиентом и сервером или в веб-сервис.
  • Путь на диске или в томе — физическое расположение, если файловое хранилище вынесено в тома. Прямой доступ к нему из кода 1С — исключение, а не правило.
Маршрут решения

Как выбрать способ

Нужно программно прочитать или изменить файл, привязанный к документуПолучите ссылки через РаботаСФайлами.ПрисоединенныеФайлы(Владелец) и работайте со ссылками справочника
Нужно, чтобы пользователь открыл файл кликом в форме или письмеИспользуйте ПолучитьНавигационнуюСсылку(СсылкаНаФайл)
Нужно передать двоичные данные на клиент или в HTTP-сервисПоместите данные во временное хранилище и передайте возвращенный адрес
Нужно получить ссылку на объект по известному уникальному идентификаторуИспользуйте Справочники.Файлы.ПолучитьСсылку(Новый УникальныйИдентификатор(СтрокаGUID))

Получаем ссылку на присоединенный файл типовой конфигурации

В конфигурациях на Библиотеке стандартных подсистем файлы привязываются к владельцу — документу или элементу справочника. Чтобы получить массив ссылок на все файлы объекта, используется функция общего модуля РаботаСФайлами:

МассивФайлов = РаботаСФайлами.ПрисоединенныеФайлы(СсылкаНаВладельца);

Для Каждого ФайлСсылка Из МассивФайлов Цикл

// ФайлСсылка — ссылка на элемент справочника присоединенных файлов

КонецЦикла;

Если нужен конкретный файл по имени, массив фильтруют по реквизиту «Наименование» или «Описание». Учтите, что имя справочника присоединенных файлов зависит от конфигурации: например, «ПриходныйОрдерПрисоединенныеФайлы» или общий «Файлы». Точное имя смотрите в дереве метаданных или через ТипЗнч() на найденной ссылке.

Получив ссылку, двоичные данные извлекают так:

ДвоичныеДанные = РаботаСФайлами.ДвоичныеДанныеФайла(ФайлСсылка);

Функция вернет Неопределено, если файл хранится в томе, который недоступен, или данные были удалены. Всегда проверяйте результат перед записью на диск или передачей дальше.

Получаем ссылку по уникальному идентификатору

Вторая частая задача — восстановить ссылку на файл по GUID, например при обмене данными или при разборе строки навигационной ссылки. Для этого у менеджера справочника есть метод ПолучитьСсылку:

Идентификатор = Новый УникальныйИдентификатор("b7e4c2a0-....");

ФайлСсылка = Справочники.Файлы.ПолучитьСсылку(Идентификатор);

Важный нюанс: ПолучитьСсылку возвращает ссылку даже если объекта с таким GUID не существует в базе — это будет «битая» ссылка. Поэтому результат обязательно проверяют:

Если ФайлСсылка.ПолучитьОбъект() = Неопределено Тогда

// Объекта нет в базе, ссылка пустая или битая

КонецЕсли;

Обратная операция — получить GUID из существующей ссылки — выполняется через свойство УникальныйИдентификатор(): Строка(ФайлСсылка.УникальныйИдентификатор()). Эта пара методов стандартно используется в обменах, когда ссылку нельзя передать напрямую.

Формируем навигационную ссылку для открытия файла

Навигационная ссылка позволяет открыть форму файла в клиенте 1С без программного поиска. Получается она одной строкой:

НавСсылка = ПолучитьНавигационнуюСсылку(ФайлСсылка);

// Результат: e1cib/data/Справочник.Файлы?ref=...

Такую строку можно показать пользователю, вставить в текст письма или передать в метод ПерейтиПоНавигационнойСсылке(). Если база опубликована на веб-сервере, навигационную ссылку можно дополнить адресом публикации и открывать объект прямо из браузера или тонкого клиента по полному URL.

Для открытия самого содержимого файла (а не карточки) в типовых решениях используют РаботаСФайламиКлиент.ОткрытьФайл() с предварительным получением данных файла на клиенте — навигационная ссылка в этом сценарии не подменяет штатный механизм открытия.

bsl
НавСсылка = ПолучитьНавигационнуюСсылку(ФайлСсылка);
Если СтрДлина(НавСсылка) > 0 Тогда
    ПерейтиПоНавигационнойСсылке(НавСсылка);
КонецЕсли;

Получаем URL через временное хранилище

Когда файл нужно передать между сервером и клиентом или отдать через HTTP-сервис, используется временное хранилище. Метод ПоместитьВоВременноеХранилище возвращает адрес — строку, по которой данные доступны в течение сеанса или до явного удаления:

Адрес = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификаторФормы);

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

Для отдачи файла через собственный HTTP-сервис временное хранилище обычно не нужно: в теле ответа возвращают двоичные данные напрямую, а адрес хранилища используют только для внутренней передачи между вызовами сервера.

Проверяем результат и типичные ошибки

После получения ссылки убедитесь, что она валидна и ведет на реальный объект. Минимальный набор проверок: ссылка не пустая, объект существует в базе, двоичные данные извлекаются без ошибки.

Контрольные точки

Как проверить результат

Значение ссылки
Норма

Ссылка заполнена, ТипЗнч() показывает нужный справочник

Тревожный признак

Неопределено или пустая ссылка — объект не найден

Существование объекта
Норма

ПолучитьОбъект() вернул объект

Тревожный признак

ПолучитьОбъект() вернул Неопределено — битая ссылка

Двоичные данные
Норма

ДвоичныеДанныеФайла вернул данные ненулевого размера

Тревожный признак

Неопределено или ошибка доступа к тому хранения

Навигационная ссылка
Норма

Строка начинается с e1cib/data/

Тревожный признак

Пустая строка — передана неверная ссылка

Типичные ошибки
01
Использование ПолучитьСсылку без проверки существования объекта — в базу попадают битые ссылки, которые потом ломают обмены
02
Поиск файла по полному имени с расширением, тогда как в реквизите «Наименование» расширение обычно не хранится
03
Чтение двоичных данных в цикле на клиенте вместо серверного вызова — лишний трафик и таймауты на больших файлах
04
Передача адреса временного хранилища между разными сеансами — адрес недействителен вне сеанса, в котором создан
05
Попытка собрать путь к файлу в томе вручную вместо штатных функций БСП — путь ломается при смене настроек хранения

Отдельно отметим прав доступа. Если пользователь не видит файлы объекта в интерфейсе, код под его сеансом тоже не получит данные — RLS и права на справочник присоединенных файлов действуют и на программные обращения. Для служебных операций (обмены, регламентные задания) код выполняют в привилегированном режиме, осознанно принимая риск обхода ограничений.

Итог

Что важно запомнить

Ссылка на файл в 1С — это ссылка на элемент справочника присоединенных файлов, навигационная строка или адрес временного хранилища, в зависимости от задачи. Получайте ссылки штатными функциями РаботаСФайлами, всегда проверяйте существование объекта после ПолучитьСсылку и очищайте временное хранилище после использования.

Частые вопросы

Как получить ссылку на файл, если известен только путь на диске?

Никак напрямую: файл на диске и объект в базе не связаны. Нужно сначала создать элемент справочника присоединенных файлов и поместить в него данные (в БСП — РаботаСФайлами.ДобавитьФайл), после чего функция вернет ссылку на созданный объект.

Почему ПолучитьСсылку возвращает ссылку, а объекта в базе нет?

Метод ПолучитьСсылку конструирует ссылку из GUID без обращения к данным. Существование объекта проверяется отдельно — через ПолучитьОбъект() или запросом по ссылке.

Можно ли открыть файл в браузере по прямой ссылке?

Да, если база опубликована на веб-сервере: навигационная ссылка дополняется адресом публикации. Для отдачи содержимого файла внешним системам правильнее создать HTTP-сервис, который по GUID найдет файл и вернет двоичные данные в теле ответа.

Как получить ссылки на все файлы сразу по нескольким документам?

Используйте запрос к справочнику присоединенных файлов с условием «ВладелецФайла В (&МассивВладельцев)» — это быстрее, чем вызывать ПрисоединенныеФайлы в цикле для каждого объекта.

Чем отличается адрес временного хранилища от навигационной ссылки?

Навигационная ссылка указывает на объект базы и действует постоянно. Адрес временного хранилища указывает на данные в памяти сервера и действует только в рамках сеанса или времени жизни формы.

Почему ДвоичныеДанныеФайла возвращает Неопределено?

Чаще всего файл хранится в томе, к которому нет доступа у сервера 1С, либо данные были удалены из хранилища при очистке. Проверьте настройки томов хранения файлов и права учетной записи службы сервера.