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

Публикация № 642346

Разработка - Языки и среды - OneScript

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

27
Пример создания вебинтерфейса для 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    

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

27

Специальные предложения

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

См. также

Автоматическое сравнение-объединение баз данных с мини-конфигурацией 2

Статья Программист Компонента, плагин (dll, vbs,..) v8 Windows Бесплатно (free) OneScript

Представляю вашему вниманию скрипт на OneScript для автоматического сравнения-объединения по правилам ("мержевания") конфигураций нескольких баз с мини-конфигурацией.

14.10.2019    501    artkor    2       

АИТП. Подсистема взаимодействия с рабочими серверами OneScript 20

Статья Системный администратор Программист Нет файла v8 Бесплатно (free) OneScript

В статье описан механизм взаимодействия конфигурации АИТП с рабочими серверами OneScript.

22.05.2019    2961    blackhole321    33       

1Script.Web. Интернет-приложения на языке 1С 119

Статья Программист Нет файла v8 Бесплатно (free) WEB OneScript

Запросы рынка таковы, что любое современное клиент-серверное приложение должно иметь веб-интерфейс. Почему бы не писать такие приложения на языке 1С? Андрей Овсянкин расскажет о возможностях разработки веб-приложений на базе 1Script, рассмотрит перспективы этого направления и в качестве демонстрации покажет «боевое» веб-приложение на новом движке – кроссплатформенную консоль администрирования парка кластеров 1С.

20.05.2019    11759    Evil Beaver    32       

Разворачиваем рабочий сервер OneScript для конфигурации АИТП 26

Статья Системный администратор Программист Нет файла v8 Linux Бесплатно (free) OneScript

В статье описана методика развертывания рабочего сервера OneScript для конфигурации АИТП, на ОС CentOS 7.

09.05.2019    3674    blackhole321    0       

Добавляем онлайн-чат в web-приложение OneScript 16

Статья Программист Нет файла v8 Бесплатно (free) OneScript

В статье рассмотрено подключение онлайн-чата к web-приложению на основе http-сервисов OneScript

24.06.2018    5385    blackhole321    1       

Сказ про то, как я DevOps-ом занимался (OneScript, Deployka, Jenkins) 112

Статья Системный администратор Программист Нет файла v8 1cv8.cf ИТ-компания Бесплатно (free) OneScript DevOps Jenkins

Решаем задачу: автоматизировать обновление тестовых баз 1С из хранилища конфигурации при появлении в нём новых изменений. Данная статья родилась в муках хождения по граблям и поиска безопасного форватора среди подводных камней. Изложение постарался представить в виде инструкции для новичка, в которой собрал всё, с чем пришлось столкнуться. Сам я не DevOps-ер, ни на что не претендую, просто делюсь опытом :)

17.06.2018    15001    stas_ganiev    33       

Макеты в http-сервисах OneScript 10

Статья Программист Нет файла v8 Бесплатно (free) OneScript

В статье описана библиотека, реализующая механизм макетов в http-сервисах OneScript, аналогично платформе 1С:Предприятие.

03.06.2018    5852    blackhole321    1       

Перечисления в http-сервисах OneScript 7

Статья Программист Нет файла v8 Бесплатно (free) OneScript

В статье описывается библиотека, реализующая механизм перечислений в http-сервиах OneScript, аналогичный механизму платформы 1С:Предприятие

03.06.2018    5495    blackhole321    13       

Сборка, тестирование, доставка приложения на onescript с помощью gitlab-ci 33

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) OneScript

Сборка, тестирование, доставка приложения на onescript с помощью gitlab-ci на примере портирования на onescript функции daСклонение.

14.05.2018    9527    pallid    3       

TMSSQL - работа с базами данных MS SQL Server в скриптах на OneScript и из командной строки 56

Статья Системный администратор Программист Нет файла v8 Windows Бесплатно (free) OneScript

Представляю вашему вниманию библиотеку TMSQL для работы с базами данных на MS SQL Server. Библиотека подключается в качестве модуля или класса в скрипты, написанные на OneScript, а также может работать как независимое консольное приложение.

26.04.2018    11255    Tavalik    22       

Создаем свою библиотеку для OneScript 147

Статья Системный администратор Программист Нет файла v8 Бесплатно (free) OneScript

Как упаковать свою библиотеку в пакет? Что такое загрузчик и зачем он нужен? Как вообще создать свою библиотеку? Разбираемся на примере.

06.03.2018    16854    nixel    35       

Обзор имеющихся библиотек OneScript 299

Статья Системный администратор Программист Нет файла v8 Бесплатно (free) OneScript

Экосистема OneScript активно развивается. Количество пользователей данного интерпретатора и имеющихся библиотек неуклонно растет, количество решаемых проблем - тоже. Однако остро встает вопрос некоторой разобщенности и размазанности информации по имеющимся библиотекам, их функциональности и проблемам, которые они решают. Данная статья призвана навести порядок в этой теме.

14.11.2017    30865    nixel    85       

OneScript и Ajax. POST-запрос и мои дальнейшие планы с фантазиями о будущем 11

Статья Программист Нет файла v8 Россия Бесплатно (free) OneScript

Моя библиотека для OneScript (версия 3.0 от 09.06.2017 см.GitHab UfaScript) https://github.com/andreosh/UfaScript теперь позволяет посылать POST-запросы на сервер без использования сторонних библиотек типа jquery.

09.06.2017    15818    andreosh    3