HTTP-сервисы. Автообновление страницы

04.08.23

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

Как вывести в web отчет из 1С с автообновлением.

К моменту, когда мне прилетела задача на вывод пользователям отчета с автообновлением в веб формате, на Инфостарте уже была отличная статья про http-сервисы (//infostart.ru/public/516810/) и долго думать, с какой стороны к ним подходить, мне не пришлось.

Всего какие то полчаса - час на соображение, как лучше получить html-код, не обучаясь ничему новому,  и у меня был готов код:

Ответ = Новый HTTPСервисОтвет(200);	
Ответ.Заголовки["Content-Type"] = "text/html; charset=utf-8";

ТОтчет = Отчеты.мониторТест.Создать();
ТРезультат = новый ТабличныйДокумент();
Тотчет.СкомпоноватьРезультат(ТРезультат);	
ВременныйФайл = ПолучитьИмяВременногоФайла(".html");
ТРезультат.Записать(ВременныйФайл, ТипФайлаТабличногоДокумента.HTML5);
ТекстДокHТМЛ = Новый ТекстовыйДокумент;
ТекстДокHТМЛ.Прочитать(ВременныйФайл);
ТекстHТМЛ = ТекстДокHТМЛ.ПолучитьТекст();
УдалитьФайлы(ВременныйФайл);

Ответ.УстановитьТелоИзСтроки(ТекстHТМЛ);   

Совсем иначе обстояли дела с автообновлением. Первое обращение к Гуглу подсказало строку 

ТекстHТМЛ = СтрЗаменить(ТекстHТМЛ,"<META","<meta http-equiv=""Refresh"" content=""30"" /><META");

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

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

setInterval(Сюда пихаем наш блок  с iframe, здесь интервал обновления в милисекундах)

и оставалось два насущных вопроса, которые в последствии переросли в один:

  1. хотелось справиться одним методом http-сервиса, дабы не плодить
  2. хотелось, несмотря на две загружаемых страницы, пароль в 1С вводить только один раз, т.е. при открытии первой страницы.

Оказалось, что пункты практически взаимоисключающие(если у кого-то есть решение - расскажите, буду благодарна)

Если вы выбрали обойтись одним методом - вы должны быть уверены, что ваш браузер сохраняет пароль. У меня Гугл-Хром даже в режиме Инкогнито пароль в пределах одного сеанса сохраняется, поэтому удалось обойтись одним методом. Код получился примерно вот таким:

Ответ = Новый HTTPСервисОтвет(200);	
ТПользователь = ПараметрыСеанса.ТекущийПользователь;
Ответ.Заголовки["Content-Type"] = "text/html; charset=utf-8"; //сообщаем что это html		
//ТекстPostзапроса = "http://адрес веб-сервера/имя базы/hs/test/cities";
Если Запрос.ПараметрыЗапроса.Получить("User") = Неопределено  тогда				
	ТОтчет = Отчеты.мониторТест.Создать();
	ТРезультат = новый ТабличныйДокумент();
	Тотчет.СкомпоноватьРезультат(ТРезультат);			
	ВременныйФайл = ПолучитьИмяВременногоФайла(".html");
	ТРезультат.Записать(ВременныйФайл, ТипФайлаТабличногоДокумента.HTML5);			
	ТекстДокHТМЛ = Новый ТекстовыйДокумент;
	ТекстДокHТМЛ.Прочитать(ВременныйФайл);
	ТекстHТМЛ = ТекстДокHТМЛ.ПолучитьТекст();   
	//ТекстHТМЛ = СтрЗаменить(ТекстHТМЛ,"<META","<meta http-equiv=""Refresh"" content=""30"" /><META"); 			 
	УдалитьФайлы(ВременныйФайл);
Иначе
	ТекстHТМЛ = "<html>"+"<head>"+"<script>"
				+"setInterval(function(){"     //Вызов нашей функции
				+"    document.getElementById(""myiframe"").src="""  //указываем откуда ей грузить страницу в iframe
				+Запрос.БазовыйURL +Запрос.ОтносительныйURL  //динамически формируем ссылку на сервис с указанием в качестве параметра пользователя, под которым залогинились в первый раз
				+"?User="+СокрЛП(ПараметрыСеанса.ТекущийПользователь)
				+"""},30000);"
				+"</script></head>"
				+"<body overflow=hidden>"  //убираем прокрутку нашей основной страницы, чтобы была видна только прокрутка в фрейме
				+"<iframe id=""myiframe"" frameborder=no  width=100% height = 98%"	
				" > Ваш браузер не поддерживает фреймы </iframe>"					
				+"</body>"+"</html>";		
КонецЕсли;		
Ответ.УстановитьТелоИзСтроки(ТекстHТМЛ);		
Возврат Ответ;

Если ваш браузер при загрузке второй страницы требует снова ввести пароль, то придется шаманить на более низком уровне и создавать два http-сервиса. Второй, ссылка на который находится в iframe, может заходить в базу по преавторизации и, получая в качестве параметра имя вашего пользователя, обрабатывать в отчете необходимые отборы в соответствии с правами пользователя. Это безусловно добавит вам мороки при создании отчета, но цель превыше. Подробнее как настроить это описано вот здесь http://1centerprise8.blogspot.ru/2015/06/avtorizacija-vebservisa.html

См. также

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

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

36000 руб.

03.08.2020    17780    19    22    

16

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

Интеграция 1С и Битрикс 24. Разработка имеет двухстороннюю синхронизацию 1С и Bitrix24 задачами. Решение позволяет создавать пользователя в 1С из Битрикс24 и наоборот. Данная разработка технически подходит под все основные конфигурации линейки продуктов 1С:Предприятие 8.3 (платформа начиная с 8.3.23). При приобретении предоставляется 1 месяц бесплатных обновлений разработки. Доступна демо-версия продукта с подключением Вашего Битрикс24

5040 руб.

04.05.2021    19844    13    17    

16

WEB-интеграция 8.3.8 Конфигурации 1cv8 Автомобили, автосервисы Беларусь Украина Россия Казахстан Управленческий учет Платные (руб)

Расширение предназначено для конфигурации "1С:Предприятие 8. Управление Автотранспортом. ПРОФ". Функционал модуля: 1. Заполнение регистров сведений по подсистеме "Мониторинг", а именно: события по мониторингу, координаты по мониторингу, пробег и расход по мониторингу, текущее местоположение ТС по мониторингу 2. Заполнение путевого листа: пробег по мониторингу, время выезда/заезда, табличная часть ГСМ, места стоянок по геозонам. 3. Отчеты по данным загруженным в регистры сведений. 4. Предусмотрена автоматическая загрузка данных в фоновом режиме (условия работы данной загрузке читайте в описании товара) Модуль работает без включенной константы по настройкам мониторинга. Модуль формы предоставляется с открытым кодом, общий модуль защищен. Любой заинтересованный пользователь, имеет возможность скачать демо-версию расширения.

22656 руб.

25.05.2021    14421    42    8    

18

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

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

24000 руб.

27.09.2024    1168    1    0    

3
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. gzharkoj 520 04.08.23 17:02 Сейчас в теме
А вариант с асинхронными запросами не рассматривали, например https://jquery-docs.ru/jQuery.ajax/ ?
Тут уже можно в 1с выстроить так архитектуру, чтобы можно было определять, поменялись ли данные и только в этом случае запрашивать полные данные из 1с.
2. s_vidyakin 68 04.08.23 17:50 Сейчас в теме
(1) jQuery ? Вы из 2007 года прилетели что ли
EvilMilko; +1 Ответить
3. gzharkoj 520 04.08.23 18:19 Сейчас в теме
(2) а что не так с jQuery, там удобная обертка над объектами для асинхронной работы, можете любую другую обертку взять, можете напрямую использовать объекты, это суть меняет? К тому на github коммиты там постоянные, не заброшена, не понимаю вашего вопроса.
cleaner_it; +1 Ответить
5. s_vidyakin 68 04.08.23 18:34 Сейчас в теме
(3) она считалась устаревшей и потерявшей смысл уже лет 5 назад, бессмысленно тянуть целую библиотеку ради одной функции fetch, которая уже есть встроенная в любом браузере
maksa2005; efin; gzharkoj; +3 Ответить
4. s_vidyakin 68 04.08.23 18:29 Сейчас в теме
немного не понял зачем городить iframe и meta тег, когда можно просто 5 строчек js написать и грузить через тот же setInterval html напрямую:
const html = document.getElementsByTag('html')[0]
const int = setInterval(async () => {
    const response = await fetch("АДРЕС ВАШЕГО СЕРВИСА ГЕНЕРАЦИИ ОТЧЕТА")
    if (response.ok) html.setHTML(await response. text())
}, 10000) // 10 секунд


Дальше простор фантазии может далеко улететь - можно добавить кнопки для ручной загрузки отчета, включения/выключения автозагрузки, добавление отчета внутрь красивого блока а не целиком html и т.д.
cleaner_it; JohnyDeath; siamagic; +3 Ответить
6. webester 26 10.08.23 12:00 Сейчас в теме
(4)Когда комменты интереснее статьи)
ShiningPhoenix; maksa2005; +2 Ответить
Оставьте свое сообщение