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

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

Как в 1С получить ссылку на картинку

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

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

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

Определяем, где хранится картинка

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

В типовых конфигурациях (Управление торговлей, ERP, Бухгалтерия) картинки обычно лежат в подчинённом справочнике присоединённых файлов — например, «НоменклатураПрисоединенныеФайлы». Двоичные данные при этом хранятся либо в информационной базе, либо в томах на диске, а в реквизите файла находится только ссылка на место хранения. Третий вариант — картинка вообще находится вне 1С, на диске или на сайте, и в базе хранится лишь путь к ней.

Реквизит с типом ХранилищеЗначенияКартинка внутри объекта

Используйте ПолучитьНавигационнуюСсылку

Присоединённые файлыТиповой механизм БСП

Используйте РаботаСФайлами или временное хранилище

Путь к файлу на дискеКартинка вне базы

Загрузите в хранилище или опубликуйте каталог на веб-сервере

Получаем навигационную ссылку на реквизит с картинкой

Если изображение хранится в реквизите объекта с типом «Хранилище значения», самый короткий путь — функция ПолучитьНавигационнуюСсылку(). Она возвращает строку вида e1cib/data/Справочник.Товары?ref=...&fieldName=Картинка, которую можно присвоить реквизиту формы с видом «Поле картинки» — и изображение отобразится без дополнительной обработки.

&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

ТоварСсылка = Параметры.Товар;

// КартинкаФормы — реквизит формы типа Строка,

// связанный с элементом "Поле картинки"

КартинкаФормы = ПолучитьНавигационнуюСсылку(ТоварСсылка, "Картинка");

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

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

У этого способа есть ограничение: навигационная ссылка работает только внутри сеанса 1С и привязана к конкретному объекту. Передать её на сайт или в мобильное приложение как постоянный URL нельзя — для внешнего доступа нужен другой подход.

Помещаем картинку во временное хранилище

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

&НаСервере

Процедура ЗагрузитьКартинкуНаСервере()

ДвоичныеДанные = Новый ДвоичныеДанные("C:\Images\photo.jpg");

АдресКартинки = ПоместитьВоВременноеХранилище(

ДвоичныеДанные, УникальныйИдентификатор);

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

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

Даём ссылку на картинку для внешних систем

Если картинку нужно показать на сайте, в личном кабинете или передать в мобильное приложение, навигационная ссылка и временное хранилище не подойдут. Здесь есть два рабочих варианта. Первый — опубликовать информационную базу на веб-сервере (IIS или Apache) и создать HTTP-сервис, который по запросу с идентификатором объекта возвращает двоичные данные картинки с нужным Content-Type.

Второй вариант — выгрузить картинки в отдельный каталог, опубликовать этот каталог на веб-сервере как виртуальный, а в 1С хранить только относительный путь файла. Тогда ссылка формируется простой конкатенацией: базовый адрес сервера плюс имя файла. Этот способ быстрее работает под нагрузкой, так как веб-сервер отдаёт статику без обращения к 1С.

Сравнение вариантов

HTTP-сервис в 1С

Картинки всегда актуальны, но каждая отдача нагружает сервер 1С; подходит при небольшом числе запросов

Статический каталог на веб-сервере

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

Временное хранилище

Только для отображения внутри формы 1С, не подходит для внешнего доступа

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

Проверка зависит от способа. Для навигационной ссылки достаточно открыть форму и убедиться, что картинка отображается; пустое поле обычно означает, что реквизит не заполнен или имя реквизита указано с ошибкой. Для временного хранилища проверьте, что адрес не пустой и начинается с e1cib/tempstorage. Для HTTP-доступа откройте сформированный URL в браузере — должна открыться сама картинка, а не страница ошибки.

Типичные ошибки
01
Опечатка в имени реквизита в ПолучитьНавигационнуюСсылку — функция возвращает пустую строку, картинка не отображается
02
Помещение в хранилище без передачи УникальныйИдентификатор формы — адрес очищается после завершения серверного вызова, и картинка пропадает
03
Попытка использовать навигационную ссылку как URL на сайте — ссылка вида e1cib недоступна браузеру
04
Отдача двоичных данных через HTTP-сервис без заголовка Content-Type — браузер скачивает файл вместо показа картинки
Контрольные точки

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

Содержимое переменной со ссылкой
Норма

Строка вида e1cib/data/... или e1cib/tempstorage/...

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

Пустая строка или Неопределено

Отображение в форме
Норма

Картинка видна в поле картинки

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

Поле пустое, хотя объект содержит изображение

URL в браузере
Норма

Открывается изображение

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

Ошибка 404, 403 или скачивание файла

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

Можно ли получить постоянную ссылку на картинку внутри 1С?

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

Почему ПолучитьНавигационнуюСсылку возвращает пустую строку?

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

Как показать картинку из присоединённых файлов типовой конфигурации?

Получите двоичные данные функцией РаботаСФайлами.ДвоичныеДанныеФайла(ФайлСсылка), поместите их во временное хранилище с идентификатором формы и присвойте адрес реквизиту формы, связанному с полем картинки.

Как отдать картинку на сайт без HTTP-сервиса?

Выгрузите файлы в каталог, опубликованный на веб-сервере как виртуальный, и формируйте ссылку из базового адреса и имени файла. Для синхронизации используйте регламентное задание или выгрузку при записи объекта.

Работает ли временное хранилище в тонком и веб-клиенте?

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

Итог

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

Для отображения картинки в форме используйте ПолучитьНавигационнуюСсылку по реквизиту объекта или ПоместитьВоВременноеХранилище для произвольных данных. Для внешнего доступа нужен HTTP-сервис или статический каталог на веб-сервере — навигационные ссылки за пределами 1С не работают.