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

22.01.22

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

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Страница логина
.html 3,77Kb
2
2 Скачать (1 SM) Купить за 1 850 руб.
Конфигурация IIS с правилами URL Rewrite
.config 2,08Kb
2
2 Скачать (1 SM) Купить за 1 850 руб.
Страница логина, настройки IIS и текст модуля HTTP сервиса в одном флаконе
.zip 3,75Kb
8
8 Скачать (2 SM) Купить за 2 150 руб.

Сам процесс многократно описан, разобрать 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С v8.3 1С:Розница 2 Розничная и сетевая торговля (FMCG) Россия Платные (руб)

Готовое интеграционное решение для оплаты покупок Долями в 1C:Розница 2.3. Реализовано в виде расширения. Интеграция сервиса dolyame.ru для приема платежей в рассрочку. Поддерживает работу от разных юридических лиц. Работа: в составе РИБ, отдельно от РИБ, тонкий, толстый клиент, web-клиент (через интернет-браузер).

22440 руб.

19.12.2023    5702    40    11    

37

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

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

36000 руб.

03.08.2020    18158    20    22    

17

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

Интеграция 1С и Битрикс 24. Разработка имеет двухстороннюю синхронизацию 1С и Bitrix24 задачами. Решение позволяет создавать пользователя в 1С из Битрикс24 и наоборот. Данная разработка технически подходит под все основные конфигурации линейки продуктов 1С:Предприятие 8.3 (платформа начиная с 8.3.23): 1С:Управление торговлей, 1С:Управление Нашей фирмой 3, 1С:Комплексная автоматизация 2, Объединенное решение: Модуль 1С:CRM 3 (3.0.21.3) +1С:ERP Управление предприятием 2. При приобретении предоставляется 1 месяц бесплатных обновлений разработки. Доступна демо-версия продукта с подключением Вашего Битрикс24

7200 руб.

04.05.2021    20343    13    19    

18

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

Программа позволяет одним кликом настроить сбор цен ваших конкурентов или дилеров в интернете. Автоматически собирает данные результата поиска Яндекса (вам не придется вручную добавлять каждый сайт, за которым нужно следить). Обновление цен происходит по заданному вами расписанию автоматически. Можете легко отслеживать позиции вашего сайта в Яндексе по ключевым словам и фразам. Этот инструмент даст вам лучшее понимание того, как ваша SEO-стратегия влияет на видимость вашего сайта в поисковой выдаче, и поможет вам улучшить контент и структуру сайта для повышения его позиций. Функция доступна во всех тарифах.

19950 руб.

23.09.2019    31152    8    12    

31

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

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

4200 руб.

07.06.2022    18016    41    56    

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

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