Создание простых сайтов на основе 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

См. также

API-интеграция 1С с маркетплейсами ОЗОН, WildBerries, Я.Маркет, СберМегаМаркет, Стройландия, Леруа Мерлен, Hoff, AliExpress для УТ11, КА2, ERP2, УНФ, БП3, Розница, УТ10, УПП1.3

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

Модуль для интеграции с маркетплейсами ОЗОН, WildBerries, Я.Маркет, СберМегаМаркет, Стройландия, Леруа Мерлен, Hoff, AliExpress. При помощи расширения поддерживаются следующие методы: обмен остатками товаров, обмен ценами, обработка заказов, печать стикеров, загрузка отчетов комиссионеров по API (в том числе Я.Маркет). Подходит для конфигураций Беларуси. Поддержка искусственного интелекта GigaChat

59990 руб.

05.09.2023    7120    87    74    

68

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

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

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

36000 руб.

03.08.2020    15745    10    17    

11

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

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

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

18000 руб.

19.12.2023    1177    6    1    

6

SALE! 15%

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

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

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

12000 10200 руб.

18.03.2019    31271    109    100    

62

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

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

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

5040 руб.

04.05.2021    17548    6    15    

13

SALE! 33%

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

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

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

2400 1608 руб.

29.05.2023    6652    25    37    

15

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

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

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

4200 руб.

07.06.2022    15342    42    56    

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

Или по-вашему, корпоративный портал на 20к пользователей - это не сайт? :)
27. AntonProgma 46 26.01.22 14:17 Сейчас в теме
(25) можно опубликовать в 1с http-сервис и назвать это сайтом. Но необходимость использовать "специфичнские подходы" делает 1с наименее подходящей платформой для сайтостроения.
7. o.nikolaev 211 24.01.22 13:47 Сейчас в теме
(3) Так раньше говорили про корпоративный сектор - "трудно представить наименее подходящий инструмент для холдинга чем 1С". Время все раположило в нужных позициях.
18. AntonProgma 46 25.01.22 21:13 Сейчас в теме
(7) может, среди платных корпоративных систем 1с выигрывает относительной дешевизной, но среди бесплатных чем она может привлечь сайтостроителей?
21. Nubsdale 26.01.22 11:00 Сейчас в теме
(18) 1с выступает как БД. тоесть все данные уже есть внутри - товары, цены, остатки. можно конечно вытягивать эти данные из 1с куда-то в другое место, там обрабатывать и обратно обмениваться с 1с, но зачем?
24. AntonProgma 46 26.01.22 12:12 Сейчас в теме
(21) например, любое обращение к базе по http-соединению требует наличие свободной лицензии. Подходит ли это для интернет-магазина? Зашло 100 пользователей, имей на сервере 100 свободных лицензий. Что надо продавать, чтобы такие онлайн-продажи окупились?
26. vl-sher1 42 26.01.22 14:09 Сейчас в теме
(24) коллеги, никто не говорит о написании битрикс-подобной системы на описанной в статье методике. Иногда (с учётом ограничений безопасности, физического доступа, скорости канала, пинга, наличия разработчиков фронта и прочих) проще написать несколько html страниц. А по-хорошему, конечно, нужно писать нормальный фронт, который будет работать через API на http сервисах.
28. axelerleo 338 26.01.22 15:59 Сейчас в теме
(24) Не совсем так. необходимо количество лицензий, соответствующее пиковым значениям одновременно работающих пользователей. http сервисы сами по себе лицензию не занимают, т.е. с технической стороны вылетов не будет. Соединения при повторном обращении переиспользуются.
Видел связки 1С и react, 1С и DRF, 1С и VUE. Работает, и свои задачи закрывает. То, что на стороне 1С реализуется достаточно быстро, средствами чистой веб-разработки будет разрабатываться с нуля и долго. например, онлайн график и остатки отпусков.
Так что все зависит от назначения сайта и его аудитории. Пикабу или ютюб на 1С однозначно не надо пилить))
29. AntonProgma 46 26.01.22 17:19 Сейчас в теме
(28) другими словами - http-сервисы от 1с для создания визуального интерфейса могут применяться в исключительных случаях - когда это непосредственно интерфейс к существующей базе 1с, с которым будет работать небольшой ограниченный круг лиц. И не стоит рассматривать платформу 1с, как средство разработки сайтов.
vl-sher1; +1 Ответить
9. gubanoff 63 24.01.22 16:38 Сейчас в теме
Вот вроде бы и легко, а все равно без глубоких знаний web технологий не сделаешь ((
10. opx 794 24.01.22 16:48 Сейчас в теме
Чуть больше 200 строк html таблицы и СтрЗаменить уйдет думать
11. axelerleo 338 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 794 24.01.22 20:08 Сейчас в теме
(11) Я пробовал различные способы работы со строками в 1с для шаблонизации html и в итоге пришел к выводу, что самый быстрый способ - обход всех символов в цикле по одному.
Тут моя реализация: https://infostart.ru/public/1546655/
silberRus; axelerleo; +2 Ответить
13. Yashazz 4709 25.01.22 19:31 Сейчас в теме
14. opx 794 25.01.22 19:37 Сейчас в теме
(13) Нет. Советуете попробовать?
15. Yashazz 4709 25.01.22 19:39 Сейчас в теме
(14) Чёрт его знает, на самом деле. Если вход и выход - сущности хтмл/хмл/строки, а не 1С, то имеет смысл. А если это коллекции 1С, то их сериализация и десериализация сжирает всю потенциальную выгоду на корню.
19. JohnyDeath 301 26.01.22 10:12 Сейчас в теме
20. JohnyDeath 301 26.01.22 10:14 Сейчас в теме
Оставьте свое сообщение