Разработка и Конфигурация · 10 мин
1С: как получить ссылку на файл
Как в 1С получить ссылку на файл: навигационная ссылка, временное хранилище, присоединенные файлы, ПолучитьСсылку. Примеры кода на встроенном языке и типичные ошибки.
Запрос «как получить ссылку на файл в 1С» на практике означает три разные задачи: получить ссылку на элемент справочника, где хранится файл (например, «Файлы» или «Присоединенные файлы»), получить навигационную ссылку для открытия файла в интерфейсе, либо получить URL временного хранилища, чтобы передать двоичные данные между клиентом и сервером или отдать файл во внешнюю систему. Способ выбирается по тому, где файл лежит и что вы собираетесь делать со ссылкой дальше.
В типовых конфигурациях (БСП, ERP, УТ, Бухгалтерия) файлы обычно хранятся не как реквизиты, а как элементы справочников «Файлы» или «<ИмяОбъекта>ПрисоединенныеФайлы», а сами двоичные данные — в регистре сведений или в томе на диске. Поэтому «ссылка на файл» — это чаще всего ссылка на элемент такого справочника, а не путь на диске.
Ниже разобраны все рабочие варианты: от получения ссылки по известному объекту до формирования URL для веб-сервиса, с проверкой результата и разбором типичных ошибок.
Определяем, какая именно «ссылка» нужна
Прежде чем писать код, ответьте на два вопроса: где физически хранится файл и кто будет потребителем ссылки. От этого зависит весь дальнейший подход, и подмена одного сценария другим — самая частая причина нерабочего кода.
- Ссылка на объект метаданных — СправочникСсылка на элемент «Файлы» или «ПрисоединенныеФайлы». Нужна, чтобы программно читать данные файла, записывать его в реквизиты, строить отчеты.
- Навигационная ссылка — строка вида
e1cib/data/Справочник.Файлы?ref=.... Нужна, чтобы пользователь открыл файл кликом в интерфейсе, в письме или в сообщении. - Адрес временного хранилища — строка, возвращаемая ПоместитьВоВременноеХранилище(). Нужна для передачи двоичных данных между клиентом и сервером или в веб-сервис.
- Путь на диске или в томе — физическое расположение, если файловое хранилище вынесено в тома. Прямой доступ к нему из кода 1С — исключение, а не правило.
Как выбрать способ
Получаем ссылку на присоединенный файл типовой конфигурации
В конфигурациях на Библиотеке стандартных подсистем файлы привязываются к владельцу — документу или элементу справочника. Чтобы получить массив ссылок на все файлы объекта, используется функция общего модуля РаботаСФайлами:
МассивФайлов = РаботаСФайлами.ПрисоединенныеФайлы(СсылкаНаВладельца);
Для Каждого ФайлСсылка Из МассивФайлов Цикл
// ФайлСсылка — ссылка на элемент справочника присоединенных файлов
КонецЦикла;
Если нужен конкретный файл по имени, массив фильтруют по реквизиту «Наименование» или «Описание». Учтите, что имя справочника присоединенных файлов зависит от конфигурации: например, «ПриходныйОрдерПрисоединенныеФайлы» или общий «Файлы». Точное имя смотрите в дереве метаданных или через ТипЗнч() на найденной ссылке.
Получив ссылку, двоичные данные извлекают так:
ДвоичныеДанные = РаботаСФайлами.ДвоичныеДанныеФайла(ФайлСсылка);
Функция вернет Неопределено, если файл хранится в томе, который недоступен, или данные были удалены. Всегда проверяйте результат перед записью на диск или передачей дальше.
Получаем ссылку по уникальному идентификатору
Вторая частая задача — восстановить ссылку на файл по GUID, например при обмене данными или при разборе строки навигационной ссылки. Для этого у менеджера справочника есть метод ПолучитьСсылку:
Идентификатор = Новый УникальныйИдентификатор("b7e4c2a0-....");
ФайлСсылка = Справочники.Файлы.ПолучитьСсылку(Идентификатор);
Важный нюанс: ПолучитьСсылку возвращает ссылку даже если объекта с таким GUID не существует в базе — это будет «битая» ссылка. Поэтому результат обязательно проверяют:
Если ФайлСсылка.ПолучитьОбъект() = Неопределено Тогда
// Объекта нет в базе, ссылка пустая или битая
КонецЕсли;
Обратная операция — получить GUID из существующей ссылки — выполняется через свойство УникальныйИдентификатор(): Строка(ФайлСсылка.УникальныйИдентификатор()). Эта пара методов стандартно используется в обменах, когда ссылку нельзя передать напрямую.
Формируем навигационную ссылку для открытия файла
Навигационная ссылка позволяет открыть форму файла в клиенте 1С без программного поиска. Получается она одной строкой:
НавСсылка = ПолучитьНавигационнуюСсылку(ФайлСсылка);
// Результат: e1cib/data/Справочник.Файлы?ref=...
Такую строку можно показать пользователю, вставить в текст письма или передать в метод ПерейтиПоНавигационнойСсылке(). Если база опубликована на веб-сервере, навигационную ссылку можно дополнить адресом публикации и открывать объект прямо из браузера или тонкого клиента по полному URL.
Для открытия самого содержимого файла (а не карточки) в типовых решениях используют РаботаСФайламиКлиент.ОткрытьФайл() с предварительным получением данных файла на клиенте — навигационная ссылка в этом сценарии не подменяет штатный механизм открытия.
НавСсылка = ПолучитьНавигационнуюСсылку(ФайлСсылка);
Если СтрДлина(НавСсылка) > 0 Тогда
ПерейтиПоНавигационнойСсылке(НавСсылка);
КонецЕсли;Получаем URL через временное хранилище
Когда файл нужно передать между сервером и клиентом или отдать через HTTP-сервис, используется временное хранилище. Метод ПоместитьВоВременноеХранилище возвращает адрес — строку, по которой данные доступны в течение сеанса или до явного удаления:
Адрес = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификаторФормы);
Второй параметр привязывает данные к форме: пока форма жива, хранилище не очищается. Без привязки данные живут до конца сеанса, что при массовых операциях может привести к росту потребления памяти на сервере. После использования хранилище освобождают вызовом УдалитьИзВременногоХранилища(Адрес).
Для отдачи файла через собственный HTTP-сервис временное хранилище обычно не нужно: в теле ответа возвращают двоичные данные напрямую, а адрес хранилища используют только для внутренней передачи между вызовами сервера.
Проверяем результат и типичные ошибки
После получения ссылки убедитесь, что она валидна и ведет на реальный объект. Минимальный набор проверок: ссылка не пустая, объект существует в базе, двоичные данные извлекаются без ошибки.
Как проверить результат
Ссылка заполнена, ТипЗнч() показывает нужный справочник
Неопределено или пустая ссылка — объект не найден
ПолучитьОбъект() вернул объект
ПолучитьОбъект() вернул Неопределено — битая ссылка
ДвоичныеДанныеФайла вернул данные ненулевого размера
Неопределено или ошибка доступа к тому хранения
Строка начинается с e1cib/data/
Пустая строка — передана неверная ссылка
Отдельно отметим прав доступа. Если пользователь не видит файлы объекта в интерфейсе, код под его сеансом тоже не получит данные — RLS и права на справочник присоединенных файлов действуют и на программные обращения. Для служебных операций (обмены, регламентные задания) код выполняют в привилегированном режиме, осознанно принимая риск обхода ограничений.
Что важно запомнить
Ссылка на файл в 1С — это ссылка на элемент справочника присоединенных файлов, навигационная строка или адрес временного хранилища, в зависимости от задачи. Получайте ссылки штатными функциями РаботаСФайлами, всегда проверяйте существование объекта после ПолучитьСсылку и очищайте временное хранилище после использования.
Частые вопросы
Как получить ссылку на файл, если известен только путь на диске?
Никак напрямую: файл на диске и объект в базе не связаны. Нужно сначала создать элемент справочника присоединенных файлов и поместить в него данные (в БСП — РаботаСФайлами.ДобавитьФайл), после чего функция вернет ссылку на созданный объект.
Почему ПолучитьСсылку возвращает ссылку, а объекта в базе нет?
Метод ПолучитьСсылку конструирует ссылку из GUID без обращения к данным. Существование объекта проверяется отдельно — через ПолучитьОбъект() или запросом по ссылке.
Можно ли открыть файл в браузере по прямой ссылке?
Да, если база опубликована на веб-сервере: навигационная ссылка дополняется адресом публикации. Для отдачи содержимого файла внешним системам правильнее создать HTTP-сервис, который по GUID найдет файл и вернет двоичные данные в теле ответа.
Как получить ссылки на все файлы сразу по нескольким документам?
Используйте запрос к справочнику присоединенных файлов с условием «ВладелецФайла В (&МассивВладельцев)» — это быстрее, чем вызывать ПрисоединенныеФайлы в цикле для каждого объекта.
Чем отличается адрес временного хранилища от навигационной ссылки?
Навигационная ссылка указывает на объект базы и действует постоянно. Адрес временного хранилища указывает на данные в памяти сервера и действует только в рамках сеанса или времени жизни формы.
Почему ДвоичныеДанныеФайла возвращает Неопределено?
Чаще всего файл хранится в томе, к которому нет доступа у сервера 1С, либо данные были удалены из хранилища при очистке. Проверьте настройки томов хранения файлов и права учетной записи службы сервера.