Введение
Начиная с версии 1.0.19, в среде OneScript, появился экспериментальный механизм http-сервисов. Он является аналогом механизма http-сервисов в 1С:Предприятие и позволяет взаимодействовать со средой OneScript по протоколу http практически также, как это происходит в среде 1С:Предприятие.
По сути – это классическое приложение (сайт) ASP.NET, с возможностью исполнения кода, написанного на языке 1С, в среде OneScript.
Для чего это может быть использовано
В отличие от технологии (//infostart.ru/public/722160/), которая ориентирована на полноценную веб-разработку, механизм http-сервисов скорее ориентирован на быстрое создание небольших сервисов, которые являются неким промежуточным звеном, между пользователем/внешним сервисом и информационной системой на базе 1С:Предприятие, в тех случаях, когда непосредственное использование средств платформы неудобно или невозможно по каким-либо причинам.
В качестве примера, в настоящей статье рассматривается реализация сервиса сброса пароля пользователя информационной базы, аналогично тому, как это реализовано на сайте Инфостарт. Подобный сервис может быть использован совместно с подсистемой Самообслуживание клиентов, для самостоятельного восстановления доступа внешнего пользователя в информационную базу.
Описание сервиса и логика работы
Итак, нам необходимо реализовать сервис самостоятельного восстановления доступа в информационную базу для внешних пользователей. В качестве образца, используем сервис восстановления доступа, который реализован на сайте Инфостарт. Логику его работы можно описать примерно следующей последовательностью действий:
- Пользователь, забывший пароль переходит по ссылке “Забыли пароль”
- В появившуюся форму ввода, пользователь вводит идентификационные данные (в нашем случае – это имя пользователя ИБ и адрес электронной почты).
- Пользователь нажимает кнопку Создать запрос и идентификационные данные поступают на вход сервиса.
- Сервис проверяет правильность данных (существует ли такой пользователь, активен ли он), а также допустимость создания запроса на сброс пароля (как пример - защита от перебора и создания множества валидных запросов).
- В случае успеха, сервис создает запрос на сброс пароля в информационной базе и сообщает об этом пользователю. Пользователю отправляется сообщение с кодом или ссылкой для подтверждения запроса. В случае, невозможности создания запроса выдается сообщение об ошибке. Запрос должен действительным ограниченный промежуток времени.
- Пользователь переходит на страницу подтверждения, ссылка на которую отправляется пользователю и вводит код подтверждения.
- Пользователь нажимает на кнопку Подтвердить и код подтверждения поступает на вход сервиса.
- Сервис анализирует допустимость кода подтверждения и в случае успеха, сбрасывает пароль соответствующего пользователя. Новый пароль отправляется пользователю по электронной почте или телефону.
Выбор технологии для реализации
В общем случае, данный сервис может быть реализован с использованием следующих технологий:
- Только штатные средства платформы - http-сервисы. Недостатком данного подхода является сложность защиты от DDoS атак и как следствие – возможное снижение производительности работы для внутренних пользователей.
- Использование отличных от 1C технологий, таких, как php, asp.net, OneScript или других, совместно со средствами платформы.
В настоящей статье, мы остановим свой выбор на OneScript, поскольку для человека, программирующего на 1С она имеет наименьший порог вхождения.
Реализация
Поскольку в настоящее время OneScript не поддерживает отладку для web-приложений, а программирование в блокноте и отладка через Сообщить не наш метод J, реализуем сервис с использованием только штатных средств платформы, а затем перенесем его в OneScript.
В аттаче к публикации есть демо-конфигурация, содержащая пример простой реализации такого сервиса средствами платформы, а также web-приложение OneScript и дальнейшее изложение будет основано на этих материалах (к сожалению отсутствует возможность бесплатного аттача файлов, поэтому за стартмани L).
Описание конфигурации и особенности реализации
Для простоты, справочник ВнешниеПользователи содержит имя пользователя информационной базы, а также адрес электронной почты.
Все функции и процедуры, реализация которых одличается для OneScript и 1С (работа с макетами, работа с информационной базой), для простоты вынесены в общий модуль ПлатформозависимыеOneScript.
Для простоты, обновление данных об активных пользователях в локальной бд сервиса реализовано в ручном режиме.
Не реализована отправка сообщений электронной почты. Для подтверждения запроса берем код подтверждения из соответствующего документа.
Для упрощения миграции Имена обработчиков http-сервисов изменены на предопределенное имя
ОбработкаВызоваHTTPСервиса .
Для упрощения миграции корневые url сервисов соответствуют именам файлов os.
Перенос сервиса на OneScript
Документацию по установке и использованию http-сервисов в OneScript можно посмотреть по следующим ссылке: https://github.com/EvilBeaver/oscriptiocontent/blob/master/markdown/docs/http.md
Поскольку в подавляющем большинстве случаев, в качестве клиентской операционной системы у пользователей является ОС Windows, в дальнейшем, будет рассмотрена установка и настройка именно для этой ОС.
Предварительные условия
На компьютере должен быть установлен .NET Framework, версии не ниже 4.5.2
На компьютере должна быть установлен IIS или IIS Express.
На компьютере должна быть установлена платформа 1С:Предприятие, версии не ниже 8.3.5. (Не относится к OneScript, необходимо для работы с демо-базой).
Демонстрационная база и веб-сервисы должны быть опубликованы на IIS с именами chpwddb и chpwd соответственно (Не относится к OneScript, необходимо для работы с демо-базой).
Создание web-приложения OneScript
Поскольку http-сервисы OneScript представляют собой обычный сайт/web-приложение ASP.NET, первым делом необходимо создать web-приложение.
Скачиваем zip архив с сайта http://oscript.io/.
В IIS Manager создаем web-приложение, примерно как описано здесь: https://metanit.com/sharp/mvc/13.2.php (до момента работы с Visual Studio). В процессе В поле псевдоним вводим onescript (может быть любое имя в зависимости от ваших потребностей), в поле Физический путь создаем и выбираем папку приложения (в нашем случае onescript), Выбираем классический пул приложений ASP.NET 4.0 или ASP.NET 4.5. и нажимаем ОК.
В папке приложения (для IIS – это c:\inetpub\wwwroot\onescript, для IIS express что-то вроде C:\Users\<username>\Documents\IISExpress) создаем папку Bin. Копируем в нее все dll из скачанного архива.
В папке приложения создаем файл web.config, примерно следующего содержания:
<configuration>
<system.web>
<httpHandlers>
<add verb="*" path="*.os" type="OneScript.ASPNETHandler.ASPNETHandler, ASPNETHandler"/>
</httpHandlers>
<customErrors mode="Off"/>
</system.web>
<system.webServer>
<handlers>
<add name="OneScript" path="*.os" verb="*" modules="IsapiModule" scriptProcessor="C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" resourceType="File" preCondition="classicMode,runtimeVersionv4.0,bitness64"/>
<add name="OneScript32" path="*.os" verb="*" modules="IsapiModule" scriptProcessor="C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" resourceType="File" preCondition="classicMode,runtimeVersionv4.0,bitness32"/>
</handlers>
</system.webServer>
<appSettings>
<add key="CachingEnabled" value="true"/>
</appSettings>
</configuration>
Наше приложение готово.
Создаем в папке приложения файл hello.os примерно следующего содержания:
// Предопределенная функция. Является точкой входа в обработку запроса.
Функция ОбработкаВызоваHTTPСервиса(Запрос) Экспорт
Ответ = Новый HTTPСервисОтвет(200);
Ответ.УстановитьТелоИзСтроки("Hello World!");
Возврат Ответ;
КонецФункции
Тестируем приложение, набрав в строке браузера http://localhost/onescript.hello.os. Если все настроено верно, будет выведено соответствующее сообщение.
Добавление внешних библиотек
Для хранения данных о пользователях и запросах наше приложение нуждается хранилище данных, по аналогии с информационной базой. Для работы с СУБД, в OneScript есть прекрасная библиотека //infostart.ru/public/672461/, которую мы и будем использовать. В демо-примере используется СУБД SQLite, однако библиотека поддерживает и другие распространенные СУБД.
Для получения бинарных файлов библиотеки я скомпилировал исходные файлы, которые взял с github (https://github.com/ret-Phoenix/oscript-sql). Возможно у автора есть возможность для загрузки бинарных файлов.
Полученные dll копируем в папку Bin нашего приложения и редактируем web.config добавив в секцию <appSettings> нижеследующую зпрись:
<add key="sql" value="attachAssembly" />
Где sql – имя dll без расширения (sql.dll – корневая dll библиотеки), значение attachAssembly – говорит о том, что необходимо загрузить dll при старте приложения.
Таким образом, после старта, из нашего кода будут доступны типы, предоставляемые этой библиотекой без использования директивы #Использовать и мы сможем использовать их в своем коде.
Для нашего примера, в папке приложения создадим подпапку db, которая будет использоваться для хранения локальной базы данных и дадим пользователю IUSR права на запись в эту папку.
Добавление внешних модулей
Еще одной возможностью является загрузка при старте локальных библиотек, которые представляют собой os файлы, имеющие формат общих модулей 1С:Предприятие. Их использование аналогично использованию общих модулей в платформе. Имена общих модулей в коде, соответствуют именам файлов os.
В нашем случае, в папке приложения создадим подпапку modules, где будут располагаться наши “общие модули”. Отредактируем файл web.config, добавив в секцию <appSettings> нижеследующую зпрись:
<add key="commonModulesPath" value="~/modules/" />
Где ~/modules/ - виртуальный путь к папке, где расположены файлы модулей.
При загрузке приложения, будут скомпилированы и загружены все файлы os, находящиеся в этой папке.
В нашем демонстрационном примере, мы перенесем в OneScript четыре общих модуля из конфигурации. Для этого создадим в паке modules четыре файла с именами КонфигурацияOneScript.os, ОбщиеФункции.os, ПлатформозависимыеOneScript.os и СлужебныйOneScript.os.
Поместим содержимое общих модулей из конфигуратора в соответствующие файлы и сохраним их. В файле ПлатформозависимыеOneScript.os Закомментируем код, который предназначен для работы в 1С и разкомментируем код, который предназначен для работы в OneScript.
Включение лога загрузки
Для определения проблем, при загрузке внешних библиотек и модулей можно включить лог загрузки, где будут отображаться все ошибки при загрузке “общих модулей” и внешних dll. Это можно сделать, добавив в web.config в секцию <appSettings> нижеследующую запись:
<add key="LogToPath" value="~/db/"/>
Где ~/db/ - виртуальный путь к папке логов. Пользователь от имени которого выполняется web-приложение должен иметь права на запись в эту папку.
Для нашего примера – это ранее созданная папка папка db.
Ну вт в общем то и все, что касается возможностей, развертывания и настройки http-сервисов OneScript. Осталось проделать несколько операций, специфичных для демонстрационной базы.
Добавление шаблонов веб-страниц
В папке web-приложения создадим подпапку templates. В этой папке создадим два файла СоздатьЗапрос.ospt и подтвердитьЗапрос.ospt в соответствии с именами соответствующих макетов в конфигурации. Перенесем содержимое макетов в соответствующие файлы и отредактируем значения action соответственно на action=createrequest.os и action=confirmrequest.os . Данные файлы содержат html код наших страниц.
Добавление сервисов создания и подтверждения запросов
В папке web-приложения создадим файлы createrequest.os и confirmrequest.os. Перенесем в них содержимое соответствующих http сервисов из конфигуратра и сохраним файлы.
Добавление сервиса обновления данных о пользователях
В папке web-приложения создадим папку services. В продуктивных средах, лучше дать ей сложное название типа строкового представления GUID, для исключения доступа к служебным сервисам извне.
В этой папке создадим файлы updatelogin.os и createdb.os. Поместим в файл updatelogin.os содержимое обработчика соответствующего http-сервиса из конфигурации и сохраним файл. Поместим в файл created.os содержимое соответствующего общего модуля, предварительно раскомментировав его и сохраним файл.
Из браузера выполним создание БД и таблиц, набрав http://localhost/onescript/services/createdb.os. В папке db появится файл local.db.
Заключение
Ну вот собственно и все, наш демонстрационный сервис развернут и готов к работе.
В заключении хочу отметить, что на мой взгляд, механизмы http-сервисов в OneScript могут вполне успешно использоваться для создания небольших сервисов в информационных системах, построеных на платформе 1С:Предприятие, с минимальными усилиями на изучение неизвестных технологий и освоение новых средств разработки.
С более продвинутой методикой использования http-сервисов, позволяющей автоматизировать многие "ручные" операции можно познакомиться в этой статье.