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


Пришла в голову идея создать универсальную веб-форму входа в веб-клиент 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

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

15 Comments

  1. oyti

    Не совсем понятно, для чего здесь PHP

    Reply
  2. Бэнни

    (1)Разверните свою мысль более подробно

    Reply
  3. oyti

    (2) клиентскую часть можно целиком реализовать на HTML+JS+CSS. Серверная — HTTP-сервисы. Для чего нужна дополнительная прослойка на PHP?

    Reply
  4. Бэнни

    (3) Во первых, мне так захотелось, just for fun) Это главное) Во вторых, с кроссдоменными запросами в JS у меня всегда было не очень) В третьих, мне не хотелось чтобы код общения с сервером был доступен на клиенте.

    Reply
  5. СергейКа

    Пару лет назад делал проще в двух вариантах:

    1. Генерируется HTML форма прямо при запуске конфигурации из веб. Там можно регистрироваться, менять пароль, запрашивать и все что положено. Здесь на форуме был пример с моим участием, да и в инете сейчас найти можно.

    2. Подключался внешним источником к базе Wordress. Формы настроены им же. При регистрации пользователя — отправлялось подтверждение на почту уже 1С-кой. При запросе изменения пароля — так же. И так далее. Короче весь фронтэенд — Вордпресс. Бэкэнд — 1С.

    Так что вариантов решений — море ))

    Reply
  6. Бэнни

    (5)а можно ссылку на ваше решение? Очень интересно пишете) или может файликами поделитесь в личку? Готов поучиться)

    Reply
  7. СергейКа

    (6) Для первого варианта: https://forum.infostart.ru/forum9/topic160958/

    Может быть не все, но достаточно что бы разобраться.

    Для второго варианта — давно проект прикрыл, сейчас не в работе. Делал его совместно с awa, но к сожалению в прошлом году судьба распорядилась иначе. Уже более года как прикрыто. Но поищу что у меня в архивах осталось. Быстро не обещаю.

    Reply
  8. vasvl123

    (6) Реализована безопасная авторизация https://github.com/vasvl123/OneScriptDB

    Reply
  9. Бэнни

    (8)Это какой-то форк oscript.web или что-то отдельное?

    Reply
  10. vasvl123

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

    Reply
  11. Unknown31

    Интересна статья, спасибо)

    Reply
  12. Бэнни

    (11) Пожалуйста, Александр)

    Reply
  13. anvolkov1cbit

    Архив битый

    Reply
  14. Бэнни

    (13) В чем это выражается? Только что скачал, проверил. Все так как должно быть.

    Reply
  15. anvolkov1cbit

    (14) В этом

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *