К моменту, когда мне прилетела задача на вывод пользователям отчета с автообновлением в веб формате, на Инфостарте уже была отличная статья про 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, здесь интервал обновления в милисекундах)
и оставалось два насущных вопроса, которые в последствии переросли в один:
- хотелось справиться одним методом http-сервиса, дабы не плодить
- хотелось, несмотря на две загружаемых страницы, пароль в 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