Создание простых сайтов на основе http сервисов - tips and tricks

22.01.22

Интеграция - Сайты и интернет-магазины

Универсальный метод, html шаблоны, страницы с авторизацией и без, многоязычность, страница авторизации, etc.

Скачать исходный код

Наименование Файл Версия Размер
Страница логина
.html 3,77Kb
2
.html 3,77Kb 2 Скачать
Конфигурация IIS с правилами URL Rewrite
.config 2,08Kb
2
.config 2,08Kb 2 Скачать
Страница логина, настройки IIS и текст модуля HTTP сервиса в одном флаконе
.zip 3,75Kb
8
.zip 3,75Kb 8 Скачать

Сам процесс многократно описан, разобрать HTTPСервисЗапрос и вернуть простую страницу с помощью HTTPСервисОтвет проблем не вызовет. Дьявол, как всегда, в деталях...

Все проверялось на Windows Server 2016 с IIS 10, допиленной УТ11, серверной 1С:Предприятие 8.3 8.3.18.1289, Chrome 97.0.4692.71.

Приемы разработки

Универсальный метод

Допустим, планируем сделать сайт с пятью страницами. В "классике" это требует создания в конфигурации одного сервиса, пяти шаблонов и двух методов для каждого шаблона (GET и POST, если нужны оба) и как минимум от 5 до 10 обработчиков.

Можно сделать один шаблон вида "/{Метод}" и три метода (ГетМетод, ПостМетод и просто Метод), а потом разбирать запрос в коде:

 
 Пример

Это позволит "стандартизовать" элементы HTTPСервисОтвет (в примере - заголовок Content-Type), а также упростит авторизацю (см. ниже).

Шаблоны HTML

Вместо огромных строк вида

ХТМЛ = "
| <!DOCTYPE html>
| <html>
| 	<style>
| 		body { font-family: 'Arial'; text-align: center; vertical-align: middle;}
| 		table { margin-left:auto; margin-right:auto;}
| 	</style>
| 	<body>" + "Здесь рисуем страницу" + "
| 	</body>
| </html>
| ";

гораздо проще использовать шаблон

<!DOCTYPE html>
<html>
	<style>
		body { font-family: 'Arial'; text-align: center; vertical-align: middle;}
		table { margin-left:auto; margin-right:auto;}
	</style>
	<body>
		[PageText]
	</body>
</html>

и читать и обрабатывать его в коде:

	Текст = Новый ЧтениеТекста("MyPage.html");
	ХТМЛ = Текст.Прочитать();
	Текст.Закрыть();
	ХТМЛ = СтрЗаменить(ХТМЛ, "[PageText]", "Здесь рисуем страницу");

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

Мультиязычные страницы

Все просто - задаем язык вывода (по пользователю, группе, или в параметрах запроса) и при замене тега его используем:

	ХТМЛ = СтрЗаменить(ХТМЛ, "[Please sign in]", 
		Нстр("en = 'Please sign in'; 
		es='Por favor, registrese'; 
		pt='Por favor, inscreva-se';", Язык));

 

Авторизация - делаем страницу для логина

Сервис поднимается либо под пользователем ИБ, указанным в default.vrd (ib="Srvr=localhost;usr=user;pwd=pass;Ref=test"), либо требует авторизации - Basic или OpenId. Basic приводит к тому, что при первом обращении к сайту Chrome показывает безобразное окошко с Username и Password. Если ввести правильные реквизиты, они запоминаются и удалить запомненное - целая проблема.

 
Подробности

Мне нигде не попалось то, что можно совместить авторизацию под пользователем из default.vrd и по введенным пользователем реквизитам. Иными словами, даже если пользователь задан в default.vrd, заголовок запроса (JS: request.setRequestHeader("Authorization", "Basic " + btoa(login + ":" + password))) выполнит запрос (откроет сессию 1С) под указанным в нем login.

Рассмотрим страницу логина, которая должна позволить:

  • реализовать и сохранять авторизацию пользователя 1С по логину и паролю;
  • ограничивать время действия авторизации (при неактивности пользователля в течение заданного времени);
  • сообщать о неправильном сочетании логин/пароль;
  • выбирать и сохранять дополнительные параметры сессии (например, язык).

Получить доступ к странице авторизации

Создаем пользователя UserForLogin и указываем его в default.vrd. Для безопасности создаем роль UsersForLogin с единственным правом использования универсального метода (детали тут). Таким образом обращение к странице логина не будет требовать авторизации. А чтобы без авторизации была доступна только страница логина, добавляем в универсальный метод:

	Метод = ?(ПроверитьАвторизацию(Реквест), Реквест.ПараметрыURL["Метод"], "login");

Функция ПроверитьАвторизацию(Реквест)
	Если ПользователиИнформационнойБазы.ТекущийПользователь().Имя = "UserForLogin" Тогда 
		Возврат Ложь; 
	КонецЕсли;
КонецФункции

Получаем реквизиты

Кладем нужное количество html тегов input и собираем login, password и language. Дальше можно добавить заголовок авторизации и сделать POST, но есть проблема - как ее сохранить в браузере.

 
 Подробности

Авторизация через cookie с помощью URL Rewrite

Модуль IIS URL Rewrite позволяет менять серверные переменные IIS, и (о чудо!) - править заголовки ВХОДЯЩИХ запросов. Делаем два шага:

  • кладем в запрос куку с готовым токеном;
  • настраиваем входное правило URL Rewrite, которое из этой куки (при ее наличии) делает заголовок Authoriization.

После настройки любой запрос к 1С с правильной кукой превращается в запрос с правильной Basic Auth. Кука сохраняется в последующих запросах этой сессии.

Тексты (код для открытия окна с кукой и web.config с правилами) в приложенных файлах.

Время действия авторизации

Если по неактивности (т.е. пользователь перестал обращаться к страницам в течение заданного времени), то в конец универсального метода добавляем 

	Ответ.Заголовки.Вставить("Set-Cookie", "TimeLimit=Active; Max-Age=100");

А в функции ПроверитьАвторизацию проверяем ее наличие:

	Куки = Реквест.Заголовки.Получить("Cookie");
	Возврат СтрНайти(Куки, "TimeLimit=Active") > 0;

После этого при любом запросе, поступившем более чем через 100 секунд после предыдущего, ПроверитьАвторизацию вернет Ложь и универсальный метод вернет страницу логина.

Можно считать время от последней авторизации (добавлять куку в функции Логин), можно задать абсолютный период (до конкретной даты), можно совместить с кукой авторизации - нет пределов совершенству :).

Неправильный логин/пароль

Под катом выше объяснено, почему в этом случае браузер все равно выкинет свое окошко авторизации. Во избежание этого добавим исходящее правило в URL Rewrite - заменим в заголовке WWW-Authenticate "Basic" на "None" (или что другое, главное, не "Digest"). А для перехвата ошибки авторизации без перехода на другую страницу сделаем в JS страницы fetch к любой рабочей странице сайта (кроме логина) с введенными реквизитами. Если fetch вернет 401, обработаем его в скрипте и культурно напишем на странице "Invalid login/password" (или что выбранный язык предложит).

Тут тоже возможны варианты - fetch или XMLHttpRequest, специальная страница для проверки, кука или заголовок авторизации... 

Подробности (полная страница логина и web.config с правилами) в приложенных файлах. В login_sample.html намеренно оставлены следы экспериментов. В web_sample.config включен trace результатов URL Rewrite.

Вишенка для тех, кто дочитал до конца и не догадался

Язык и прочие неободимые параметры, выбираемые при авторизации (подразделение, цвет фона страниц и прочее) на странице логина кладем в куку и извлекаем в универсальном методе.

URL rewrite incoming request Authorization header HTTP сервис сайт авторизация Basic

См. также

Оплата покупок "Долями" в 1С:Розница 2.3 (для работы с сервисом dolyame.ru)

Сайты и интернет-магазины Платформа 1С v8.3 1С:Розница 2 Розничная и сетевая торговля (FMCG) Россия Платные (руб)

Готовое интеграционное решение для оплаты покупок Долями в 1C:Розница 2.3. Реализовано в виде расширения. Интеграция сервиса dolyame.ru для приема платежей в рассрочку.

18000 руб.

19.12.2023    1879    15    6    

11

Интеграция Альфа Авто 5 / Альфа Авто 6 и AUTOCRM / Инфотек

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

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

36000 руб.

03.08.2020    16076    13    18    

13

Обмен данными с сайтом. БП 3.0

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

Обмен данными с сайтом на платформе 1С:Битрикс (и подобными) для 1С: Бухгалтерия предприятия 3.0.

12000 руб.

18.03.2019    31842    117    101    

66

Интеграция 1С — Битрикс24. Обмен задачами

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

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

5040 руб.

04.05.2021    18146    10    15    

16

Универсальный парсер интернет-магазинов

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

С того времени, как я начал парсить сайты, прошло много лет. За это время я спарсил более 100 сайтов и записал эти товары в 1С. В итоге на свет появился универсальный парсер, который поможет Вам спарсить интернет-магазин и при этом не написать ни строчки кода.

9600 руб.

19.10.2018    52516    220    101    

112

SALE! 33%

«Мониторинг цен» – сервис для отслеживания цен конкурентов на ведущих маркетплейсах России

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

Сервис помогает отслеживать цены на ведущих маркетплейсах России только для одного региона – Москва и Московская область. Выполняйте анализ и контролируйте цены Ваших конкурентов сразу в системе 1С.

2400 1608 руб.

29.05.2023    6954    27    41    

15

Выгрузка для АВИТО

Сайты и интернет-магазины Платформа 1С v8.3 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Управление торговлей 11 Россия Платные (руб)

Выгрузка товаров услуг из 1С для сайта "Авито" раздел "Автозагрузка" выполнена в виде обработки. Обработка подходит для конфигураций УТ, УНФ и Розница. Данная обработка позволяет создавать шаблон с объявлениями для "Авито" - "Автозагрузка".

4200 руб.

07.06.2022    15875    43    56    

38
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. o.nikolaev 213 24.01.22 02:07 Сейчас в теме
Т.е. можно свой Tomcat написать на 1С-ке? :))
6. axelerleo 340 24.01.22 13:21 Сейчас в теме
(1) Скорее, это будет что-то вроде бэкенд фреймворка.
В основном, 1С можно достаточно эффективно использовать в интранете.
Можно как полностью готовую http страницу возвращать, так и использовать какой-нибудь фронт в связке с json, например, или возвращать фрагменты в ajax.
json для Swagger UI, тикеты в OTRS по текущему пользователю, полностью сверстанные на стороне 1С справочные страницы - это из того что на практике довелось делать.
А вот с использованием в глобальной сети - тут засада в большей степени в лицензиях. Производительности в последних версиях платформы хватает, с учетом переиспользования пула http-сеансов.
2. nbeliaev 830 24.01.22 09:13 Сейчас в теме
1. Попробуйте вариант с использованием макетов для i18n
2. ПользователиИнформационнойБазы.ТекущийПользователь().Имя = "UserForLogin" -> Проверить наличие спец. роли было бы надежнее.
3. AntonProgma 47 24.01.22 10:30 Сейчас в теме
Наименее подходящего инструмента для сайта, чем 1С, трудно представить.
salbey; Yashazz; Nubsdale; +3 1 Ответить
4. Nubsdale 24.01.22 12:42 Сейчас в теме
8. axelerleo 340 24.01.22 13:50 Сейчас в теме
(4) В каждой шутке есть доля шутки;)
https://sheety.co/
Nubsdale; +1 Ответить
17. AntonProgma 47 25.01.22 21:10 Сейчас в теме
(4) не 1с, так майкрософт
5. axelerleo 340 24.01.22 13:10 Сейчас в теме
(3) Обоснуете аргументированно?
16. AntonProgma 47 25.01.22 21:07 Сейчас в теме
(5) лицензируемая платная убогость?
22. axelerleo 340 26.01.22 11:32 Сейчас в теме
(16) Все еще не увидел аргументации кроме субъективного про "убогость"
пилить бложек на 1С - согласен, инструмент не подходящий.
пилить интернет-магазин с тесной интеграцией с учетной системой, всякие КИС-ы, BI - почему нет? или веб-морда для учетной системы - "это не сайт, это другое"?
23. AntonProgma 47 26.01.22 12:08 Сейчас в теме
(22) Использование платформы 1с автоматически означает, что на сайт не должно заходить много пользователей (лицензии и медлительность). Это на мой взгляд противоречит самой идее "сайт в интернете". И я не готов считать веб-интефейс программы сайтом.
25. axelerleo 340 26.01.22 13:24 Сейчас в теме
(23) Да, это многократно обсуждалось - для "большого интернета" нужны специфичные подходы - переиспользование сеанса, пробрасывание аутентификации под служебным пользователем, и т.п. и это может иметь последствия с точки зрения лицензирования, да.
Технически любой набор страниц, доступный по доменному имени, можно назвать веб-сайтом. И всякие SPA, web-apps - тоже технически веб-сайты.
https://en.wikipedia.org/wiki/Website

Или по-вашему, корпоративный портал на 20к пользователей - это не сайт? :)
27. AntonProgma 47 26.01.22 14:17 Сейчас в теме
(25) можно опубликовать в 1с http-сервис и назвать это сайтом. Но необходимость использовать "специфичнские подходы" делает 1с наименее подходящей платформой для сайтостроения.
7. o.nikolaev 213 24.01.22 13:47 Сейчас в теме
(3) Так раньше говорили про корпоративный сектор - "трудно представить наименее подходящий инструмент для холдинга чем 1С". Время все раположило в нужных позициях.
18. AntonProgma 47 25.01.22 21:13 Сейчас в теме
(7) может, среди платных корпоративных систем 1с выигрывает относительной дешевизной, но среди бесплатных чем она может привлечь сайтостроителей?
21. Nubsdale 26.01.22 11:00 Сейчас в теме
(18) 1с выступает как БД. тоесть все данные уже есть внутри - товары, цены, остатки. можно конечно вытягивать эти данные из 1с куда-то в другое место, там обрабатывать и обратно обмениваться с 1с, но зачем?
24. AntonProgma 47 26.01.22 12:12 Сейчас в теме
(21) например, любое обращение к базе по http-соединению требует наличие свободной лицензии. Подходит ли это для интернет-магазина? Зашло 100 пользователей, имей на сервере 100 свободных лицензий. Что надо продавать, чтобы такие онлайн-продажи окупились?
26. vl-sher1 43 26.01.22 14:09 Сейчас в теме
(24) коллеги, никто не говорит о написании битрикс-подобной системы на описанной в статье методике. Иногда (с учётом ограничений безопасности, физического доступа, скорости канала, пинга, наличия разработчиков фронта и прочих) проще написать несколько html страниц. А по-хорошему, конечно, нужно писать нормальный фронт, который будет работать через API на http сервисах.
28. axelerleo 340 26.01.22 15:59 Сейчас в теме
(24) Не совсем так. необходимо количество лицензий, соответствующее пиковым значениям одновременно работающих пользователей. http сервисы сами по себе лицензию не занимают, т.е. с технической стороны вылетов не будет. Соединения при повторном обращении переиспользуются.
Видел связки 1С и react, 1С и DRF, 1С и VUE. Работает, и свои задачи закрывает. То, что на стороне 1С реализуется достаточно быстро, средствами чистой веб-разработки будет разрабатываться с нуля и долго. например, онлайн график и остатки отпусков.
Так что все зависит от назначения сайта и его аудитории. Пикабу или ютюб на 1С однозначно не надо пилить))
29. AntonProgma 47 26.01.22 17:19 Сейчас в теме
(28) другими словами - http-сервисы от 1с для создания визуального интерфейса могут применяться в исключительных случаях - когда это непосредственно интерфейс к существующей базе 1с, с которым будет работать небольшой ограниченный круг лиц. И не стоит рассматривать платформу 1с, как средство разработки сайтов.
vl-sher1; +1 Ответить
9. gubanoff 63 24.01.22 16:38 Сейчас в теме
Вот вроде бы и легко, а все равно без глубоких знаний web технологий не сделаешь ((
10. opx 802 24.01.22 16:48 Сейчас в теме
Чуть больше 200 строк html таблицы и СтрЗаменить уйдет думать
11. axelerleo 340 24.01.22 18:06 Сейчас в теме
(10)
Чуть больше 200 строк html таблицы и СтрЗаменить уйдет думать

Ну, особо думать оно на 200 строк таки не уйдет, не такой большой объем текста.
Также, можно использовать СтрШаблон, либо вообще загнать все подстроки в массив и потом сделать СтрСоединить :)
Также, можно то, что гарантированно не будет зависеть от изменяющихся данных в базе, вынести в модуль с повторным использованием
Также, кэширование на стороне веб сервера тоже работает.
Так что в целом, даже СтрЗаменить будет давать приемлемую скорость, если речь не идет о 100к запросов в секунду, конечно.

update: не поленился накидать тест с куском текста на 12к символов. 1000-кратный прогон дает время 0,1145 секунды, или 88% времени.

ТекстЗамены = СтрЗаменить(ТекстЗамены, "tempor", "А я так не думаю"); 1 000 0,114523 88,05
12. opx 802 24.01.22 20:08 Сейчас в теме
(11) Я пробовал различные способы работы со строками в 1с для шаблонизации html и в итоге пришел к выводу, что самый быстрый способ - обход всех символов в цикле по одному.
Тут моя реализация: https://infostart.ru/public/1546655/
silberRus; axelerleo; +2 Ответить
13. Yashazz 4730 25.01.22 19:31 Сейчас в теме
14. opx 802 25.01.22 19:37 Сейчас в теме
(13) Нет. Советуете попробовать?
15. Yashazz 4730 25.01.22 19:39 Сейчас в теме
(14) Чёрт его знает, на самом деле. Если вход и выход - сущности хтмл/хмл/строки, а не 1С, то имеет смысл. А если это коллекции 1С, то их сериализация и десериализация сжирает всю потенциальную выгоду на корню.
19. JohnyDeath 301 26.01.22 10:12 Сейчас в теме
20. JohnyDeath 301 26.01.22 10:14 Сейчас в теме
Оставьте свое сообщение