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

16.11.18

Интеграция - WEB-интеграция

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

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

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

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

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

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

См. также

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

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

Интеграционный модуль обмена между конфигурацией Альфа Авто 5 и Альфа Авто 6 и порталом AUTOCRM. Данный модуль универсален. Позволяет работать с несколькими обменами AUTOCRM разных брендов в одной информационной базе в ручном и автоматическом режиме. Без существенных изменений типовой конфигурации. Проверено с брендами: Интеграция 1С и GEELY Интеграция 1С и HAVAL Интеграция 1С и KIA Интеграция 1С и FORD Интеграция 1С и LADA ГАРАНТИЯ 100% ВНЕДРЕНИЯ!

36000 руб.

03.08.2020    15728    10    17    

11

Интеграция 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    17541    6    15    

13

Интеграция с сервисом vetmanager

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

Внешняя обработка разрабатывалась для загрузки документов из Ветменеджер в 1С: Бухгалтерия 3.0

12000 руб.

02.02.2021    16351    42    49    

23

[Расширение] БОР-Навигатор.Культура

Зарплата Бюджетный учет WEB-интеграция Обмен с ГосИС Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бюджетный учет Платные (руб)

Расширение конфигурации, включающее в себя объекты, необходимые для подготовки и сдачи отчета "Штатная численность" системы "БОР-Навигатор.Культура" в программе "1С:Зарплата и кадры государственного учреждения", редакция 3.1.

8400 руб.

01.02.2019    25736    9    0    

7

Заполнение по ИНН или наименованию реквизитов контрагента по данным сайта ФНС

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

Обработка является альтернативой механизму, разработанному фирмой 1С и заполняющему реквизиты контрагента по ИНН или наименованию. Не требуется действующей подписки ИТС. Вызывается как внешняя дополнительная обработка, т.е. используется, непосредственно, из карточки контрагента. Заполнение по ИНН или наименованию реквизитов контрагента по данным сайта ФНС (egrul.nalog.ru) для БП 2.0, БП 3.0, БГУ 1.0, БГУ 2.0, УТ 10.3, УТ 11.x, КА 1.1, КА 2.x, УПП 1.x, ERP 2.x, УНФ 1.5, УНФ 1.6, УНФ 3.0, ДО 2.1

2400 руб.

28.04.2016    88571    160    215    

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

Так что вариантов решений - море ))
A_Max; Бэнни; +2 Ответить
6. Бэнни 203 08.11.18 20:41 Сейчас в теме
(5)а можно ссылку на ваше решение? Очень интересно пишете) или может файликами поделитесь в личку? Готов поучиться)
7. СергейКа 669 09.11.18 08:21 Сейчас в теме
(6) Для первого варианта: https://forum.infostart.ru/forum9/topic160958/
Может быть не все, но достаточно что бы разобраться.
Для второго варианта - давно проект прикрыл, сейчас не в работе. Делал его совместно с awa, но к сожалению в прошлом году судьба распорядилась иначе. Уже более года как прикрыто. Но поищу что у меня в архивах осталось. Быстро не обещаю.
Бэнни; +1 Ответить
8. vasvl123 118 10.11.18 04:06 Сейчас в теме
(6) Реализована безопасная авторизация https://github.com/vasvl123/OneScriptDB
DrAku1a; Бэнни; +2 Ответить
9. Бэнни 203 11.11.18 20:09 Сейчас в теме
(8)Это какой-то форк oscript.web или что-то отдельное?
10. vasvl123 118 11.11.18 21:52 Сейчас в теме
(9) это отдельный проект, на других принципах и более низким порогом вхождения.
DrAku1a; Бэнни; +2 Ответить
11. Unknown31 16.11.18 10:07 Сейчас в теме
Интересна статья, спасибо)
Бэнни; +1 Ответить
12. Бэнни 203 16.11.18 10:49 Сейчас в теме
(11) Пожалуйста, Александр)
13. anvolkov1cbit 27 14.01.19 16:19 Сейчас в теме
14. Бэнни 203 17.01.19 15:42 Сейчас в теме
(13) В чем это выражается? Только что скачал, проверил. Все так как должно быть.
15. anvolkov1cbit 27 18.01.19 09:39 Сейчас в теме
(14) В этом
Прикрепленные файлы:
16. Al-77 73 23.03.20 15:57 Сейчас в теме
Архив скачал а он битый. можете прислать?
17. Dex041 19.06.20 00:33 Сейчас в теме
Получается эта форма регистрации откроется только, если обращаться к домену напрямую? Если обратиться к конкретной БД, то форма авторизации будет 1Сная?
18. Бэнни 203 19.06.20 10:11 Сейчас в теме
(17) В текущей реализации - да. Для того чтобы совсем закрыть стандартную форму авторизации нужно настраивать редиректы на сервере
19. andy_zhav 197 19.08.20 10:57 Сейчас в теме
А какие права будут у пользователя? мне кажется без установки прав затея не имеет смысла
20. andy_zhav 197 19.08.20 11:03 Сейчас в теме
Я делал аналогичную задачу. У нас есть http сервис регистрации нового пользователя. Используем post запрос. При этом при создании нового пользователя автоматически назначается группа пользователя с заполненными правами. Все привязано в физлицу. После регистрации пользователь сразу может входить в 1С

// 3. Создаем пользователя ИБ, если его еще нет в базе
Запрос.Текст =
"ВЫБРАТЬ Первые 1
|	Пользователи.Ссылка КАК Ссылка
|ИЗ
|	Справочник.Пользователи КАК Пользователи
|ГДЕ
|	Пользователи.ФизическоеЛицо = &ФизическоеЛицо";
Запрос.УстановитьПараметр("ФизическоеЛицо", ФизЛицо);
Выборка = Запрос.Выполнить().Выбрать();
Если Не Выборка.Следующий() Тогда 
	Пользователь = Справочники.Пользователи.СоздатьЭлемент();
	Пользователь.ФизическоеЛицо = ФизЛицо;
Иначе
	Пользователь = Выборка.Ссылка.ПолучитьОбъект();
КонецЕсли;
Пользователь.Наименование = ФИО;
	ОписаниеПользователяИБ            = Пользователи.НовоеОписаниеПользователяИБ();
ПользовательИБСуществует          = Ложь;
ДоступКИнформационнойБазеРазрешен = Ложь;

// Заполнение начальных значений свойств пользователяИБ.
Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда
	ОписаниеПользователяИБ.ПоказыватьВСпискеВыбора = Ложь;
Иначе
	ОписаниеПользователяИБ.ПоказыватьВСпискеВыбора =
		НЕ Константы.ИспользоватьВнешнихПользователей.Получить();
КонецЕсли;
ОписаниеПользователяИБ.АутентификацияСтандартная = Истина;
ОписаниеПользователяИБ.Роли = Новый Массив;
ОписаниеПользователяИБ.АутентификацияOpenID = Ложь;		
ОписаниеПользователяИБ.АутентификацияСтандартная = Истина;
ОписаниеПользователяИБ.ЗапрещеноИзменятьПароль = Истина;
ОписаниеПользователяИБ.ПоказыватьВСпискеВыбора = Ложь;
ОписаниеПользователяИБ.АутентификацияОС = Ложь;
ОписаниеПользователяИБ.Вставить("Действие", "Записать");
ОписаниеПользователяИБ.Вставить("Имя", Логин);
ОписаниеПользователяИБ.Вставить("Пароль", Пароль);
	Пользователь.ДополнительныеСвойства.Вставить(
		"ОписаниеПользователяИБ", ОписаниеПользователяИБ);
			
Пользователь.Записать();
				
ГруппаДоступаЗаказчик = Справочники.ГруппыДоступа.СоздатьЭлемент();
ГруппаДоступаЗаказчик.Родитель = Справочники.ГруппыДоступа.РодительПерсональныхГруппДоступа();
ГруппаДоступаЗаказчик.Наименование = "Заказчик";
ГруппаДоступаЗаказчик.Профиль = Справочники.ПрофилиГруппДоступа.Заказчик;
ГруппаДоступаЗаказчик.Пользователь = Пользователь.Ссылка;
Строка = ГруппаДоступаЗаказчик.Пользователи.Добавить();
Строка.Пользователь = Пользователь.Ссылка;
ГруппаДоступаЗаказчик.Записать();
Показать
Бэнни; +1 Ответить
21. Бэнни 203 19.08.20 15:12 Сейчас в теме
(20) Да вопрос прав пользователей я в своей публикации не поднимал, группы доступа БСП-шные, и не всем это может быть полезно, больше сконцентрирован на самой механике. В работе у нас сделано примерно то же самое что предлагаете вы)
22. user757393 23.03.21 13:01 Сейчас в теме
Оставьте свое сообщение