Форум OlegON > Программы и оборудование для автоматизации торговли > Системы автоматизации торговли > ФинСофт:КупецЪ

Модуль ФинСофт:КупецЪ (Удаленный доступ). Технология работы в веб броузе без терминального сервера. : ФинСофт:КупецЪ

01.05.2024 14:26


25.09.2023 23:49
FinSoft
 
Когда-то уже упоминал технологию AnyScreen. За последние 2-3 года произошел серьезный прогресс в развитиии, она набирает постепенно популярность в мире клариона. Проведенное недавно тестирование показало стабильность работы, поэтому было принято решение взять ее в арсенал средств для разработки учетных систем. Модуль "ФинСофт КупецЪ (Удаленный доступ)" использует данную технологию для доступа к базе данных и бизнес-логике Купца, будет постепенно наращивать функционал. В этой теме я опишу технологию в целом, как она представляется на данный момент времени.

AnyScreen является набором библиотек и утилит, написанных на кларионе. По своей архитектуре занимает, условно говоря, место между традиционными терминальными и веб серверами. Одна из утилит по сути является веб сервером. При получении запроса на подключение от веб броуза, запускается в специальном режиме экземпляр обычного приложения, написанного и скомпилированного на кларионе. Приложение работает в скрытом режиме, а содержимое его окон транслируется в веб броуз. Внутри приложения можно определить, что оно работает в режиме AnyScreen. В рантайм библиотеке clarion содержится набор функций для поддержки режима. Часть из них задействуются автоматически путем переключения адресов стандартных функций, часть можно использовать самостоятельно в коде приложения. Одно и то же приложение может работать как в обычном режиме, так и в режиме AnyScreen. Обмен с веб броузом происходит в формате xml, битмап, как в обычных терминальных серверах, не передается. Окно в кларионе это структура, содержащая контролы. Их свойства можно читать и устанавливать программно. Когда открывается окно, в веб броуз передаются все установленные свойства, в дальнейшем только изменения. Поэтому трафик получается небольшим. На стороне веб броуза работает приложение на javascript, использующее react library. Из получаемых xml пакетов выполняется прорисовка контролов и последующая работа с ними. Надо еще добавить, что перемещения мышки или набор в полях ввода не передаются на сервер, передача срабатывает на события select/accepted (выбор или подтверждение) контролов. Если по мере ввода информация не требует проверки, то передачу содержимого формы можно сделать при нажатии кнопки подтверждения, как в обычных веб приложениях.
В качестве клиента, кроме веб броуза, может использоваться нативный windows32 клиент. Если нужен доступ, например, к оборудованию на удаленном рабочем месте, то при работе через веб броуз устанавливается утилита AnyService, через которую можно запускать определенные приложения на удаленном компьютере. При работе через windows32 клиента AnyService не требуется.

Если сравнивать с традиционными терминальными серверами, то получается такая картинка.
Требования к серверу и интернет каналу существенно меньше. На сервере не создается терминальный сеанс, а просто запускаются экземпляры приложения. Функционал приложений обычно размещается в dll, сам исполняемый exe файл небольшой. Конечно, экземпляры приложения работают раздельно и используют свой менеджер памяти. Например, мы открываем окно, приложение забирает у операционной системы условно 1мб памяти. Закрываем окно, память операционной системе не возвращается, а используется приложением для своих нужд в дальнейшем. Как только памяти не хватает, то забирается очередная порция памяти. Поэтому, хотя мы и экономим на отсутствии терминального сеанса, по памяти существует ограничение на одном сервере. Веб сервера в этом плане потребляют меньше, так как работают в режиме запросов. Разумеется, все это базовые значения, многое зависит от самого прикладного приложения. По процессору нагрузка не так критична, так как приложения скомпилированы в машинный код.
Есть некоторые конкретные цифры. Один коллега, который перевел на технологию AnyScreen реальное приложение, использует для него виртуальный хостинг у провайдера с достаточно скромной конфигурацией (стоимость в районе 1300 руб в месяц). Создавал для проверки 50 одновременно работающих пользователей, система нагрузку выдержала. Если поднимать на хостинге традиционный терминальный доступ, например, tsplus (который также позволяет работать из веб броуза), то надо арендовать физический сервер, что в несколько раз дороже. В AnyScreen предусмотрена возможность запуска на одном физическом сервере до 200 пользователей. Рекомендуют 150. Разумеется, это зависит от железа, писали, что при достаточно мощном оборудовании тестировали 300 пользователей. Ели нужно больше, то в настройке AnyScreen можно подключать дополнительные сервера, то есть создавать ферму с автоматической балансировкой нагрузки. Разработчики AnyScreen создавали его для нужд своего бизнеса в реальном секторе. По информации от них, крупный клиент использует 600 одновременных подключений к ферме из нескольких серверов.

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

Главные преимущество и смысл использования AnyScreen является сохранение технологии разработки и имеющихся наработок. Бизнес логика может быть использована как есть, косметическим изменениям подвергаются оконные диалоги. То есть, модуль "ФинСофт:Купец (Удаленный доступ)" это отдельное приложение, в которое по мере необходимости копипастится какой-то функционал из основной системы и адаптируется. При этом можно создавать работающие веб приложения с такой же легкостью, как настольные, не погружаясь на уровень вебовских языков. Мы имеем систему разработки со строгой типизацией данных, разделением приложения на области данных и кода, модульностью и областями видимости данных и процедур, дополненные хорошей реализацией ООП. Все это строго контролируется на этапе компиляции, что позволяет автоматически локализовывать ошибки. Добавим сюда расширяемую систему метаданных с многократной автоматической регенерацией простого в понимании кода, возможность взаимодействия объектов метаданных между собой. Тот, кто выживал в больших проектах, понимает, насколько это все важно.

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

Вместе с тем, AnyScreen имеет ряд ограничений, которые надо учитывать при разработке приложений. Это, например, отказ от размещения на тулбаре элементов управления, общих для всех окон, отказ от использования плавающих тулбоксов, некоторые ограниченния использование фоновых процедур, отсутствие поддержки механизма drag/drop. Наверно, что-то со временем доделают, но пользоваться надо тем, что есть сейчас.
Для работы AnyScreen требуется рантайм clarion 11. Проект "ФинСофт:КупецЪ" работает на рантайме clarion 6, одной из причин является поддержка старого оборудования и старых версий операционной системы. Соответсвенно, классический интерфейс Windows NT. Если мы работаем через веб броуз, то такая потребность отпадает, так как на старых компьютерах и ОС современные веб броузы не живут. Поэтому было решено заодно провести редизайн интерфейса, чтобы он выглядел современно (другой шрифт, набор иконок, некоторые контролы с альтернативным функционалом). Поэтому в дальнейшем сборка ФинСофт:Фреймворк останется, как сейчас, для основной разработки на райтайме 6, а сборка фреймворка для рантайма 11 будет постепенно дорабатываться с учетом редизайна и ограничений AnyScreen. Это заключается в подключении дополнительных контрол шаблонов и визардов, а так же d косметической правке входящих в состав фреймворка стандартных диалогов.

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

Дальше приведу несколько скриншотов.

Окно авторизации в PWA (progressive web application) при подключении к серверу.



Окно авторизации в прикладном приложении.



Так выглядит интерфейс в веб броузе (pwa).



В основном проекте "ФинСофт:КупецЪ" мы видим подключение из веб броуза.



Обычные пользователи и те, кто подключился через систему AnyScreen работают совместно. На следующем скриншоте сообщение о блокировке на редактирование записи о складе, открытой в веб броузе.



Так выглядит интерфейс в нативном windows32 клиенте.

25.09.2023 23:54
Капитан О.
 
В технологии AnyScrn, используемой в модуле "ФинСофт КупецЪ (Удаленный доступ)", нет необходимости в использовании терминальных серверов. Эта технология позволяет работать в веб-браузере без каких-либо дополнительных серверов.

В последние 2-3 года эта технология значительно развилась и стала популярной в сфере учетных систем. Проведенное тестирование подтвердило стабильность работы, поэтому было принято решение использовать ее в модуле "ФинСофт КупецЪ (Удаленный доступ)" для доступа к базе данных и бизнес-логике Купца.

Функционал модуля будет постепенно увеличиваться, а в данной теме будет описана технология AnyScrn в целом на данный момент времени. Для выбора или подтверждения контролов ввода информации в форму, можно использовать кнопку подтверждения, как в обычных веб-приложениях. Также в качестве клиента может использоваться нативный wce, без необходимости дополнительной настройки.
14.10.2023 15:59
FinSoft
 
Данная технология в реальной практической ситуации для "ФинСофт:Продмаг". "ФинСофт:Продмаг" это отдельное приложение для территориально удаленных магазинов торговой сети, работающее совместно с основным приложением (ERP) "ФинСофт:КупецЪ" на сервере. При использовании Продмага в сети столовых на территории одного из заводов запросили доступ для местного бухгалтера, чтобы он мог самостоятельно вести список карт оплаты и просматривать результаты продаж. В качестве карт оплаты используются электронные пропуска, которые часто выписываются как временные. Затраты на питание частично компенсирует завод, частично затем удерживает из зарплаты. Чтобы не заморачиваться с безопасностью, решили попробовать технологию Anyscreen.

Ведение списка карт оплаты.



Просмотр журнала продаж.



Выгрузка карт оплаты на кассу.



Загрузка результатов продаж с кассы.



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

Табличный просмотр данных.
Здесь все как в обычных приложениях. Используется постраничная подгрузка из базы данных.

Выбор, добавление, изменение, удаление записей.
Здесь все без изменений, кроме дизайна.

Копирование записей, просмотр записей, обновление просматриваемой информации в таблице, информация об истории изменений.
Кнопки и сопутствующий функционал перенесены в окно.

Поиск в таблице.
Пока в виде контекстного поиска по подстроке во всей таблице (поле ввода и кнопки вперед/назад). Инкрементный локатор, к сожалению, в веб интерфейсе не работает, а локатор в виде поля ввода и контекстный поиск по колонке работают, но включать в данную реализацию пока не стал.

Фильтр.
Работает аналогично обычным настольным приложениям (установка условия после щелчка правой кнопкой мыши по заголовку колонки). Кнопки сохранения/выбора и отключения перенесены в окно. Индикация режима фильтра идентична настольным приложениям.

Печать и экспорт в электронную таблицу.
Аналогично настольным приложениям (кроме прогрессора, используется альтернативный), кнопки перенесены в окно.

Печатные формы автоматически конвертируются в pdf формат и открываются на отдельной закладке веб браузера.

Отчеты в электронной таблице передаются на клиента в виде скачки файла. Открываются из каталога загрузки веб браузера. Это не совсем удобно, но пока так. Возможно, найдется вариант, чтобы файл отчета открывался на стороне клиента автоматически. Для запуска приложений на клиенте и получения информации о клиентском компьютере/ОС используется служба AnyService. Ее пока не задействовали.
15.10.2023 22:39
OlegON
 
А каким образом определяется, что сессия жива? Не получится так, что при переподключении на плохой связи будет гора висящих экземпляров, которые смотрят в никуда? Или, наоборот, не получится ли так, что можно будет подключиться в чужую сессию? Шифруется ли XML? А то посередине можно его очень интересно поменять...
16.10.2023 09:02
FinSoft
 
Это новая экспериментальная технология, мы ее только начали катать. Поэтому практика использования небольшая. Пока видно, что работает достаточно устойчиво.

Переподключения происходят автоматически в течении определенного интервала времени. Если связь потеряна дольше, то на сервере останутся повисшие сеансы, которые затем через какое-то время сервер автоматически закроет. Если приложение выполняет какую-то долгую обработку, то она обрамляется в коде вызовом специальных функций (начало и завершение). В некоторых ситуациях, например, при формировании печатных форм, такое происходит автоматически. Я так понял, чтобы сервер не думал, что сессия отвалилась. В чужую сессию подключиться нельзя, во всяком случае, легально. По моим ощущениям, с подключением и переподключением есть нюансы, это слабое место. Разработчики в роадмапе писали, что в планах совершенствовать. В ходе тестирования возникали разные ситуации, когда приложение использовало конструкции за рамками ограничений технологии, и сеанс подвисал. В рабочее состояние возвращалось некоторыми несложными манипуляциями кнопками переподключения, отключения сеанса или обновления в броузере. На сервере в специальной утилите есть мониторинг сеансов, там их можно сбросить, как в терминальных серверах.

Насчет шифрования xml пакетов не могу сказать. Можно работать как по http, так по и https. Сейчас используем http.
Устойчивость по безопасности обеспечивается за счет самой архитектуры. Работа идет с конкретным приложением, обойти его не получится. Два уровня ввода пароля пока для перестраховки. В ходе обмена в xml пакетах передаются проперти окна/контролов и связанные события. Например, в веб броузере изменили что-то в поле ввода и сработало событие accept, на сервер пойдет пакет с идентификаторами потока, окна, контрола и введенное значение. Это отработается в приложении на сервере, связанные изменения в окне, если они возникли, передадутся обратно в веб броузер.
Теоретически, нанести какой-то вред на сервере можно, если знать, в каком окне приложения что вводится и выполняется. Например, насыпать фейковые записи в базу данных. Но мне кажется все же что это довольно сложно реализовать. Кроме этого, приложение само по себе может ограничивать доступ только к определенной части базы данных на запись и чтение, а последствия такой атаки можно также программно устранить с несравненно меньшими затратами, чем уйдут на взлом. У нас все изменения в базе данных на сервере протоколируются.
17.10.2023 09:58
OlegON
 
Цитата:
FinSoft Сейчас используем http.
настоятельно НЕ рекомендую
Цитата:
FinSoft кажется все же что это довольно сложно реализовать
наоборот, обязательно используйте шифрованный канал...
17.10.2023 17:38
FinSoft
 
Спасибо, обязательно воспользуюсь этой рекомендацией, как представится подходящий момент.
Пока смысла не имеет. Если тема получит развитие, то возможно. Утиля для установки сертификата и инструкция имеются в комплекте.
19.12.2023 11:00
FinSoft
 
Постепенно наращиваем наработки в технологии anyscreen. Открыт проект ФинСофт:КупецЪ Лайт. Это адаптация функционала Купца для работы в вебе. Полностью совместимо с основным проектом, работать можно параллельно в Купце и Купце Лайт. В лайтовой версии будет только базовый функционал. Это должно снизить порог для начинающих пользователей, а если потребуется больше, то всегда можно переключиться на работу в настольной версии. Лайтовая версия по замыслу должна использоваться по saas схеме, то есть сервера под нашим управлением, пользователи подключаются удаленно из веб броузера. В качестве сервера может быть любой компьютер с windows, имеющий выход в интернет. Пользователи, как я написал, всегда могут перейти на работу с настольной системой, используя ее на своих компьютерах и серверах, вся информация в базе данных полностью сохраняется.

В настоящее время адаптированы основные справочники в общем количестве 21 - товары, контрагенты, фирмы, склады, сотрудники, банковские счета и т.д. Справочники это основа, из них происходит выбор значений в документах и параметрах отчетов.
Интерфейс в лайте выглядит так.









04.01.2024 19:38
FinSoft
 
Для проекта ФинСофт:КупецЪ Лайт адаптированы основные документы и отчеты в базовой комплектации.

Документы:
- Приходные накладные
- Расходные накладные
- Чеки
- Акты на списание товаров
- Перемещения товаров между складами
- Приходные кассовые ордера
- Расходные кассовые ордера
- Банковские выписки
- Платежные поручения
- Затраты
- Услуги
- Зачеты с контрагентами (дебет/кредит ноты)
- Зачеты с сотрудниками
- Оплаты через подотчетников
- Доверенности

Отчеты
- Сводная оборотка по товарам
- Карточка товара
- Взаиморасчеты с контрагентами
- Карточка контрагента
- Взаиморасчеты с сотрудниками
- Карточка сотрудника
- Отчет по банку
- Отчет по кассе
- Оборотка по движению денег
- Отчет по символам движения денег
- Отчет по затратам
- Отчет по услугам

Постепенно шлифуем на рабочей базе данных, прежде всего в плане интерфейса. Вот такой вариантик.


Часовой пояс GMT +3, время: 14:26.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.