Началось все с вопроса "А можно ли сделать так чтобы любой желающий мог получить доступ к нашему веб-клиенту, и для этого не нужно было бы всех заводить руками?". А дальше начались поиски решения) Задача стояла весьма увлекательная. Я, как человек мельком знакомый с веб-разработкой, и по основному профилю специализирующийся на разработке в 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
Вроде бы все. Ожидаю ваши комментарии, исправления и советы.