Как вывести картинку из интернета по HTTPS-ссылке в управляемой форме 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Почему стандартный метод не работает?

Рассмотрим стандартное поведение платформы. Реквизит формы с типом Строка, связанный с элементом Поле картинки, ожидает либо навигационную ссылку на данные в информационной базе, либо адрес во временном хранилище (вида e1cib/tempstorage/...). Прямая поддержка внешних протоколов http и https в свойстве "Путь к данным" на уровне платформы не реализована. Это означает, что 1С не умеет «на лету» выполнять HTTP-запрос при отрисовке формы. Следовательно, нам необходимо взять процесс получения данных в свои руки.

Способ 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. Привязка к форме

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

АдресКартинкиНаФорме = ПолучитьАдресКартинкиИзИнтернета(СсылкаНаКартинку);

Способ 2: Использование Поля HTML-документа

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

Разберем алгоритм действий:

  1. Создайте реквизит формы с типом Строка (неограниченной длины), назовите его ТекстHTML.
  2. Вынесите его на форму и установите вид Поле HTML-документа.
  3. Программно сформируйте простейший 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С не находит корневой сертификат сайта в своем хранилище. Решить это можно двумя путями:

Кэширование данных

Выполнять HTTP-запрос при каждом открытии формы или, что еще хуже, при каждой активизации строки в списке — плохая практика. Проанализируем ситуацию: если у вас список из 50 товаров, и для каждого вы качаете картинку «на лету», интерфейс будет ощутимо «тормозить». Рекомендуется использовать кэширование:

  1. Создайте регистр сведений или справочник для хранения двоичных данных.
  2. Перед обращением в интернет проверьте: нет ли у нас уже скачанной картинки для этого URL?
  3. Если есть — берите её из базы. Если нет — скачайте, сохраните и покажите.

Использование прокси-сервера

В корпоративных сетях доступ к интернету часто идет через прокси. В этом случае в объекте HTTPСоединение необходимо явно прописать параметры прокси-сервера (адрес, порт, логин и пароль), иначе 1С просто не сможет «выйти» за пределы локальной сети.

Таким образом, мы рассмотрели два принципиально разных подхода. Первый (через временное хранилище) дает полный контроль над данными и стабильность отображения. Второй (через HTML) позволяет быстро вывести изображение без лишних манипуляций на сервере. Выбор зависит от конкретных архитектурных требований вашей задачи.

← На главную