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

Программирование - Работа с интерфейсом

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

  Поскольку OneScript является объектно-ориентированным языком программирования (см. статью "Как сделать OneScript объектно-ориентированным" //1c-soft.it-terminal.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    

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

См. также

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