Вебинтерфейс для OneScript и 1С

30.06.17

Разработка - OneScript

Пример создания вебинтерфейса для OneScript с использованием библиотеки UfaScript.osb

  Поскольку OneScript является объектно-ориентированным языком программирования (см. статью "Как сделать OneScript объектно-ориентированным" //infostart.ru/public/611221/ ), то для полноценного языка программирования ему не хватало графического интерфейса. Если раньше я предложил технологию объектно-ориентированного программирования на OneScript, то теперь я предлагаю многопользовательский вебинтерфейс для OneScript. Для использования такого интерфейса вам понадобится вебсервер, например, OpenServer и браузер, например, Chrome. Кроме этого потребуется установленный OneScript и библиотека  UfaScript.osb, которую вы можете скачать на GitHab.
    Приведу исходный текст, в котором мы сформируем экспериментальный интерфейс для вебклиента с кнопкой,
затем отловим нажатие кнопки вебклиентом и передадим клиенту клиенту заданный текст (в данном случае 
"Нажата кнопка+").

Перем U, Joomla, КоличОтветов;

Функция ПослатьКнопкуПривет(Кому)
  Div1=U.СоздатьОбъектCSSDiv("Div1","Пример настройки произвольного шаблона. Это Div1");   Div1.ЦветФона="#EB1434";  Div1.Выравнивание=1;
  Div1.ДекорацияТекста=1; Div1.РазмерШрифта=28;
  Div2=U.СоздатьОбъектCSSDiv("Div2","Это Div2");   Div2.ЦветФона="#D7E61A";  Div2.Выравнивание=1;
  Div2.ДекорацияТекста=1; Div2.РазмерШрифта=18;

  Divheader=U.СоздатьОбъектCSSDiv("header",Div1.СтрокаHTML()+"<br/><br/><br/>В данном элементе Div ""header"" мы задали ЦветФона=""#eefdfd"" "+
     "Divheader.ТипШирина=4  4-Это значит, что ширина = ширине родителя, а ширина родителя = 100% ширины экрана.<br/>"+Div2.СтрокаHTML());  
  Divheader.ЦветФона="#eefdfd";  
  Строкаheader=U.Строка_CSSКод(Div1.СтрокаCSS()+Div2.СтрокаCSS())+Divheader.СтрокаДляAjax();
  
  Кнопки = U.СоздатьОбъектHTMLКнопка("Nav");
  КнНачало = Кнопки.СтрокаДляAjax("Кнопка",5,"","PressButton('Кн1');");
   СтрокаКоманд=U.Строка_СформироватьКомандыКлиенту("baza||New||"+Строкаheader+
                                                  "||baza||Insert||<div id=footer>Это подвал</div>||footer||Insert||"+КнНачало);
   U.МассивОтветовКлиентам_Добавить(Кому,СтрокаКоманд);
КонецФункции

Функция ГенераторОтветовКлиентам();
   Для сч=0 По U.МассивАктивныхКлиентов.Количество()-1 Цикл
      Если U.МассивАктивныхКлиентов[сч][6]=0 Тогда 
	     ПослатьКнопкуПривет(U.МассивАктивныхКлиентов[сч][0]); U.МассивАктивныхКлиентов[сч][6]=1;  
      КонецЕсли;
   КонецЦикла;
   Для сч=0 По U.МассивОтложенныхЗапросовОтКлиентов.Количество()-1 Цикл
      М=СтрРазделить(U.МассивОтложенныхЗапросовОтКлиентов[сч],"==>");
	  Если М[3]="Кн1" Тогда U.МассивОтветовКлиентам_Добавить(М[0],U.Строка_СформироватьКомандыКлиенту("footer||Insert||Нажата кнопка+"));
	    U.МассивОтложенныхЗапросовОтКлиентов.Удалить(сч); КонецЕсли;
   КонецЦикла;
КонецФункции

Функция Обработка()  
  Каталог=СтрЗаменить(U.КаталогВременныхФайлов,"/","\");
  Пока Истина Цикл
    U.ОбработчикЗапросов(Каталог);
	//U.ОтладкаСерверТранслятора();
	ГенераторОтветовКлиентам();
	Приостановить(U.ЗадержкаВOneScript);  
  КонецЦикла;   
КонецФункции

Joomla=Ложь;  
U = ЗагрузитьСценарий("UfaScript.osb");  U.БазовыеУстановкиСистемыUfaScript();
U.КаталогВременныхФайлов="C:/tmp/";
U.СтартСерверТранслятора(Ложь,500,500,1000);
Сообщить("Сервер запущен");
Обработка();

   Теперь дам пояснения тексту.
   Начнем с последних строк. Подключаем библиотеку UfaScript.osb, устанавливаем каталог временных файлов "C:/tmp/".
В каталоге временных файлов будут формироваться файлы обмена запросами между PHP-сервером и OneScript. Рекомендуется установить RAMDisk и размещать данный каталог в оперативной памяти, чтоб повысить скорость обмена.
   Далее мы стартуем PHP-сервер, который является транслятором POST-запросов от вебклиента серверу на OneScript.
В результате будет сформирован файл Server.php с нужным php-кодом, который позволит формировать интерфейс у вебклиента
по технологии Ajax (сторонние библиотеки типа jQuery пока не используются). Так же будет сформирован Index.php с нужными JavaScript функциями для запуска со стороны вебклиента. Веб клиент будет слать регулярные пустые запросы серверу с периодичностью, которую мы можем задать сами. Это необходимо для поддержания связи по инициативе сервера, так как PHP-сервер не может сам инициировать запрос к вебклиенту, а может только направить ему ответ на пришедший запрос.
   PHP-сервер, получая регулярные запросы от каждого веб-клиента, которому PHP-сервер присваивает уникальный код
соединения, сам не обрабатывает данные запросы, а транслирует их обработчику в OneScript. Фактически PHP-сервер
формирует файл с текстом запроса, который размещает во временном каталоге (в нашем случае это "C:/tmp/") и ждет
ответ. Ждать ответ для сервера - это ожидать создание заданного файла с ответом в этом же каталоге. Когда OneScript
сформирует файл ответа, записав его во временный каталог, PHP-сервер перешлет текст ответа клиенту. 
    Функция U.СтартСерверТранслятора(Ложь,500,500,1000); имеет необязательные параметры: Ложь - если мы работем без Joomla, следующий параметр = 500 - это полсекунды задержки в OneScript между проверками, есть ли запросы от PHP-сервера, далее параметр = 500 миллисекунд - это задержка в PHP-сервере при регулярной проверке, готов ли ответ от OneScript, последняя величина задержки = 1000 миллисекунд (1 секунда) - это переодичность фонового запроса от клиента к серверу. Если данные параметры не заданы, то берутся значения по-умолчанию. Чем меньше величина задержки, тем быстрее будет обмен данными, но и так же сильнее будет нагрузка на процессор.
    Функция Обработка() запускает бесконечный цикл с заданной задержкой для OneScript. Внутри этого цикла запускается
функция U.ОбработчикЗапросов(Каталог); которая формирует три основных массива для обработки в OneScript:
U.МассивАктивныхКлиентов - список подключившихся вебклиентов к серверу с их уникальными кодами.
U.МассивОтложенныхЗапросовОтКлиентов - список запросов, которых содержится информация о каких-либо действиях вебклиента, например, клиент нажал на определенную кнопку.
U.МассивОтветовКлиентам - массив, в который мы добавляем информацию для пересылки определенному клиенту. Например, передаем объекты, которые размещаются в интефейсе клиента.
    Для работы с перечисленными массивами мы имеем функцию  ГенераторОтветовКлиентам(); , в которой анализируем список подключившихся клиентов, просматривем сообщения от них и посылаем свои сообщения любому вебклиенту. Данная технология обеспечивает ассинхронность запросов, так как пустые ответы клиенту посылаются сразу, если OneScript еще не 
подготовил ответ. OneScript может запустить фоновые процессы на подготовку ответов клиенту (распараллелить задачи не
только на данном сервере, а переслать их другому компьютеру) и послать ответ в следующих запросах, так как пустые запросы у нас проходят регулярно с указанной периодичностью. В данном примере ответ готовится сразу и асинхронность не показана.
    Только что подключившиеся клиенты имеют в колонке 6 ноль (U.МассивАктивныхКлиентов[сч][6]=0). Им мы шлем "привет" с помощью функции ПослатьКнопкуПривет(Кому);  В ней мы создаем Div объекты, настраиваем CSS-код, создаем кнопку, которая запускает JavaScript-функцию PressButton('Кн1'); на стороне клиента при ее нажатии и все это посылаем с указанием, где что разместить данному клиенту. В итоге у клиента через технологию Ajax появляются надписи на разноцветном фоне и кнопка. 
   При нажатии кнопки вебклиентом функция PressButton('Кн1'); пошлет внеочередной запрос серверу. Запрос будет передан в программу OneScript и появится в массиве U.МассивОтложенныхЗапросовОтКлиентов. При этом, пустой ответ клиент получит даже при необработанном запросе. Таким образом, может быть реализована асинхронность, а результат обработки запроса может быть выслан вебклиенту позже в ответе на один из фоновых запросов. Например, если надо подготовить большой объем данных по запросу из базы данных, то запрос можно переслать другому серверу и когда он будет возвращен, отослать вебклиенту.   
   В нашем же примере ответ мы формируем сразу, как информация о нажатой кнопке появилась в массиве U.МассивОтложенныхЗапросовОтКлиентов.
В 

Если М[3]="Кн1" Тогда U.МассивОтветовКлиентам_Добавить(М[0],U.Строка_СформироватьКомандыКлиенту("footer||Insert||Нажата кнопка+"));


Здесь в М[3] появилась строка переданная вебклиентом JS-функцией PressButton('Кн1');  а в М[0] содержится уникальный код вебклиента, который нажал кнопку. В ответ мы послали данному вебклиенту "footer||Insert||Нажата кнопка+". Это сообщение означает, что строку "Нажата кнопка+" надо добавить (Insert) в Div с id=footer.

  Чтоб все это запустить, установите OpenServer и OneScript, скопируйте файл примера и файл библиотеки в каталог сервера, например, в "C:\OpenServer\domains\test", запустите файл примера "oscript priver.os", затем запустите localhost сайт. Когда появится в браузере кнопка, нажмите.
  Таким образом, с помощью библиотеки UfaScript.osb мы обеспечили двухсторонюю связь между вебклиентом и программой на OneScript. Теперь мы можем обеспечить и обмен сообщениями между разными вебклиентами. В следующих экспериментах я сделаю то же самое из программы 1С.


Ссылка на GitHab: https://github.com/andreosh/UfaScript    

Ссылка на видео по данной теме:  

OneScript 1Script UfaScript.osb Вебинтерфейс

См. также

OneScript Программист Бесплатно (free)

Отгремел Infostart Tech Event 2024, топовое событие в мире 1С-разработки, традиционно проходящее в Санкт-Петербурге. Ваш покорный слуга в этот раз отмечал там 10-летний юбилей проекта OneScript. Отмечание проводилось в форме игры-соревнования по забегу роботов в лабиринте. Участники пытались написать алгоритм движения робота на языке 1С и сделать это быстрее других. О том, как это было – под катом.

28.10.2024    1402    Evil Beaver    11    

24

OneScript Программист Бесплатно (free)

OneScript – это скриптовый движок для автоматизации всего и вся. О том, как OneScript помогает в разработке скриптов на языке 1С, пойдет речь в статье.

10.10.2024    2342    ardn    1    

7

Инструментарий разработчика OneScript Программист Руководитель проекта Бесплатно (free)

Все мы хотя бы раз работали с конструктором запросов. Результатом его работы является синтаксически верный запрос, оформленный по некоторому стандарту. Нравится - не нравится, а привыкаешь быстро, и на запрос, написанный руками, уже не хочется смотреть... А почему бы не попробовать сделать то же самое с исходным кодом 1С? Ну я и попробовал...

23.09.2024    610    0    stopa85    4    

5

Групповая разработка (Git, хранилище) OneScript Программист Платформа 1С v8.3 Бесплатно (free)

Скрипт для работы с SonarQube и локальным репозиторием Git.<br> Цель проекта – возможность выполнить быструю проверку качества кода перед тем, как помещать доработки в рабочее хранилище. В Sonar и Git выгружается не вся конфигурация, а только объекты из заданного списка.<br> https://github.com/vkrivov/go/

02.07.2024    3511    vkrivov@yandex.ru    8    

19

DevOps и автоматизация разработки OneScript Системный администратор Программист Стажер Бесплатно (free)

Рассмотрим создание самоформирующейся документации через комментарии и соглашения: как это сделать и зачем, с описанием полного цикла от исходников конфигурации до странички в интернете

17.06.2024    5214    bayselonarrend    5    

61

OneScript Программист Стажер Бесплатно (free)

Поговорим про меню, спиннеры, прогресс-бары и прочие свистелки для CLI приложений на OneScript

20.05.2024    2906    bayselonarrend    18    

70

Групповая разработка (Git, хранилище) OneScript Системный администратор Программист Бесплатно (free)

Сегодня мы посмотрим на Github Actions - встроенный инструментарий Github для автоматизации рабочих процессов. Разберем, что это такое, зачем и причем тут OneScript.

25.03.2024    2626    bayselonarrend    3    

42

DevOps и автоматизация разработки Групповая разработка (Git, хранилище) OneScript Системный администратор Программист Платформа 1С v8.3 Бесплатно (free)

Продолжение истории с прокси хранилища, но уже не на HTTP, а на TCP и без падений по памяти веб-сервера. Проверяем комментарии хранилища, вызываем веб-хуки, старты пайплайнов, gitsync по событию помещения версии в хранилище. И все это полностью на знакомом и понятном OneScript.

17.01.2024    5429    kamisov    23    

65
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Region102 30.06.17 16:17 Сейчас в теме
Мне кажется все таки, что мухи отдельно, котлеты отдельно. Для своего корпоративного сайта сейчас буду реализовывать следующую схему. Сайт на Laravel (PHP, JS, bootstrap) - база данных MySQL (для согласованности будет реализован механизм плана обмена) - база 1С фоновыми заданиями через REST API сайта обменивается информацией с MySQL.
2. andreosh 103 30.06.17 22:22 Сейчас в теме
(1) Нормальный вариант. Но у меня задача OneScript обеспечить графинтерфейсом, а сделать тоже самое для 1С - это побочная задача. 1С уже имеет интерфейс, но может пригодится возможность дополнять интерфейс, например, в Joomla. Пользователь регистрируется и получает доступ к определенным данным из 1С.
3. li5enok 01.07.17 20:39 Сейчас в теме
Идея годная, нужно развивать. Но форматирование кода ужасно.
4. andreosh 103 02.07.17 10:51 Сейчас в теме
(3) Согласен на счет форматирования, но я работаю в одиночку и мне так удобнее, чтоб видеть максимум кода на экране.
5. stilet 50 06.07.17 20:09 Сейчас в теме
Интересно под Linux будет работать?
6. andreosh 103 11.07.17 07:52 Сейчас в теме
(5) Должно работать под Linux. У меня на ютубе (канал Андрей Ош) показано, как OneScript поставить на Ubuntu. Если раньше меня попробуете, то сообщите.
7. bulpi 217 11.03.18 14:27 Сейчас в теме
Возможно, стоит дописать инструкцию на предмет того, как запустить это под IIS.
Оставьте свое сообщение