В процессе разработки на платформе 1С:Предприятие 8.3 часто возникает задача отображения внешних графических данных. Например, это могут быть фотографии товаров с сайта поставщика, логотипы компаний или аватары пользователей, доступные по прямой ссылке. Однако многие начинающие (и даже опытные) разработчики сталкиваются с тем, что стандартное Поле картинки при указании в качестве пути к данным прямого URL-адреса остается пустым. Проанализируем, почему так происходит, и разберем эффективные способы решения этой задачи.
Рассмотрим стандартное поведение платформы. Реквизит формы с типом Строка, связанный с элементом Поле картинки, ожидает либо навигационную ссылку на данные в информационной базе, либо адрес во временном хранилище (вида e1cib/tempstorage/...). Прямая поддержка внешних протоколов http и https в свойстве "Путь к данным" на уровне платформы не реализована. Это означает, что 1С не умеет «на лету» выполнять HTTP-запрос при отрисовке формы. Следовательно, нам необходимо взять процесс получения данных в свои руки.
Этот метод считается классическим и наиболее надежным. Суть его заключается в программном скачивании двоичных данных картинки на стороне сервера и передаче их на клиент через временное хранилище. Разберем этот процесс по шагам.
1. Настройка защищенного соединения
Так как сегодня большинство ресурсов работают по протоколу HTTPS, нам обязательно потребуется объект ЗащищенноеСоединениеOpenSSL. Без него попытка установить соединение завершится ошибкой безопасности. Проанализируем пример создания такого соединения:
// Создаем описание защищенного соединения
Защита = Новый ЗащищенноеСоединениеOpenSSL(Неопределено, Неопределено);
2. Выполнение запроса к серверу
Для получения картинки нам нужно разделить URL на части: имя сервера и путь к файлу. После этого мы создаем HTTPСоединение и выполняем GET-запрос. Посмотрим на программный код реализации этой логики:
&НаСервере
Функция ПолучитьАдресКартинкиИзИнтернета(ПолныйURL)
// Парсим URL (в реальном коде стоит использовать функции разбора строки)
// Для примера возьмем: https://its.1c.ru/img/logo.png
ИмяСервера = "its.1c.ru";
ПутьНаСервере = "/img/logo.png";
Защита = Новый ЗащищенноеСоединениеOpenSSL(Неопределено, Неопределено);
Попытка
Соединение = Новый HTTPСоединение(ИмяСервера, , , , , 10, Защита);
Запрос = Новый HTTPЗапрос(ПутьНаСервере);
Ответ = Соединение.Получить(Запрос);
Если Ответ.КодСостояния = 200 Тогда
// Данные получены успешно
ДвоичныеДанные = Ответ.ПолучитьТелоКакДвоичныеДанные();
Возврат ПоместитьВоВременноеХранилище(ДвоичныеДанные, ЭтаФорма.УникальныйИдентификатор);
Иначе
ЗаписьЖурналаРегистрации("ЗагрузкаКартинки", УровеньЖурналаРегистрации.Ошибка, , , "Ошибка кода: " + Ответ.КодСостояния);
Возврат "";
КонецЕсли;
Исключение
ЗаписьЖурналаРегистрации("ЗагрузкаКартинки", УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки());
Возврат "";
КонецПопытки;
КонецФункции
3. Привязка к форме
Теперь в процедуре ПриСозданииНаСервере или в обработчике команды достаточно присвоить результат функции реквизиту формы, который связан с полем картинки:
АдресКартинкиНаФорме = ПолучитьАдресКартинкиИзИнтернета(СсылкаНаКартинку);
Если мы не хотим нагружать сервер 1С скачиванием файлов, можно переложить эту задачу на клиентское приложение и его встроенный движок браузера. Для этого на форму добавляется элемент типа Поле HTML-документа.
Разберем алгоритм действий:
Строка (неограниченной длины), назовите его ТекстHTML.img.Пример формирования строки:
&НаСервере
Процедура ОбновитьКартинкуHTML(URLКартинки)
ТекстHTML = "<html><body style=""margin:0; padding:0; overflow:hidden;"">
|<img src=""" + URLКартинки + """ style=""width:100%; height:auto;"" />
|</body></html>";
КонецПроцедуры
Преимущества этого метода: 1С не скачивает файл в свою базу или временные папки. Картинку загружает сам компонент браузера. Это работает быстрее для клиента, если интернет-канал позволяет.
Недостатки: Сложнее управлять внешним видом (центрирование, масштабирование). Кроме того, если у пользователя проблемы с настройками Internet Explorer (или WebKit в новых версиях), картинка может не отобразиться из-за блокировок безопасности самого браузера.
Работа с сертификатами (HTTPS)
При использовании первого способа часто возникает ошибка: "Удаленный узел не прошел проверку". Выясним причину: это происходит, когда 1С не находит корневой сертификат сайта в своем хранилище. Решить это можно двумя путями:
cacert.pem, явно указав его в конструкторе ЗащищенноеСоединениеOpenSSL.Кэширование данных
Выполнять HTTP-запрос при каждом открытии формы или, что еще хуже, при каждой активизации строки в списке — плохая практика. Проанализируем ситуацию: если у вас список из 50 товаров, и для каждого вы качаете картинку «на лету», интерфейс будет ощутимо «тормозить». Рекомендуется использовать кэширование:
Использование прокси-сервера
В корпоративных сетях доступ к интернету часто идет через прокси. В этом случае в объекте HTTPСоединение необходимо явно прописать параметры прокси-сервера (адрес, порт, логин и пароль), иначе 1С просто не сможет «выйти» за пределы локальной сети.
Таким образом, мы рассмотрели два принципиально разных подхода. Первый (через временное хранилище) дает полный контроль над данными и стабильность отображения. Второй (через HTML) позволяет быстро вывести изображение без лишних манипуляций на сервере. Выбор зависит от конкретных архитектурных требований вашей задачи.