Введение
Как было описано в статье ранее, в платформе OneScript появился механизм HTTP-cервисов, который является аналогом HTTP-сервисов в среде 1С:Предприятие и позволяет создавать веб-приложения. К сожалению, в настоящее время возможность отладки приложений, созданных на его основе отсутствует, а написание сколь-нибудь сложного приложения требует отладки и тестирования, была создана настоящая конфигурация, которая по мнению автора, позволит частично решить эту проблему. В далнейшем будет рассмотрено использование разработанной конфигурации на примере создания демонстрационного web-приложения.
Доступна новая версия конфигурации, с которой можно ознакомиться здесь.
Подготовка среды
Системные требования
Компьютер под управлением ОС Windows 7 или более поздней версии.
На компьютере должен быть установлен .NET Framework, версии не ниже 4.5.2.
На компьютере должна быть установлена платформа 1С:Предприятие, версии не ниже 8.3.6.1977.
Установка web-сервера
В качестве web-сервера для разработки будем использовать IIS Express.
Для установки, перейдем в панель управления и выберем пункт “Программы и компоненты”.
Выбираем “Включение или отключение компонентов Windows”
В открывшемся окне находим и выбираем пункт “Службы интернета”, также добавляем компоненты в соответствии с нижеследующим рисунком
Нажимаем ОК и дожидаемся окончания установки.
Установка компонента ARR
Данный компонент осуществляет перенаправления запросов к web-серверу по определенным правилам и необходим для доступа к ресурсам, расположенным на диске при работе web-приложения из среды 1С:Предприятие.
Для установки, переходим по ссылке (https://www.iis.net/downloads/microsoft/application-request-routing) и следуем дальнейшим инструкциям.
После установки данного компонента, в свойствах сайта и приложений появится соответствующий значек
Настройка пула приложений в IIS
В оснастке управления службами IIS, переходим к разделу “Пулы приложений”, нажимаем правой кнопкой мыши и выбираем добавить.
Вводим имя пула (в нашем случае OneScript), выбираем версию среды выполнения не ниже 4.0, классический режим управляемого контейнера и нажимаем ОК.
Для обеспечения возможности работы 1С:Предприятие, корректируем свойства пула DefaultAppPool в соответствии с нижеследующими рисунками:
Настройка среды разработки
В далнейшем для разработки и тестирования мы будем использовать файловый вариант 1С:Предприятие, однако с равным успехом возможно использование и клиент-серверного варианта.
Организация файловой структуры
Примерная организация файловой структуры представлена на рисунке ниже:
В данном случае, папка “IBase” будет использоваться для хранения файлов информационной базы, папка “Импорт” будет использоваться как временная рабочая папка для операций экспорта/импорта данных между 1С:Предприятие и приложением OneScript в процессе разработки, а папка “ФайлыКонфигурации” будет использоваться для выгрузки конфигурайии из 1С:Предприятие.
В случае использования файлового варианта информационной базы, необходимо предоставить права на запись к папке с файлами информационной базы, пользователю IUSR.
Создание информационной базы
Создание информационной базы производится штатным образом. В качестве каталога базы укажем путь к папке “IBase”.
После создания базы, запустим 1С из под администратора, откроем созданную информационную базу и загрузим конфигурацию из файла.
Публикация информационной базы на web-сервере
Публикация осуществляется штатным образом. В нашем случае, окно публикации будет следующим:
Запомним каталог публикации (c:\inetpub\wwwroot\demo1c), так как он понадобится нам в дальнейшем.
Также разрешаем отладку:
Настройка конфигурации
Запустим конфигурацию в пользовательском режиме, перейдем в раздел “Настройки”, выберем Сервис->Настройки. В открывшемся окне
Заполним значение каталога публикации 1С, а также каталогов для импорта и файлов конфигурации.
Создание web-приложения OneScript
Перейдем в раздел “Главное” и выберем пункт “Управление IIS”.
В открывшейся консоли, выделим сайт по умолчанию, нажмем правой кнопкой мыши и выберем “Добавить приложение”.
В открывшемся окне, введем название приложения (osdemo), выберем ранее созданный пул (OneScript), создадим и выберем папку, где будут размещаться файлы приложения (c:\inetpub\wwwroot\osdemo).
Нажимаем ОК.
Переходим в настройки конфигурации и заполняем Каталог приложения, а также вводем его url (он пригодится нам позднее).
Сохраняем внесенные изменения.
Переходим в раздел “Главное” и выбираем “Создать приложение”.
Устанавливаем чекбокс “Создать тестовый скрипт” и нажимаем на кнопку “Создать”.
Наше пустое приложение, содержащее тестовый скрипт создано.
Для проверки работоспособности, открываем браузер и обращаемся к нашему тестовому скрипту
Теперь, наша среда разработки настроена и готова к использованию, однако, прежде, чем приступить к программированию, давайте разберемся, как это работает.
Как это работает
Перейдя в раздел “Главное” и выбрав “Открыть каталог приложения” мы увидим некую файловую структуру, которую создала наша конфигурация.
Основой, для создания web-приложений являются несколько макетов, размещенных в конфигурации:
web_config – текстовый документ, содержащий конфигурацию приложения для ОС Windows. Его содержимое копируется в файл web.config.
ПлатформаOneScript – содержит zip-архив с файлами платформы OneScript. Разархивируется в папку Bin.
web_config_linux – текстовый документ, содержащий конфигурацию приложения для ОС Linux. Его содержимое копируется в файл web.config.linux. При размещении на ОС Linux, данный файл должен быть переименован в web.config.
test_os – текстовый документ, содержащий код тестового скрипта. Из его содержимого формируется файл test.os
БиблиотекиOneScript – содержит zip-архив c файлами дополнительных библиотек, которые может использовать приложение и не относящихся к платформе. Архив разархивируется в папку Bin. В данной конфигурации не содержит данных.
ПрочиеФайлы - любые файлы и папки, за исключения файлов *.os, web.config, web.config.linux в корне, а также папок Bin, CommonModules, которые могут использоваться приложением. В данной конфигурации не содержит данных.
Таким образом, создание web-приложения OneScript происходит путем создания в каталоге приложений определенных файлов и папок на основе данных, имеющихся в конфигурации.
Создаем первое приложение
Создание подсистемы приложения
Для отделения объектов конфигурации, которые относятся к приложению OneScript, создадим подсистему “ДемоПриложение”, куда будем помещать все объекты, которые составляют приложение OneScript.
Создание HTTP-сервиса
В конфигураторе, создадим HTTP-сервис с именем test и корневым url – test.os.
Добавим его в подсистему “ДемоПриложение”.
Для созданного сервиса, добавим шаблон URL и метод GET. Получится примерно следующий результат:
Переименуем метод и пометим его как экспортный.
Отредактируем наш обработчик, примерно следующим образом:
Функция ОбработкаВызоваHTTPСервиса(Запрос) Экспорт
Ответ = Новый HTTPСервисОтвет(200);
Ответ.УстановитьТелоИзСтроки("Текущее время: " + Строка(ТекущаяДата()));
Возврат Ответ;
КонецФункции
Обновим конфигурацию и публикацию на веб-сервере.
Обратившись к серверу из браузера, получим примерно следующее:
Портирование приложения на OneScript
Выгружаем конфигурацию (меню “Конфигурация” -> Выгрузить конфигурацию в файлы). Выбираем папку для выгрузки (ту, что мы указали в настройках ранее), а также линейный формат.
Нажимаем выполнить и дожидаемся завершения выгрузки. Содержимое папки будет иметь примерно следующий вид:
Запустим нашу конфигурацию в режиме предприятия. В разделе “Главное” выберем “Обновить приложение”.
Чекбокс “Обновить приложение” - Если выбран, то папка приложения OneScript будет полностью очищена и приложение будет создано заново как если бы это было новое приложение.
Каталог файлов конфигурации - указывает на путь, куда мы ранее выгрузили нашу конфигурацию. Значение берется из настроек, однако Вы можете его переопределить.
Каталог приложения – указывает на папку web-приложения OneScript. Значение берется из настроек, однако также может быть переопределено.
Ниже находится список подсистем, доступных для обновления.
Поскольку наш сервис находится в подсистеме ДемоПриложение, выберем ее и нажмем обновить.
После подтверждения наших действий, web-приложение будет обновлено.
Откроем каталог приложения и просмотрим содержимое файла test.os
Оно будет идентично тексту модуля в конфигурации.
Протестируем приложение, обратившись к нему из браузера.
Таким образом, мы создали простейшее web-приложение OneScript в среде 1С:Предприятие и портировали его на платформу OneScript.
Как правило, набор подсистем, объекты которых мы будем экспортировать в OneScript известен, мы можем добавить эти подсистемы, как экспортируемые в настройках. В этом случае, они будут автоматически помечаться для обновления, при обновлении приложения. Это можно сделать, выбрав в разделе "Настройки" пункт “Список систем для обновления”.
Расширяем приложение
В качестве примера, добавим фунукионал приложения TestWebApp, которое находится в исходных файлах OneScript, расположенных на github (https://github.com/EvilBeaver/OneScript/tree/develop/src/TestWebApp).
Суть приложения проста, оно выводит тестовую страницу с ip адресом клиента и при нажатии на изображение, формируется POST запрос, результатом которого является страница с исходным кодом приложения. Файлы Default.ospt и source.ospt являются html-шаблонами, на основе которых формируется вывод. Вспомогательные java-скрипты, изображения, стили расположены в соответствующих папках (scripts, images и styles).
Файловая структура приложения изображена на рисунке ниже:
Содержимое Default.os:
// Это предопределенная функция - обработчик запроса HTTP-сервиса
//
Функция ОбработкаВызоваHTTPСервиса(Запрос) Экспорт
Если Запрос.HTTPМетод = "GET" Тогда
Возврат ПоказатьГлавнуюСтраницу(Запрос);
Иначе
Возврат ПоказатьИсходныйКод(Запрос);
КонецЕсли;
КонецФункции
Функция ПоказатьГлавнуюСтраницу(Запрос)
Контекст = Запрос.Контекст;
ИмяФайлаШаблона = СтрЗаменить(Контекст.ФизическийПуть, "Default.os", "Default.ospt");
СтрокаШаблон = ПолучитьМакетСтраницы(ИмяФайлаШаблона);
СтрокаТело = СтрЗаменить(СтрокаШаблон, "{ClientAddress}", Контекст.АдресКлиента);
Ответ = Новый HTTPСервисОтвет(200);
Ответ.УстановитьТелоИзСтроки(СтрокаТело);
Возврат Ответ;
КонецФункции
Функция ПоказатьИсходныйКод(Запрос)
Контекст = Запрос.Контекст;
СтрокаИсходныйКод = ПолучитьМакетСтраницы(Контекст.ФизическийПуть);
ИмяФайлаШаблона = СтрЗаменить(Контекст.ФизическийПуть, "Default.os", "Source.ospt");
СтрокаШаблон = ПолучитьМакетСтраницы(ИмяФайлаШаблона);
СтрокаТело = СтрЗаменить(СтрокаШаблон, "{SourceCode}", СтрокаИсходныйКод);
Ответ = Новый HTTPСервисОтвет(200);
Ответ.УстановитьТелоИзСтроки(СтрокаТело);
Возврат Ответ;
КонецФункции
Функция ПолучитьМакетСтраницы(ПутьКФайлу)
Документ = Новый ТекстовыйДокумент;
Документ.Прочитать(ПутьКФайлу);
Возврат Документ.ПолучитьТекст();
КонецФункции
Содержимое Default.ospt:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>OneScript HTTP Service Test Page</title>
</head>
<body>
<div>
<p align="center" style="font-size:68px;">Привет ({ClientAddress})!</p>
<p align="center">Эта страница создана HTTP сервисом OneScript.</p>
</div>
<div>
<center>
<form action="Default.os" method="POST">
<input type="hidden" name="what you want" value="what you want">
<input type="image" src="/images/viewsrc.jpg" />
</form>
</center>
</div>
</body>
</html>
Содержимое source.ospt:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>OneScript HTTP Service Test Page</title>
<link rel="stylesheet" href="/styles/github.css">
<script src="/scripts/highlight.pack.js"></script>
<script>hljs.initHighlightingOnLoad();</script>
</head>
<body>
<center>
<a href="Default.os">
<img src="/images/home.png" alt="Go to W3Schools!" height=64 width=64 border="0">
</a>
</center>
<pre><code class="1c" style="border: 1px solid #C1C1C1;">
{SourceCode}
</code></pre>
</body>
</html>
Создание кода HTTP-сервиса
Добавим общий модуль, с именем ОбщиеДемо, пометив его как серверный и добавив в нашу подсистему.
Скопируем из файла Default.os код функции ПолучитьМакетСтраницы, вставим в тело модуля и пометим, как экспортную.
Поскольку исходное приложение содержит один скрипт (Default.os), в конфигураторе создадим web-сервис с таким же именем и поместим его в подсистему “ДемоПриложение”, аналогично тому, как мы делали это ранее.
В результате, должно получиться нечто следующее:
Модифицируем код модуля таким образом, чтобы получилось следующее:
// Default.os
//
Функция ОбработкаВызоваHTTPСервиса(Запрос) Экспорт
Если Запрос.HTTPМетод = "GET" Тогда
Возврат ПоказатьГлавнуюСтраницу(Запрос);
Иначе
Возврат ПоказатьИсходныйКод(Запрос);
КонецЕсли;
КонецФункции
Функция ПоказатьГлавнуюСтраницу(Запрос)
//<OneScript>
//Контекст = Запрос.Контекст;
//ИмяФайлаШаблона = СтрЗаменить(Контекст.ФизическийПуть, "Default.os", "Default.ospt");
//АдресКлиента = Контекст.АдресКлиента;
//<!OneScript>
//<1C>
ИмяФайлаШаблона = Константы.КаталогПриложения.Получить() + "\Default.ospt";
АдресКлиента = "НеПоддерживается";
//<!1C>
СтрокаШаблон = ОбщиеДемо.ПолучитьМакетСтраницы(ИмяФайлаШаблона);
СтрокаТело = СтрЗаменить(СтрокаШаблон, "{ClientAddress}", АдресКлиента);
Ответ = Новый HTTPСервисОтвет(200);
Ответ.УстановитьТелоИзСтроки(СтрокаТело);
Возврат Ответ;
КонецФункции
Функция ПоказатьИсходныйКод(Запрос)
//<OneScript>
//Контекст = Запрос.Контекст;
//ИмяФайлаШаблона = СтрЗаменить(Контекст.ФизическийПуть, "Default.os", "source.ospt");
//СтрокаИсходныйКод = ОбщиеДемо.ПолучитьМакетСтраницы(Контекст.ФизическийПуть);
//<!OneScript>
//<1C>
ИмяФайлаШаблона = Константы.КаталогПриложения.Получить() + "\source.ospt";
ПутьКФайлуИсходногоКода = Константы.КаталогПриложения.Получить() + "\Default.os";
СтрокаИсходныйКод = ОбщиеДемо.ПолучитьМакетСтраницы(ПутьКФайлуИсходногоКода);
//<!1C>
СтрокаШаблон = ОбщиеДемо.ПолучитьМакетСтраницы(ИмяФайлаШаблона);
СтрокаТело = СтрЗаменить(СтрокаШаблон, "{SourceCode}", СтрокаИсходныйКод);
Ответ = Новый HTTPСервисОтвет(200);
Ответ.УстановитьТелоИзСтроки(СтрокаТело);
Возврат Ответ;
КонецФункции
Доступность объектов
Как вы знаете, в 1С:Предприятие существует понятие доступности. Не секрет, что некоторые объекты, которые доступны на сервере или в мобильном приложении могут быть недоступными на клиенте и наоборот. Аналогичная ситуация складывается и между платформами OneScript и 1С:Предприятие, каждая из которых содержит объекты, которые уникальны и не поддерживаются другой платформой. Другими словами, часть объектов OneScript отсутствует в 1С:Предприятие и наоборот. В среде 1С:Предприятие, вопросы доступности решаются при помощи конструкций вида:
#Если МобильноеПриложениеКлиент Тогда
// какой то специфичный код
#КонецЕсли
Для решения аналогичной проблемы между платформами OneScript и 1С:Предприятие используется следующий подход:
Область кода, специфичная для определенной платформы обрамляется соответствующими тегами:
//<1C>
// Код, который доступен только из 1С:Предприятие
//<!1C>
//<OneScript>
// Код, который доступен только из OneScript
//<!OneScript>
Соответственно весь код, между открывающим и закрывающим тегами должен быть закомментирован в соответствии с тем, на какой платформе ведется разработка. Если мы разрабатываем в среде 1С:Предприятие, должен быть закомментирован код между тегами //<OneScript> и //<!OneScript>. Если мы разрабатываем в среде OneScript – закомментированным должен быть код межлу тегами //<1C> и //<!1C>.
Пример использования тегов приведен в тексте модуля web-сервиса выше.
Для иллюстрации этого механизма, обновим конфигурацию ИБ, выгрузим ИБ в файлы и обновим приложение аналогично тому, как описано ранее.
В папке общих модулей (CommonModules) появился файл общего модуля, созданного нами ранее.
Также в папке приложения появился файл Default.os, содержимое которого соответствует содержимому модуля HTTP-сервиса в конфигурации, за исключением того, что при выгрузке был закомментирован код, специфичный для 1С:Предприятие и разкомментирован код, специфичный для OneScript.
Иногда возникает потребность в переносе файлов, созданных или отредактированных в OneScript, в 1С. Для этого, в разделе “Импорт”, выберем пункт “Файл OneScript”. Далее выбираем файл, отредактированный в OneScript и нажимаем ОК. В нашем случае – это файл Default.os. Как можно увидеть, произошло обратное преобразование. Код, специфичный для 1С был раскомментирован, а код, специфичный для OneScript был закомментирован.
Добавление ресурсов
Как можно увидеть, наше приложение использует для работы различные ресурсы, такие как файлы изображений, html-шаблоны, скрипты и файлы стилей, которые размещены в соответствующих папках на диске. Исходная файловая структура приложения представлена на рисунке ниже:
Удалим файлы web.config и Default.os т.к. они нам не нужны.
Оставшиеся файлы не являются библиотеками или платформой, соответственно относятся к классу прочих файлов. Поместить их в конфигурацию можно несколькими способами. Первый способ состоит в создании zip-архива с этими файлами
с импортом архива в макет ПрочиеФайлы.
Иногда, получается так, что файлы копируются в паку приложения OneScript, дорабатываются, а затем необходимо сформировать архив и вставить его в макет. Для иллюстрации этого, скопируем все файлы, ресурсов, относящиеся к приложению TestWebApp в папку нашего приложения OneScript.
Результирующая файловая структура представлена на рисунке ниже.
Модифицируем ссылки на ресурсы в файлах Default.ospt и source.ospt
Для создания файла архива, перейдем в раздел “Импорт”, нашей конфигурации и выберем пункт “Прочие файлы”.
Каталог приложения – каталог из которого будут импортироваться файлы. По умолчанию имеет значение из настроек, может быть переопределен.
Каталог импорта – каталог, куда будет помещен файл архива. Может быть переопределен.
Нажимаем кнопку импортировать и дожидаемся окончания операции.
Открываем каталог импорта и архив. Как можно увидеть, там содержатся файлы и папки, котроые мы создали ранее, и которые не относятся к платформе, библиотекам, *.os или конфигурационным файлам.
Импортируем архив в макет ПрочиеФайлы и обновляем конфигурацию.
Аналогичным образом создаются архивы библиотек. Однако в этом случае необходимо добавление соответствующих ключей в макет web_config, web_config_linux и в сам файл web.config в папке web-приложения.
Настройка переопределения URL
Обратимся из браузера к HTTP-сервису 1C:Предприятие. Результат представлен на рисунке ниже:
Как видим, изображение, которое находится в подпапке images не подгрузилось. Также, при нажатии на это изображение мы не переходим на страницу с исходным кодом.
Для решения второй проблемы воспользуемся отладчиком и обнаружим, что в обработчике POST запроса мы указали неверное имя шаблона.
Поправляем ошибку, обновляеми выгружаем конфигурацию, обновляем приложение. Тестируем приложение из браузера. На сей раз, переход на страницу с исходным кодом произошел, однако по прежнему мы имеем проблемы с загрузкой стилей, скриптов и изображений. Это неудивительно, учитывая тот факт, что ссылки в шаблонах имеют относительные адреса, а папки со скриптами и изображениями находятся по относительному url, отличному от http://localhost/demo1c/hs/.
В решении этой проблемы нам помогут правила перенаправления URL.
В консоли администрирования IIS перейдем к публикации HTTP-сервиса 1С (demo1c), а затем в правила перенаправления URL.
Добавим новое правило
Указываем имя сервера, на который будет перенаправляться запрос (в нашем случае это тот же самый localhost).
Выделяем правило и нажимаем “Изменить”.
В качестве шаблона выбираем “Подстановочные знаки”, Вводим шаблон для изображений *images/* и нажимаем “Проверить шаблон”
В окне проверки вводим тестовый url и нажимаем “Проверить”.
Обращаем внимание, что имени файла изображения соответствует параметр {R:2}.
Удаляем запись из условий (должно стать как на рисунке ниже).
Вводим адрес, куда будет перенаправляться запрос (в нашем случае – это публикация приложения OneScript), для отладки, отмечаем Регистрировать переопределенный url, убираем чекбокс “Остановить обработку других правил”.
Сохраняем правило.
Аналогичным образом создаем правила для папок scripts и styles.
Тестируем приложение из браузера
Как мы можем увидеть, теперь все отображается корректно и все работает как и задумано.
Для импорта созданных правил, в разделе “Импорт”, выбираем “Переопределение URL” и нажимаем “Импортировать”.
Выделяем все содержимое результата и помещаем в макет Переопределение Url.
Обновляем конфигурацию.
Обновим публикацию HTTP-сервиса 1С на веб-сервере, а затем зайдем в правила переопределения URL в публикации 1С.
Как мы можем увидеть, правила, созданные нами ранее исчезли после публикации 1С на web-сервере. Соответственно, после обновления кэша мы опять будем иметь проблемы с доступом к изображениям, скриптам etc.
Для восстановления правил, в режиме предприятия, в разделе “Главное”, выберем пункт “Установить перенаправление URL” и нажмем “Сформировать”.
Просмотрим исходный файл web.config во вкладке Исходный текст, а также измененный вариант с учетом сохраненных нами ранее правил, в папке Результат.
Нажимаем кнопку “Применить изменения”.
Переходим к списку правил перенаправления URL и обновляем содержимое. Как можно увидеть, правила вновь появились.
Тест приложения
Обновляем и выгружаем конфигурацию, затем обновляем приложение.
Проверяем работоспособность приложения на платформе OneScript из браузера.
Ну вот мы и создали web-приложение OneScript из среды 1С:Предприятие.
Распространение приложения
Распространение zip-архивом
Данный тип распространения используется, если Вы хотите перенести Ваше приложение в продуктивную среду.
Для создания архива, выберите пункт “Архивировать приложение” в разделе “Главное”.
Нажмите “Архивировать” и дождитесь завершения операции.
Откройте папку импорта, в ней будет находиться файл application.zip
Внутри он будет содержать все файлы и папки нашего web-приложения.
Теперь его можно передать и развернуть в продуктивной среде.
Распространение конфигурацией
Поскольку наша измененная конфигурация содержит всю необходимую информацию о приложении, вы можете распространять приложение просто выгрузив .cf файл и передать его другим программистам для доработки.
Поправим свойства конфигурации и выгрузим ее в .cf файл.
Развертывание приложения, осуществляется выбором пункта “Обновить приложение”, с установленным чекбоксом “Обновить приложение”, после предварительной настройки среды разработки.
Заключение
Наконец-то я дописал эту статью и да, такого количества скриншотов я еще не делал J. Надеюсь, что эта публикация поможет вам создавать большие web-приложения на платформе OneScript, используя возможности конфигуратора 1С:Предприятие.