Знакомимся с HTTP-сервисами в OneScript








В статье описан механизм HTTP-сервисов в OneScript, а также приведен пример интеграции и совместной работы с 1С:Предприятие

Введение

Начиная с версии 1.0.19, в среде OneScript, появился экспериментальный механизм http-сервисов. Он является аналогом механизма http-сервисов в 1С:Предприятие и позволяет взаимодействовать со средой OneScript по протоколу http практически также, как это происходит в среде 1С:Предприятие.

По сути – это классическое приложение (сайт) ASP.NET, с возможностью исполнения кода, написанного на языке 1С, в среде OneScript.

Для чего это может быть использовано

В отличие от технологии (//infostart.ru/public/722160/), которая ориентирована на полноценную веб-разработку, механизм http-сервисов скорее ориентирован на быстрое создание небольших сервисов, которые являются неким промежуточным звеном, между пользователем/внешним сервисом и информационной системой на базе 1С:Предприятие, в тех случаях, когда непосредственное использование средств платформы неудобно или невозможно по каким-либо причинам.

В качестве примера, в настоящей статье рассматривается реализация сервиса сброса пароля пользователя информационной базы, аналогично тому, как это реализовано на сайте Инфостарт. Подобный сервис может быть использован совместно с подсистемой Самообслуживание клиентов, для самостоятельного восстановления доступа внешнего пользователя в информационную базу.

Описание сервиса и логика работы

Итак, нам необходимо реализовать сервис самостоятельного восстановления доступа в информационную базу для внешних пользователей. В качестве образца, используем сервис восстановления доступа, который реализован на сайте Инфостарт. Логику его работы можно описать примерно следующей последовательностью действий:

  1. Пользователь, забывший пароль переходит по ссылке “Забыли пароль”
  2. В появившуюся форму ввода, пользователь вводит идентификационные данные (в нашем случае – это имя пользователя ИБ и адрес электронной почты).
  3. Пользователь нажимает кнопку Создать запрос и идентификационные данные поступают на вход сервиса.
  4. Сервис проверяет правильность данных (существует ли такой пользователь, активен ли он), а также допустимость создания запроса на сброс пароля (как пример — защита от перебора и создания множества валидных запросов).
  5. В случае успеха, сервис создает запрос на сброс пароля в информационной базе и сообщает об этом пользователю. Пользователю отправляется сообщение с кодом или ссылкой для подтверждения запроса. В случае, невозможности создания запроса выдается сообщение об ошибке. Запрос должен действительным ограниченный промежуток времени.
  6. Пользователь переходит на страницу подтверждения, ссылка на которую отправляется пользователю и вводит код подтверждения.
  7. Пользователь нажимает на кнопку Подтвердить и код подтверждения поступает на вход сервиса.
  8. Сервис анализирует допустимость кода подтверждения и в случае успеха, сбрасывает пароль соответствующего пользователя. Новый пароль отправляется пользователю по электронной почте или телефону.

Выбор технологии для реализации

В общем случае, данный сервис может быть реализован с использованием следующих технологий:

  1. Только штатные средства платформы — http-сервисы. Недостатком данного подхода является сложность защиты от DDoS атак и как следствие – возможное снижение производительности работы для внутренних пользователей.
  2. Использование отличных от 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/ht­tp.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:inetpubwwwrootonescript, для IIS express что-то вроде C:Users<username>DocumentsIISExpress) создаем папку 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:WindowsMicrosoft.NETFramework64v4.0.30319aspnet_isapi.dll" resourceType="File" preCondition="classicMode,runtimeVersionv4.0,bitness64"/>

      <add name="OneScript32" path="*.os" verb="*" modules="IsapiModule" scriptProcessor="C:WindowsMicrosoft.NETFrameworkv4.0.30319aspnet_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-сервисов, позволяющей автоматизировать многие "ручные" операции можно познакомиться в этой статье.

22 Comments

  1. artbear

    (0) Хорошая публикация.

    Спасибо и за реализацию HTTP в OneScript, и за статью!

    Reply
  2. acsent

    Пора уже свою CMS на 1с писать )))

    Reply
  3. nixel

    Как how-to статья хорошая, но на мой взгляд не хватает картинок внутренностей сервисов. Из описания понятно, что есть некая база, в ней есть некие описанные сервисы, некие макеты, (еще и документ какой-то?) но без скачивания и ковыряния в конфе понять что конкретно происходит тяжеловато.

    Возможно стоит добавить некоторое количество gif с демонстрацией работы сервиса и сами скриншоты «кишок» конфигурации.

    Reply
  4. acsent

    (3) так вроде не база 1с, а просто скрипты на OneScript

    Reply
  5. blackhole321

    (4)Там и скрипты и база

    Reply
  6. blackhole321

    (3)Добавил скриншоты с конфигурацией и переносом. Так пойдет?

    Reply
  7. blackhole321

    Обнаружил ошибку в скрипте создания БД.

    Вместо:

    Соединение = Новый Соединение();

    Соединение.ТипСУБД = Соединение.ТипыСУБД.sqlite;

    Соединение.СтрокаСоединения = «Data Source=» + ПолучитьФизическийПутьИзВиртуального(«~/db/localdb.db;») + «PRAGMA journal_mode=WAL;Version=3;»;

    Соединение.Открыть();

    Должно быть:

    СредстваHTTP = Новый СредстваHTTP;

    Соединение = Новый Соединение();

    Соединение.ТипСУБД = Соединение.ТипыСУБД.sqlite;

    Соединение.СтрокаСоединения = «Data Source=» + СредстваHTTP.ПолучитьФизическийПутьИзВиртуального(«~/db/localdb.db») + «;PRAGMA journal_mode=WAL;Version=3;»;

    Соединение.Открыть();

    В архиве поменял. Тем, кто скачал могу перевыслать архив с этим исправлением.

    Reply
  8. vlad3190

    При установке на Windows 7 (IIS Express) x64, выскочила ошибка:

    «Ошибка HTTP 404.2 — Not Found Запрашиваемая страница не может быть отображена из-за применяемых на веб-сервере настроек списка ограничений ISAPI и CGI.»

    После ковыряний и гугления, помогла статья http://winitpro.ru/index.php/2012/05/24/nastraivaem-iis-7-5-dlya-raboty-s-asp-net-4-0/. Как оказалось, отсутсвовали разрешения на выполнение модулей isapi, которые прописаны в web.config. По всей видимости это может быть связано с тем, что .net framework нужной версии, я устанавливал после установки iis express.

    Reply
  9. alex_vert

    Первый раз работает, потом выскакивает сообщение:

    Индекс за пределами диапазона. Индекс должен быть положительным числом, а его размер не должен превышать размер коллекции.

    Имя параметра: index
    Reply
  10. blackhole321

    (9)Какая у Вас ОС?

    Reply
  11. alex_vert

    (10) windows server 2016 standard

    Reply
  12. blackhole321

    (11)А версия OneScript?

    Reply
  13. alex_vert

    (12)последняя с сайта OneScript-1.0.21.zip

    Reply
  14. blackhole321

    (13)Ну тогда наверное что-то сломалось опять.

    Я делал для 19, потом правил баги в 20. Что в 21 — не смотрел.

    Для Вас принципиально 21?

    Reply
  15. alex_vert

    Еще есть ошибка в публикации нужно набирать не http://localhost/onescript.hello.os а http://localhost/onescript/hello.os

    Reply
  16. ktb

    А как подключать библиотеки oscript (#Использовать <имя библиотеки>)? Ругается «Библиотека не найдена» 🙁 Как указать путь к каталогу библиотек? Пробовал разместить в bin файл oscript.cfg, не помогло!

    Reply
  17. user863354

    Добрый день! А веб-форму с полями Пользователь и Электронная почта где создавали? В OneScript?

    Reply
  18. blackhole321

    (17)Формы — это обычные html-страницы (или шаблоны на основе html-страниц). Могут создаваться где угодно, хоть в текстовом редакторе. Отдаются клиенту OneScript’ом.

    Reply
  19. user863354

    У меня стоит задача — создать простую форму с полями: возраст, ежемесячный доход, стаж работы, e-mail. Форма открывается по ссылке, пользователь заполняет форму и нажимает кнопку Отправить, после чего заполненные данные передаются в 1С, где происходит небольшой расчет и отправка отчета, например, о предварительной кредитоспособности физлица, на указанный e-mail. Как посоветуете это сделать?

    Reply
  20. user863354

    (19) и еще вопросик: могу ли я создать нужную мне веб-страницу с использованием Вашей каркасной конфигурации https://infostart.ru/public/841785/?

    Reply
  21. blackhole321

    (20)Можете

    Reply
  22. blackhole321

    (19)

    У меня стоит задача — создать простую форму

    Во внутренней сети предприятия?

    Сколько пользователей?

    Reply

Leave a Comment

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