Использование HTTP-сервиса для создания "фронтенда" HTML/CSS/jQuery. Продолжение

08.08.19

Интеграция - WEB-интеграция

Получение изображений из информационной базы и отправка файлов через "фронт" на HTML/CSS/JS.

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

Кроме текстового содержимого можно выводить изображения и двоичные файлы для скачивания. Для этого создадим еще один шаблон URL src с двумя методами GET и POST и обработчик к нему. В модуль менеджера обработки включим  функцию для получения изображений:

 
Новый шаблон URL и функции
Модуль HTTP-сервиса
Функция srcПолучить(Запрос)
	Ответ = Новый HTTPСервисОтвет(200);
	Если Запрос.ПараметрыURL["BIN"]="1" Тогда
		Ответ.УстановитьТелоИзДвоичныхДанных(Обработки.HTTP_ОбработкаСервиса.ПолучитьДвоичныеДанные(Запрос.ПараметрыURL["ID_SRC"],Ложь));
	Иначе
		Ответ.УстановитьТелоИзСтроки(Обработки.HTTP_ОбработкаСервиса.ПолучитьДвоичныеДанные(Запрос.ПараметрыURL["ID_SRC"],Истина));
	КонецЕсли;
	Возврат Ответ;
КонецФункции
Модуль менеджера обработки HTTP_ОбработкаСервиса
Функция ПолучитьДвоичныеДанные(Идентификатор,Base64=Ложь) Экспорт
	Если Base64 Тогда
		возврат Base64Строка(БиблиотекаКартинок[Идентификатор].ПолучитьДвоичныеДанные());
	Иначе
		возврат БиблиотекаКартинок[Идентификатор].ПолучитьДвоичныеДанные();
	КонецЕсли;	
КонецФункции

Здесь используется сложный шаблон URL чтобы передать два параметра - формат получения картинки (двоичный или строкой base64) и имя картинки в библиотеке картинок.

Включим в конфигурацию две общие картинки МояКартинка1 и МояКартинка2.

Дополним текст HTML начальной страницы "Получить картинку" и изменим макет JS, добавив два фрагмента:

 
Текст HTML и JS
<!-- Статическая картинка при загрузке страницы-->
<div><img src="src/1/МояКартинка1"></div>


<!-- Кнопка и область для интерактивной загрузки изображения-->
<button type="submit" 
        id="ImgButton" 
        style="top: 8px; left: 0px; height: 21px; width: 150px;" 
        _onclick="GetImage('МояКартинка2')">
     Получить картинку
</button>
<div id="content_img">

</div>
Если начальную страницу формируем из макета "HTML документ", то добавим в $(document).ready фрагмент для инициализации
$('img').each(function(i,elem) {
		$(elem).attr('src',cur_url+"/"+$(elem).attr('src'))
	});
И функцию для получения изображения
function GetImage(img_name)
{
$.ajax({
	  type: "POST",
	  url: cur_url+"/src/2/"+img_name,
	  cache: false,
	  success: function(res){
		 $("#content_img").html("<img src='data:image/png;base64,"+res+"'>");
	   }
    });
}

Изменять атрибут src на абсолютный необходимо в случае, если вы использовали для хранения макет "HTML Документ", так как при вызове метода ПолучитьТекст() 1С подставляет в заголовок страницы фиксированный абсолютный адрес (что-то вроде <base href="v8config://811089b6-4d46-4837-8d19-b992f162542f/mdobject/id07b27b2d-6393-47c9-8641-307eadff3798").

Перезапускаем  веб-сервер и обновим страницу. При загрузке сразу же отобразится изображение МояКартинка1. При нажатии кнопки "Получить картинку" зарузится МояКартинка2, без полной загрузки страницы. Хочу обратить внимание, что вторая картинка приходит с сервера в виде Base64-строки. Таким способом можно в качестве результата возвращать сразу несколько значений в формате JSON или XML, например название, цену, количество и изображение товара (см. ajax-запрос из первой части)


Для отправки файла из браузера на сервер также будем использовать формат base64.

Добавим следующий текст HTML и функцию JavaScript.

 
 Загрузка файлов: HTML и JS
HTML
<div>
	<input type="file" id="file">
	<button
	<div id="status"></div>
</div>
JavaScript
function SendFile()
{
   var reader = new FileReader();
   reader.readAsDataURL($("#file")[0].files[0]);
   reader.onload = function () {

	  $.ajax({
		  type: "POST",
		  url: cur_url+"/ajax",
		  data: JSON.stringify(
                  {action: "SendFile", 
		  		   name: $("#file")[0].files[0].name,
		  		   file: reader.result.split('base64,')[1]
		  		  }),
		  cache: false,
		  success: function(html){
			 $("#status").html(html);
		   }
	    }); 
   };
}

И изменим созданную в первой части функцию в модуле менеджера обработки:

 
 Обработки.HTTP_ОбработкаСервиса.ОбработатьЗапросAjax()
Функция ОбработатьЗапросAjax(СтруктураJSON) Экспорт
	Если СтруктураJSON.action="SendFile" Тогда
		Попытка
			ДД=Base64Значение(СтруктураJSON.file);
			ДД.Записать("D:\"+СтруктураJSON.name);
			Контент="<font color='green'>Файл успешно Принят</font>";
		Исключение
			Контент="<font color='red'>"+ОписаниеОшибки()+"</font>";			
		КонецПопытки;
	Иначе
		Контент="Вы ввели <b>"+
		СтруктураJSON.t+
		"</b>";
	КонецЕсли;
	возврат Контент;
КонецФункции

Теперь функция ОбработатьЗапросAJAX() будет обрабатывать данные и возвращать различный результат в зависимости от значения свойства action. В этом примере для простоты файл записывается из двоичных данных на диск. Однако можно использовать, например, процедура БСП РаботаСФайлами.ДобавитьФайл() для записи файла в информационную базу.


Заключение.

Описанный вариант использования HTTP-сервиса можно использовать для простых задач, например, заполнение анкет и отправка файла с мобильного устройства для обработки, вывод какого-нибудь отчета/диаграммы на большой монитор с обновлением через определенный интервал и т.п. Более сложные веб-приложения лучше реализовать другими средствами, а http-сервис использовать только для обмена

HTTPСервис Web Сайт Доступ HTML

См. также

WEB-интеграция Администрирование веб-серверов Платные (руб)

Веб-портал обеспечивает удобный доступ к конфигурации 1С:ITIL(ИТИЛ), 1С:ITILIUM, Управление IT-отделом 8 через интернет с любого устройства посредством браузера, увеличивая эффективность работы пользователей и снижая нагрузку на сервер. Быстрая инсталляция портала за пару часов, удобный и интуитивно понятный интерфейс и безопасность данных помогут упростить работу с порталом и ускорить выполнение бизнес-процессов компании.

128000 руб.

19.12.2023    4411    5    0    

11

WEB-интеграция Анализ продаж Системный администратор Программист Пользователь Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Управленческий учет Платные (руб)

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

60000 руб.

07.05.2019    35857    71    45    

30

Оптовая торговля Розничная торговля WEB-интеграция 1С:Управление торговлей 10 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Платные (руб)

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

57600 руб.

26.11.2024    3318    3    3    

5

WEB-интеграция Программист Бизнес-аналитик Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Оптовая торговля, дистрибуция, логистика ИТ-компания Платные (руб)

Модуль "Экспортер" — это расширение для 1С, предназначенное для автоматизации процессов выгрузки данных. Оно позволяет эффективно извлекать, преобразовывать и передавать данные из систем 1С в интеграционную платформу Spot2D. Подсистема упрощает настройку, снижает количество ручных операций и обеспечивает удобный контроль данных.

14400 руб.

20.12.2024    1393    9    2    

11

Сайты и интернет-магазины WEB-интеграция Системный администратор Программист Пользователь Платформа 1С v8.3 1C:Бухгалтерия 1С:Управление торговлей 11 Автомобили, автосервисы Россия Управленческий учет Платные (руб)

Интеграционный модуль обмена между конфигурацией Альфа Авто 5 и Альфа Авто 6 и порталом AUTOCRM. Данный модуль универсален. Позволяет работать с несколькими обменами AUTOCRM разных брендов в одной информационной базе в ручном и автоматическом режиме.

36000 руб.

03.08.2020    19685    24    24    

20

WEB-интеграция Программист Руководитель проекта Платформа 1С v8.3 1C:Бухгалтерия 1С:Франчайзи, автоматизация бизнеса Платные (руб)

Расширение значительно упрощает написание API на 1С. Веб программисты получают простой и понятный доступ к 1С. Описание API создаётся автоматически и представляется в виде удобном как для человека, так и для программной обработки.

24000 руб.

27.09.2024    5563    5    2    

6

Сайты и интернет-магазины Интеграция WEB-интеграция Платформа 1С v8.3 1C:Бухгалтерия Управленческий учет Платные (руб)

Решение осуществляет синхронизацию задач Битрикс24 и 1С, что позволяет в одной системе ставить задачи, контролировать выполнение всего пула задач с группировкой по ответственным и проектам, формировать управленческие отчеты по работе сотрудников (загрузка, просроченные задачи), уведомлять сотрудников о ходе выполнения задач посредством чат-бот Telegram

7200 руб.

04.05.2021    21317    14    19    

18
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. osivv 270 09.08.19 23:00 Сейчас в теме
Вот это да, сколько разномастного кода... Так и не понял для чего это всё.
triviumfan; +1 Ответить
2. Diversus 2335 16.12.20 12:09 Сейчас в теме
А зачем картинку так сложно получать?
В тексте пишите:
<img src="ПУТЬ_К_HTTP_СЕРВИСУ/img.png">
В сервисе ловите, если это img.png, то возвращаете двоичные данные и картинка отрисовывается сама браузером.
Вот и все.
Зачем эти сложности?
Я статью опубликовал на эту тему:
Универсальный HTTP-сервис на платформе 1С, аля HTTP-сервер с примером
Посмотрите, там такой же принцип работы о котором я говорю.
3. Sedaiko 594 16.12.20 13:07 Сейчас в теме
(2) ПУТЬ_К_HTTP_СЕРВИСУ в src нежелателен, а то в случае использование обратного прокси (а по хорошему его и нужно использовать для доступа из вне) картинка потеряется. тогда уже относительный путь src='img.png'
4. Diversus 2335 16.12.20 13:33 Сейчас в теме
(3) Да, хорошее замечание. Еще кстати, с картинкой можно передавать заголовки, что-то типа:
Ответ.Заголовки.Вставить("Cache-Control", "public, max-age=36000");

В этом случае сам браузер будет кэшировать картинку. Это позволяет существенно сократить число запросов к сервису.
Оставьте свое сообщение