Разработка и Конфигурация · 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С.
Сравнение вариантов
Картинки всегда актуальны, но каждая отдача нагружает сервер 1С; подходит при небольшом числе запросов
Быстрая отдача без нагрузки на 1С, но нужна синхронизация файлов при изменении картинок
Только для отображения внутри формы 1С, не подходит для внешнего доступа
Проверяем результат и типичные ошибки
Проверка зависит от способа. Для навигационной ссылки достаточно открыть форму и убедиться, что картинка отображается; пустое поле обычно означает, что реквизит не заполнен или имя реквизита указано с ошибкой. Для временного хранилища проверьте, что адрес не пустой и начинается с e1cib/tempstorage. Для HTTP-доступа откройте сформированный URL в браузере — должна открыться сама картинка, а не страница ошибки.
Как проверить результат
Строка вида e1cib/data/... или e1cib/tempstorage/...
Пустая строка или Неопределено
Картинка видна в поле картинки
Поле пустое, хотя объект содержит изображение
Открывается изображение
Ошибка 404, 403 или скачивание файла
Частые вопросы
Можно ли получить постоянную ссылку на картинку внутри 1С?
Нет, адреса временного хранилища и навигационные ссылки временны по своей природе. Для постоянного доступа храните ссылку на объект или на присоединённый файл и формируйте адрес заново при каждом открытии формы.
Почему ПолучитьНавигационнуюСсылку возвращает пустую строку?
Чаще всего реквизит с указанным именем не существует, имеет другой тип или пуст. Проверьте имя реквизита в конфигураторе и убедитесь, что в объекте действительно сохранены двоичные данные изображения.
Как показать картинку из присоединённых файлов типовой конфигурации?
Получите двоичные данные функцией РаботаСФайлами.ДвоичныеДанныеФайла(ФайлСсылка), поместите их во временное хранилище с идентификатором формы и присвойте адрес реквизиту формы, связанному с полем картинки.
Как отдать картинку на сайт без HTTP-сервиса?
Выгрузите файлы в каталог, опубликованный на веб-сервере как виртуальный, и формируйте ссылку из базового адреса и имени файла. Для синхронизации используйте регламентное задание или выгрузку при записи объекта.
Работает ли временное хранилище в тонком и веб-клиенте?
Да, механизм работает во всех клиентах управляемого приложения. В веб-клиенте учитывайте, что передача больших файлов между клиентом и сервером занимает заметное время, поэтому крупные изображения лучше уменьшать перед помещением в хранилище.
Что важно запомнить
Для отображения картинки в форме используйте ПолучитьНавигационнуюСсылку по реквизиту объекта или ПоместитьВоВременноеХранилище для произвольных данных. Для внешнего доступа нужен HTTP-сервис или статический каталог на веб-сервере — навигационные ссылки за пределами 1С не работают.