В последнее время большое количество крупных мировых поставщиков бизнес-приложений ушли с российского рынка. Например, SAP, Microsoft и Oracle. Однако, много их решений все еще используются в российских компаниях. За время их работы накопилась значительная экспертиза по их доработке и поддержке как внутри компаний, так и в ИТ-интеграторах. Можно продолжать использовать их еще определенное время, но никто не защищен от внезапных проблем, которые, например, случились с Meraki.
К сожалению, основная проблема в том, что для многих узкоспециализированных решений от крупных мировых поставщиков не существует готовых российских аналогов. И одним из немногих выходов в таком случае является создание нового решения “с нуля”. Однако, разработка с использованием классических языков программирования занимает много времени и человеческих ресурсов, что в условиях значительного оттока ИТ-специалистов в РФ является существенной проблемой.
Одним из решений этих проблем является использование платформ для быстрой разработки приложений (RAD). В этой статье сделан краткий обзор современной открытой и бесплатной платформы lsFusion, которая очень хорошо подходит для решения вышеописанных задач. При этом платформа может быть запущена с использованием исключительно программ из Единого реестра российского ПО (Astra Linux, Liberica JDK, Postgres Pro). При этом лицензия платформы позволяет создавать собственные решения на ее основе и вносить их в реестр.
Область применения
Платформа lsFusion предназначена для быстрой разработки бизнес-приложений. Распространяется под лицензией LGPL v3. Исходный код платформы доступен на Github.
Лучше всего lsFusion подходит для создания сложных систем с большим количеством разнообразных сущностей и форм, в которых требуется ввод и обработка значительных массивов данных. Однако, также платформа может быть использована и для быстрого создания простых приложений вместо Excel-таблиц, функциональности которых уже недостаточно.
В то же время использование платформы не даст большого преимущества при разработке приложений, направленных на взаимодействие с большим количеством “внешних” пользователей или без необходимости каких-либо сложных вычислений. Также следует учитывать, что в качестве веб-интерфейса используется одностраничное приложение с использованием JavaScript. Поэтому платформа lsFusion не очень хорошо подходит для создания, например, веб-сайтов.
Аналоги
На данный момент на рынке существует несколько платформ для решения похожих задач. На примере решений от Microsoft, из давно используемых можно выделить Access и Visual Foxpro. Более современными аналогами являются low-code платформы вроде Power Apps. Однако помимо того, что они все являются проприетарными системами, подходы к разработке приложений, используемые в них, сильно отличаются от тех, что заложены в платформу lsFusion. В частности, в ней практически не используется визуальное программирование, а вся логика задается при помощи высокоуровневого языка.
Парадигма
Большинство современных платформ используют стандартную реляционную логику, в который структура приложения задается при помощи сущностей и связей между ними. В lsFusion вместо сущностей используются классы, которые могут наследоваться один от одного. Поля и связи же задаются при помощи так называемых свойств. Свойства по сути являются функциями, которые принимают в качестве параметров объекты классов, возвращая при этом либо значения примитивного типа (поля), либо другие объекты (связи). Поле в таблице с несколькими ключами из реляционной логики будет представлено в виде свойства с соответствующими объектами в качестве параметров.
Все свойства делятся на две категории :
Первичные. Вводятся в систему непосредственно пользователем, и напрямую не зависят ни от каких других свойств.
Вычисляемые. Рассчитываются при помощи определенных операторов на основе других свойств.
Похожая схема используется в электронных таблицах. Первичным свойствам соответствуют ячейки, в которых хранятся значения. Ячейки, в которых находятся формулы, являются аналогом вычисляемых свойств.
Пользовательский интерфейс создается при помощи форм, на которые добавляются объекты и свойства, связь между которыми задается при помощи выражений.
При помощи механизма событий можно выполнять определенные действия при наступлении заданных условий.
Таким образом, при использовании платформы lsFusion большинство логики задается не в виде последовательности выполнения команд, а в виде спецификации решения задачи. То есть описывается ожидаемый результат, а не способ его получения. Подобный подход называется декларативным, и обладает рядом преимуществ по сравнению с классическим императивным.
Язык
Поскольку парадигма платформы значительно отличается от существующих подходов, для задания логики был создан специализированный язык. Для снижения порога входа в разработку был выбран SQL-подобный синтаксис с ключевыми словами вместо символов.
Логика приложения задается в виде плоских текстовых файлов, которые называются модулями. В этих файлах содержится исходный код на внутреннем языке. В каждом модуле может одновременно находится объявление как классов и свойств, так и форм, событий, ограничений, дизайна и так далее. Между модулями можно указывать зависимости. При этом исходный код может использовать элементы только из тех модулей, от которых он зависит (в том числе и рекурсивно).
Ниже показаны примеры синтаксиса :
Больше различных примеров синтаксиса языка и вариантов использования можно найти по ссылке.
Архитектура
Платформа lsFusion состоит из двух Java-приложений. Для их выполнения в операционной системе должна быть установлена виртуальная машина Java.
Первое является сервером приложений, который считывает созданную разработчиком логику программы из определенных файлов. Эти файлы имеют расширение lsf, и содержат в себе исходный код, написанный на внутреннем языке платформы. В них описываются как доменная логика, так и пользовательский интерфейс. Структура проекта выглядит следующим образом :
Второе приложение представляет собой Apache Tomcat, с развернутым на нем веб-сервером, который обеспечивает функционирование веб-приложения. Оно взаимодействует с сервером приложений через RMI-запросы по внутреннему протоколу.
Как разрабатывать
Разработка приложения на lsFusion ведется при помощи специального плагина к IntelliJ IDEA Community Edition. Плагин подсвечивает синтаксис и ошибки, поддерживает навигацию и рефакторинг исходного кода.
Структура проекта на lsFusion аналогична структуре любого java-приложения. Исходный код на внутреннем языке выступает в роли обычных ресурсных файлов, которые не требуют компиляции.
Благодаря тому, что платформа построена на базе Java, а исходный код имеет плоскую текстовую структуру, при разработке можно использовать Git, Maven, а также подключать внешние Java классы и библиотеки для решения узкоспециализированных задач.
Как это работает
В качестве системы хранения данных используется реляционная СУБД PostgreSQL.
При запуске сервера приложений платформа считывает логику системы из подключенных модулей и синхронизирует с ней структуру базы данных. На основе заданных форм автоматически генерируется пользовательский интерфейс.
Исходя из кода на языке lsFusion платформа автоматически генерирует все SQL-запросы для чтения и записи данных, не используя никаких ORM паттернов. Таким образом, практически все вычисления производятся не на сервере приложений, а в PostgreSQL.
Изменения, сделанные внутри сессии (например, при редактировании данных пользователем на форме), записываются во временные таблицы. В момент сохранения сессии изменений (например, при нажатии кнопки Сохранить) начинается транзакция, выполняются события, и изменения записываются в базу данных.
Отличительной особенностью платформы lsFusion является то, что для любого вычисляемого свойства можно установить флаг MATERIALIZED. Для такого свойства создается отдельное поле в таблице, которое автоматически пересчитывается в момент изменения данных, от которых оно зависит. В то же время при расчете значений зависимых свойств будет использоваться уже подсчитанное значение из этого поля. Таким образом можно легко балансировать нагрузку на базу данных по записи и чтению без изменения логики системы. Эта возможность похожа на логику Materialized View с опцией Fast Refresh в Oracle только без каких-либо ограничений.
Для кого предназначена
Сложность разработки на платформе lsFusion немного выше, чем разработка на SQL, но значительно ниже, чем в классических универсальных языках программирования. Разработчику не нужно вручную управлять памятью, блокировками, транзакциями, взаимодействием между клиентом и сервером, или сервером приложений и базой данных. Все это делается автоматически платформой на основе логики, заданной на едином однотипном языке.
Такой высокоуровневый подход позволяет значительно снизить порог вхождения в разработку приложений. Благодаря этому создавать приложения могут люди без наличия какого-либо опыта программирования. Для базового изучения платформы lsFusion достаточно одной недели, а уже через месяц разработчик может создавать уже достаточно сложные приложения. Это достигается за счет того, что платформа оперирует небольшим количеством абстракций, на основе которых можно задать практически любую бизнес-логику. Разработчику достаточно научиться определять классы (сущности), строить свойства с помощью нескольких основных операторов, и собирать из них формы.
Возможности
ООП
Платформа lsFusion поддерживает множественное наследование классов и полиморфизм сразу по нескольким параметрам. Например :
Объявление абстрактного свойства и его реализация могут находиться в разных модулях. Это позволяет разрабатывать систему с архитектурой, соответствующей принципу "низкая связанность - высокое зацепление".
Печатные формы
Генерация печатных форм, текстовых документов и электронных таблиц осуществляется при помощи библиотеки JasperReports. Платформа может автоматически генерировать сложную структуру отчетов и подотчетов, а разработчику остается только визуально настроить расположение элементов при помощи JasperSoft Studio.
API
Платформа поддерживает отправку и прием запросов по HTTP-протоколу. В совокупности со встроенным механизмом по экспорту и импорту файлов в формате JSON/XML можно легко организовать взаимодействие с любыми внешними системами.
Расширение
В случае, если задачу невозможно решить штатными средствами платформы, существует возможность использовать нижележащие языки программирования. В частности, можно создавать свойства, вычисления которых реализуются на языке PL/pgSQL, которые затем встраиваются в SQL-запросы. При помощи Java можно создавать узкоспециализированные действия. На JavaScript можно создавать специфические визуальные элементы для свойств и объектов.
Интерфейс
В любой таблице формы пользователь может самостоятельно сортировать и отбирать строки, прятать колонки и изменять их порядок. Отобранные данные из любой таблицы можно выгрузить в электронные таблицы одной кнопкой. Навигация по записям таблиц реализована в виде “бесконечного скроллирования”.
Помимо изменения значения любой ячейки пользователь может изменить значения во всех записях при помощи механизма групповой корректировки. Кроме того поддерживается вставка в таблицу из буфера обмена.
В каждой таблице формы автоматически доступен режим Pivoting, который позволяет пользователю самостоятельно группировать данные в любом срезе.
С чего начать
Сперва нужно установить платформу lsFusion для разработки на локальный компьютер. Под Windows есть инсталлятор, который установит на компьютер PostgreSQL, Java, IntelliJ IDEA, и непосредственно платформу. Затем нужно создать пустой проект lsFusion в IDEA.
Изучение языка lsFusion лучше всего начинать на основе примеров, описанных в разделе How-to, а также двух простых примеров : Турнирная таблица и Управление материальными потоками.
В дальнейшем можно изучить исходный код приложения MyCompany, которое реализует базовую логику простой ERP-системы. Это решение распространяется под лицензией Apache-2.0, и может быть использовано как основа для разработки собственной системы.
Посмотреть демо-версию можно по адресу : https://demo.lsfusion.org/mycompany-ru.
Заключение
Платформа lsFusion разрабатывается уже 12 лет. За это время было реализовано большое количество приложений на ее основе : от самых простых приложений на несколько форм до сложных ERP-систем с тысячами пользователей и процессов. Разработка платформы финансируется за счет компаний, создающих собственные коммерческие решения на ее основе.
lsFusion подходит для создания приложений как отдельным программистам, так и большим командам за счет высокой декларативности, поддержки ООП и возможности использования Git. Лицензия позволяет как разрабатывать внутренние приложения для компании, так и коммерческие продукты на ее основе. В частности, на платформе разработаны и успешно внедряются в компаниях России, Беларуси и Узбекистана следующие коммерческие продукты :
lsFusion ERP. Решения для управления предприятиями розничной торговли.
lsFusion WMS. WMS-система для любого бизнеса.
Для прямой связи с разработчиками платформы, как и в других opensource проектах, можно использовать Github, StackOverflow, а также Slack и Telegram.