Узнал о существовании этой среды разработки, решил сравнить «Фузину» для тех, кто занимается 1С. Чтобы понять, годится ли эта белорусская разработка на Java на роль «убийцы 1С».

Рабочая среда

Кросс-платформенная. Windows / Linux / MacOS. Тестировались практически все версии (Java везде работает).

В качестве СУБД сейчас используется только Postgree. В будущем возможны другие СУБД.

Установка

Под Windows платформа и PostgreSQL устанавливается обычным инсталлятором.
Под Linux и платформа и PostgreSQL вместе ставятся одной командой, описание.

Для разработчика также существует инсталлятор всех программ сразу.

Клиент-серверная архитектура

Практически весь код выполняется на сервере. Небольшая часть кода выполняется на сервере приложений.

Существует возможность выполнить Java-код на клиенте — инициатором этого выступает сервер по логике приложения. Например: издать звуковой сигнал на клиенте или распечатать чек на ККМ через COM-объект.

Контекст клиента пока не сохраняется, т.е. вызов создает разовый клиентский контент, но вопрос решаемый при желании через static методы Java.

Исходя из заданной логики в скриптах генерируются SQL запросы и выполняются в PostgreSQL. В очень редких случаях идет итерирование на сервере приложений.

Формы хранятся на сервере и при изменении в них отображаются на клиента. Это важное отличие от 1С, программисту не приходится заботиться о разделении кода клиента и сервера, потому что весь код серверный.

Программисту также не приходится беспокоиться об асинхронности, нововведения в 1С83, асинхронное исполнение реализуется средствами платформы.

В качестве клиентского приложения используется браузер или собственный десктоп-клиент написанный на swing (это такая Java-библиотека оконного интерфейса). На практике клиенты используют 50/50 эти варианты.

У lsFusion ставятся две службы — lsfusion4-server и lsfusion4-client. Первый — это сервер приложений, он загружает всю логику приложений, транслирует ее в SQL, выполняет действия и многое другое.

Вторая — это веб-сервер (по сути Tomcat с установленной на него веб-приложением для lsFusion). Он генерирует страницу, отдает java script и т.д. Он же отдает десктоп-клиента через Java Web Start.

Под Windows первая служба называется lsFusion4 Server, а вторая lsFusion 4 Client.

Пользовательский интерфейс

Видео, демонстрирующее интерфейс:

Элементы форм описываются как в управляемых формах 1С через иерархию элементов. Абсолютно любое построение дизайна — это просто иерархия компонентов внутри контейнера. Наиболее яркий представитель — это HTML, который, как правило и пишется вручную. Но есть и плагин к IDEA, который показывает результат по мере написания кода.

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

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

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

По интерфейсу можно подробнее почитать:

База данных

Ключом объекта является автоматически генерируемое число long по счетчику.

Для объектов возможны вычисляемые свойства, которые реализуются затем при отображении на SQL, как View.

Составные типы полей организуются через оператор STRUCT, но как правило это все-таки по другому делается (через дополнительную сущность) или просто используются разные параметры в выражениях.

Для выделения подсистем обычно используется maven с его artifact“ами, то есть уже готовая инфраструктура.

Обновление баз данных

Обновление конфигурации происходит автоматически. Обновление — это помещение одного jar-файла (с собранным модулями при помощи IDEA – Build artifacts) в соответствующую папку и перезапуск службы сервера приложений lsFusion.

При этом при запуске службы структура базы данных автоматически приводится в соответствие с описанием новой структуры. Это отрабатывает в случае простых изменений, когда просто изменились типы или добавились/удалились поля/сущности).

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

Т.к. у полей нет GUID, то переименовывание полей нужно реализовывать особым образом. Есть такое понятие, как migration.script. Когда в IDEA нужно переименовать поле или сущность, то жмется Rename и там есть галочка — добавить изменение в migration.script. Тогда на старте сервера, он увидит, что версия migration.script изменилась и автоматически проведет переименования за нужные версии.

Обновление у клиента можно сделать автоматическим, написанием небольшого скрипта, который подгружает с сервера новую конфигурацию и перезапускает службу. Что позволяет поддерживать систему у клиента автоматически в актуальном состоянии.

Разработка

Разработка ведется при помощи плагина в IntelliJ IDEA Community Edition. На уровне плагина проверяется очень много (так как есть статическая типизация). Если плагин не показывает ошибок, то сервер с большой долей вероятностью запустится и будет работать корректно.

Большинство разработки ведется в текстовом виде. Есть возможность проверки, как будет выглядеть форма в процессе разработки через специальный плагин.

Используется свой внутренний язык/синтаксис, который больше всего похож на SQL. Язык автоматически платформой транслируется в SQL. Возможно использование Java-кода.

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

Можно строить любые библиотеки (например аналог БСП в 1С) с конкретном функционалом и объединять их при помощи Maven.

Важно понимать, что большинство вычислений идет именно на SQL сервере. Со строками соответственно тоже работа идет в PostgreSQL. Лимиты определяются уже им (то есть нет никаких лимитов на строки).

Что касается коллекций, то в lsFusion вообще другой принцип задания логики. Свойства и есть по сути соответствия и таблицы значений. Можно создавать локальные свойства (DATA LOCAL), которые и будут храниться и обрабатываться как таблицы значений.

Доработки типового кода

Важно понимать, как реализовывать доработки «типового» кода.

В принципе, с помощью git можно сравнить три конфигурации — старую, старую доработанную и новую. Но на практике применяется другой подход.

Сама логика модульности позволяет сделать прозрачное разделение типового и доработанного кода. Логика клиентов одного продукта может отличаться на 20-30% при неизменной базовой версии. Подробнее тут.

Модульность — одно из основных преимуществ. В любом модуле (текстовом файле) можно через EXTEND FORM, или добавлением ограничения (CONSTRAINT), или события (WHEN) или просто свойства можно добавлять любой функционал, собирая затем из таких маленьких логически завершенных модуль все решение.

Есть еще Интерпретатор, где можно в runtime выполнять любой код, что позволяет реализовывать механизм дополнительных внешних обработок.

Отчеты

С точки зрения получения данных, обычная форма и отчет строятся абсолютно идентично. А непосредственно графическое представление строится при помощи JasperReports. Собственно при помощи стандартного экспорта JasperReports делаются EXCEL, PDF, DOCX файлы.

Для динамических отчетов, как правило, используем либо сам механизм форм (в которых уже можно SHOWIFами прятать элементы), либо pivoting из lsFusion 4. Т.е. программная сборка отчета из областей макета, которая была в 1С7, здесь не используется.

В lsFusion нет разделения на формы и отчеты. Интерактивные отчеты — это и есть формы. В них соответственно можно делать и события и изменения. Ну и плюс pivoting.

Печатные формы генерируются через JasperReports.

Интеграции

Работа с файлами, Работа HTTP, XML, JSON реализована во встроенном языке. Для того, что не реализовано, можно использовать Java.

Распределенные базы пока не поддерживаются — не было ни разу необходимости, в связи с широким распространением Интернет. Однако план обмена можно реализовать вручную, причем передачу данных непосредственно подключением к центральной базе, без номеров сообщений. Что проще реализации от 1С.

Торговое оборудование

Имеется опыт взаимодействия с различным торговым оборудованием.

  1. Ряд производителей оборудования (например ККМ от Атолл) предоставляют локально устанавливаемый web-server, к которому делается HTTP запрос через встроенный оператор EXTERNAL HTTP CLIEnT, а он уже сам через встроенный драйвер по ком-порту обращается к оборудованию. Работает и в веб-клиенте и в десктоп-клиенте. Это делается на lsf. Пример

  2. Пишется на Java код, который обращается к dll-ке (или so для linux’а) от поставщика оборудования. Код пишется на сервере (как и dll-ка хранится на сервере), а сама платформа доставляет во время выполнения этот код на десктоп-клиент (который на Java) и там же выполняет.  Пример (там подключение идет через Native.load)

  3. Пишется на Java код, который через java-библиотеку jacob обращается к COM-объектам. Пример. Там в частности делается обращение к activex объекту через ActiveXComponent

  4. Пишется на Java код, в соответствие с протоколом оборудования, который напрямую работает по протоколу через ком-порт. Остальное аналогично пункту про dll.

Лицензия

Вопрос лицензий — крайне важный. Потому и ищется «убийца 1С», что у 1С закрытая платформа, которую в случае гибели фирмы 1С некому будет развивать и сама платформа стоит очень дорого, поэтому недорогие решения на ней не могут найти сбыта.

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

Нет никаких скрытых нюансов по лицензированию СУБД в коммерческих решениях?PostgreSQL имеет очень свободную лицензию.

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

Разработчик планирует зарабатывать на капитализации. А текущие расходы давно покрывает с прибылью за счет продажи коммерческого решения lsFusion ERP в Беларуси.

Варианта поставки клиенту “без исходного кода” или шифрования кода пока нет. Планируется, но особого смысла нет, так как при желании всегда можно будет разобрать из объектов в памяти, хоть и не так просто.

Фузина работает пока только на сервере клиента. Но кто угодно может сделать и облако.

Сообщество

Главный сайт по Фузине: lsfusion.org (Eng и Rus)

Блог на Хабре: по тегу lsfusion.

На Youtube пока нет канала по Фузине, что плохо, учитывая маркетинговые потери за время существования Фузины.

Для Фузины выделена целая секция на Мисте. Там ведутся довольно жаркие баталии с 1Сниками.

Репозитария решений для Фузина вроде Инфостарта (с платным скачиванием) пока нет, только внутренний бесплатный репозитарий решений: https://github.com/lsfusion-solutions

Что дальше?

Планирую ознакомиться с обсуждением Фузины на Мисте, написать по результатам следующую статью, но главное — попробовать на практике Фузину.

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

Это мне нужно, чтобы оценить сложность разработки на Фузине. После этого я уже более точно смогу сказать, насколько отличается Фузина от 1С.