Веб-форма авторизации/регистрации/восстановления пароля для веб-клиента 1С с помощью HTML/CSS/PHP/HTTP-сервисов 1С

Обмен - Интеграция с WEB

php HTTP-сервисы интеграция веб-клиент авторизация Windows Apache

14
Пришла в голову идея создать универсальную веб-форму входа в веб-клиент 1С на HTML/CSS/PHP/HTTP-сервисы 1С. Чтобы прямо как на нормальных сайтах. Заодно и для ознакомления с 1С с новой, для себя, стороны. Интересно было попробовать интеграцию PHP - 1С.

Началось все с вопроса "А можно ли сделать так чтобы любой желающий мог получить доступ к нашему веб-клиенту, и для этого не нужно было бы всех заводить руками?". А дальше начались поиски решения) Задача стояла весьма увлекательная. Я, как человек мельком знакомый с веб-разработкой, и по основному профилю специализирующийся на разработке в 1С, видел свет в конце туннеля, но короткого пути не знал) Для решения моей задачи я обратился в интернет. Результатом поисков, проб и ошибок, стало такое решение.

Тестировалось все на 
1. 1С 8.3.8 и 1С 8.3.13, но думаю будет работать и на других релизах 8.3

2. PHP 5.6

3. Apache 2.4

Функционал

1. Универсальная форма для входа и регистрации в базе 1С. При логине пользователь не видит стандартного окна аутентификации 1С

2. Регистрация (создание пользователя) в 1С из веб формы. 1С создает пользователя и генерирует ему пароль.

3. Восстановление пароля пользователя 1С из веб-формы

4. При регистрации и восстановлении пароля пользователь получает письма с паролями 

 
 Для тех кому интересны мытарства с разворачиванием веб-сервера и публикацией, смотрим под кат

Архитектура решения такова:

1.Index.php - файл с веб-формой. Версткой, незатейливым дизайном и скриптами визуального отображения.
Весь листинг приводить не буду, он здесь не будет смотреться. Но основная идея для подмены формы логина в веб-клиенте 1С описана по ссылке  и реализуется с помощью простой формы с POST запросом.

<FORM action="http://localhost/BaseName/e1cib/start" method="post">
    Пользователь: <INPUT id="usr" name="usr" /><BR />
    Пароль: <INPUT id="pwd" type="password" value="" name="pwd" />
    <INPUT id="authfailhandling" type="hidden" value="error" name="authfailhandling" /> 
    <P><INPUT type="submit" value="ОК" /> </P>
</FORM>

Нам остается только подставить правильный адрес в атрибут action нашей формы. И готово.

С остальными функциями веб-формы логина все не так просто.

2. backend.php - Файл содержащий обработчики формы для регистрации и восстановления пароля и соединяется с 1С по http-сервису. Основная суть вызова http-сервиса 1С из php сводится к коду

//отправляем запрос с параметрами
$auth = base64_encode("$admin_login:$admin_password"); //Создаем строку авторизации 
		                                               //по типу Basic auth, для авторизации 
                                                       //в веб-сервисе
$context = stream_context_create([
	'http' => [
		'method' => "POST",
		'header' => "Authorization: Basic $auth"
	]
]);

$url = $url."?".http_build_query($query_params, null, '&', PHP_QUERY_RFC3986); //создаем строку url
//С помощью метода http_build_query формируем строку параметров из массива параметров. 	
//Не забываем указать способ кодирования PHP_QUERY_RFC3986, чтобы пробелы в тексте не заменялись плюсами	

$WSanswer = file_get_contents($url, false, $context);

Хочется переделать на CURL для расширенной работы с ответом веб-сервиса, и переделать вызовы на AJAX. Но пока так.

3. Следующим по очереди идет файл config.php в папке assets, в нем указаны конфигурационные данные для подключения к нашему веб-сервису. код прост и незатейлив. Но сильно упрощает подключение.

	//адрес публикации
	$BaseURL="http://localhost/BaseName";
	
	//адрес сервиса
	$WSurl = "$BaseURL/hs/Users";
	
	//адрес авторизации
	$StarterURL = "$BaseURL/e1cib/start";
	
	//логин админа
	$admin_login = "Администратор";
	//пароль админа
	$admin_password = "пароль";

из этого файла выбираются параметры для всех операций

4. и style.css, но это не так интересно. Стили здесь не главное.

Дальше переходим к стороне 1С.

Здесь у нас все довольно прозаично. Конфигурация содержит http-сервис "Пользователи" с двумя шаблонами

/register и /resetPassword

 

Оба шаблона содержат POST-методы и устроены однообразно

Листинг функции регистрации в упрощенном виде выглядит так

Функция Зарегистрироваться(Запрос)
	
	Отказ = Ложь;
	Ответ = Новый HTTPСервисОтвет(200);//Формируем успешный ответ сервиса
	
    //Получаем параметры http-запроса, те которые мы добавляем после знака ? в url
	ИмяПользователя = Запрос.ПараметрыЗапроса.Получить("user_name");
	ПолноеИмя =  Запрос.ПараметрыЗапроса.Получить("full_name");
	Почта = Запрос.ПараметрыЗапроса.Получить("email");
	
	Если ПолноеИмя = Неопределено Или ПустаяСтрока(ПолноеИмя) Тогда
		
		ПолноеИмя = ИмяПользователя;	
		
	КонецЕсли;
	
	Ошибки = Новый Массив;
	
	Если ИмяПользователя = Неопределено ИЛИ ПустаяСтрока(ИмяПользователя) Тогда
		
		Отказ = Истина;
		
		Ошибка = "Имя пользователя не заполнено";
		Ошибки.Добавить(Ошибка);
		
	КонецЕсли;
	
	Если Почта = Неопределено ИЛИ ПустаяСтрока(Почта) Тогда
		
		Отказ = Истина;
		
		Ошибка = "Почта пользователя не заполнена";
		Ошибки.Добавить(Ошибка);
		
	КонецЕсли;
		
	Если Не Отказ Тогда
		
		ДанныеПользователя = ВебПользователиОбщегоНазначенияСервер.ДобавитьПользователя(ИмяПользователя, ПолноеИмя, Почта, Ошибки); //ДанныПользователя "ИмяПользователя, ПолноеИмя, Пароль"
		
		Если ДанныеПользователя <> Неопределено Тогда
		
			ВебПользователиОбщегоНазначенияСервер.ОтправитьУведомление(Почта, "Регистрация", ДанныеПользователя, Ошибки);
		
		КонецЕсли;
		
	КонецЕсли;

	
	Если Не Отказ Тогда
		
        //Устанавливаем данные ответа
		Ответ.УстановитьТелоИзСтроки("Пользователь успешно добавлен");
		
	Иначе
		
        //Устанавливаем данные неуспешного ответа
		Ответ = Новый HTTPСервисОтвет(400);
		
        //Сериализуем наш массив ошибок в JSON
		ЗаписьJSON = Новый ЗаписьJSON;
		ЗаписьJSON.УстановитьСтроку();
		
		ЗаписатьJSON(ЗаписьJSON, Ошибки);
		
		СтрокаОшибок = ЗаписьJSON.Закрыть();
		
		Ответ.УстановитьТелоИзСтроки(СтрокаОшибок);
		
	КонецЕсли;
	
	Возврат Ответ;
	
КонецФункции

Листинг функции восстановления пароля устроен подобным образом

Для тех кто станет это скачивать и пробовать. Нужно сделать следующее 

1. .Заполнить параметры подключения к почтовому серверу в процедуре ПочтовыйПрофиль(), тогда почта начнет отправляться.

2. Кладем файлы веб-формы в папку htdocs сервера если у вас Apache.

3. Заполняем файл config.php в папке assets

Вроде бы все. Ожидаю ваши комментарии, исправления и советы.

14

Скачать файлы

Наименование Файл Версия Размер
Веб-форма и конфигурация для подключения веб-пользователей (1С 8.3)
.rar 14,95Kb
08.11.18
5
.rar 14,95Kb 5 Скачать

См. также

Комментарии
Избранное Подписка Сортировка: Древо
1. oyti 20 08.11.18 12:25 Сейчас в теме
Не совсем понятно, для чего здесь PHP
2. Бэнни 14 08.11.18 12:35 Сейчас в теме
(1)Разверните свою мысль более подробно
3. oyti 20 08.11.18 12:39 Сейчас в теме
(2) клиентскую часть можно целиком реализовать на HTML+JS+CSS. Серверная - HTTP-сервисы. Для чего нужна дополнительная прослойка на PHP?
DrAku1a; ltfriend; andy23; +3 Ответить
4. Бэнни 14 08.11.18 12:44 Сейчас в теме
(3) Во первых, мне так захотелось, just for fun) Это главное) Во вторых, с кроссдоменными запросами в JS у меня всегда было не очень) В третьих, мне не хотелось чтобы код общения с сервером был доступен на клиенте.
mifka186; +1 Ответить
5. СергейКа 657 08.11.18 19:34 Сейчас в теме
Пару лет назад делал проще в двух вариантах:
1. Генерируется HTML форма прямо при запуске конфигурации из веб. Там можно регистрироваться, менять пароль, запрашивать и все что положено. Здесь на форуме был пример с моим участием, да и в инете сейчас найти можно.
2. Подключался внешним источником к базе Wordress. Формы настроены им же. При регистрации пользователя - отправлялось подтверждение на почту уже 1С-кой. При запросе изменения пароля - так же. И так далее. Короче весь фронтэенд - Вордпресс. Бэкэнд - 1С.

Так что вариантов решений - море ))
Бэнни; +1 Ответить
6. Бэнни 14 08.11.18 20:41 Сейчас в теме
(5)а можно ссылку на ваше решение? Очень интересно пишете) или может файликами поделитесь в личку? Готов поучиться)
7. СергейКа 657 09.11.18 08:21 Сейчас в теме
(6) Для первого варианта: https://forum.infostart.ru/forum9/topic160958/
Может быть не все, но достаточно что бы разобраться.
Для второго варианта - давно проект прикрыл, сейчас не в работе. Делал его совместно с awa, но к сожалению в прошлом году судьба распорядилась иначе. Уже более года как прикрыто. Но поищу что у меня в архивах осталось. Быстро не обещаю.
Бэнни; +1 Ответить
8. vasvl123 75 10.11.18 04:06 Сейчас в теме
(6) Реализована безопасная авторизация https://github.com/vasvl123/OneScriptDB
DrAku1a; Бэнни; +2 Ответить
9. Бэнни 14 11.11.18 20:09 Сейчас в теме
(8)Это какой-то форк oscript.web или что-то отдельное?
10. vasvl123 75 11.11.18 21:52 Сейчас в теме
(9) это отдельный проект, на других принципах и более низким порогом вхождения.
DrAku1a; Бэнни; +2 Ответить
11. Unknown31 16.11.18 10:07 Сейчас в теме
Интересна статья, спасибо)
Бэнни; +1 Ответить
12. Бэнни 14 16.11.18 10:49 Сейчас в теме
(11) Пожалуйста, Александр)
Оставьте свое сообщение