Узнал о существовании этой среды разработки, решил сравнить «Фузину» для тех, кто занимается 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С.
Торговое оборудование
Имеется опыт взаимодействия с различным торговым оборудованием.
Ряд производителей оборудования (например ККМ от Атолл) предоставляют локально устанавливаемый web-server, к которому делается HTTP запрос через встроенный оператор EXTERNAL HTTP CLIEnT, а он уже сам через встроенный драйвер по ком-порту обращается к оборудованию. Работает и в веб-клиенте и в десктоп-клиенте. Это делается на lsf. Пример.
Пишется на Java код, который обращается к dll-ке (или so для linux’а) от поставщика оборудования. Код пишется на сервере (как и dll-ка хранится на сервере), а сама платформа доставляет во время выполнения этот код на десктоп-клиент (который на Java) и там же выполняет. Пример (там подключение идет через Native.load)
Пишется на Java код, который через java-библиотеку jacob обращается к COM-объектам. Пример. Там в частности делается обращение к activex объекту через ActiveXComponent
Пишется на Java код, в соответствие с протоколом оборудования, который напрямую работает по протоколу через ком-порт. Остальное аналогично пункту про dll.
Лицензия
Вопрос лицензий — крайне важный. Потому и ищется «убийца 1С», что у 1С закрытая платформа, которую в случае гибели фирмы 1С некому будет развивать и сама платформа стоит очень дорого, поэтому недорогие решения на ней не могут найти сбыта.
Платформа полностью бесплатна для разработчика. И главное даже не бесплатность, а максимально свободная LGPL лицензия.
Нет никаких скрытых нюансов по лицензированию СУБД в коммерческих решениях?PostgreSQL имеет очень свободную лицензию.
Исходный код открыт на случай внезапного закрытия компании и расположен тут.
Разработчик планирует зарабатывать на капитализации. А текущие расходы давно покрывает с прибылью за счет продажи коммерческого решения lsFusion ERP в Беларуси.
Варианта поставки клиенту “без исходного кода” или шифрования кода пока нет. Планируется, но особого смысла нет, так как при желании всегда можно будет разобрать из объектов в памяти, хоть и не так просто.
Фузина работает пока только на сервере клиента. Но кто угодно может сделать и облако.
Сообщество
Главный сайт по Фузине: lsfusion.org (Eng и Rus)
Блог на Хабре: по тегу lsfusion.
На Youtube пока нет канала по Фузине, что плохо, учитывая маркетинговые потери за время существования Фузины.
Для Фузины выделена целая секция на Мисте. Там ведутся довольно жаркие баталии с 1Сниками.
Репозитария решений для Фузина вроде Инфостарта (с платным скачиванием) пока нет, только внутренний бесплатный репозитарий решений: https://github.com/lsfusion-solutions
Что дальше?
Планирую ознакомиться с обсуждением Фузины на Мисте, написать по результатам следующую статью, но главное — попробовать на практике Фузину.
Установлю среду разработчика и попробую написать каркасное приложение, которое используется на экзамене по 1С:Специалист — т.е. простейшую складскую конфигурацию с складами, номенклатурой, приходом, расходом и партионным учетом FIFO, отчетами по движению и остаткам товаров, печатными формами прихода и расхода.
Это мне нужно, чтобы оценить сложность разработки на Фузине. После этого я уже более точно смогу сказать, насколько отличается Фузина от 1С.
remzalp
Вот никаким боком не программист на 1С, но узнав слово «конфигуратор», методом тыка, по подобию — сумел внести правки в уже редактированную конфигурацию и в общих чертах понять логику происходящего.
А теперь домножим такой порог недо-входа на количество немного практикующих «программистов» 1С. Платформа должна быть примерно настолько же дружелюбной, чтобы на неё стали смотреть.
CrushBy
Проблема у всех «красивых и дружелюбных конструкторов» начинается, когда у вас появляется хотя бы 5 разработчиков, которые коммитят в общий git-репозиторий, а затем нужен merge всего этого.
trdm
Механизм хранилища конфигурации и захват объектов для изменения.
все предусмотрено.
NitroJunkie
«Wow! That's really retro.» © South park.
Блокировки в системах контроля версий уже лет 20 не используются. И не только из-за git flow, а просто потому что это дико неудобно.
lemur-galago
Справедливости ради, если речь заходит об относительно современных конфигурациях, то этот самый порог входа не такой уж и низкий, чтобы навскидку понимать «логику происходящего» и вносить сколько-нибудь существенные правки.
fixin Автор
вот-вот. пусть УТ-11 потыкает
LARII
УТ11 это более-менее красивый и типовой код. А вот "потыкать" легаси из переписанных УТП/УПП/ЗУП связки со стилем "письмо из Простоквашино", с управляемыми формами в Обычном приложении, без БСП и логикой "как!!! Оо… мы думали всегда здесь так, а тут разве не так, ведь должно быть так. Как? Ну как то так".
fixin Автор
красивый говорите? Гляньте-ка как там происходит контроль остатков товаров организаций, например, потом поговорим. Я ж практик, УТ 11 щупал с разных краев, нет там красот.
LARII
Да, говорю красивый. Не говорю, что идеальный и не подлежит критике. Но по принципу релятивизма, относительно откровенно плохого кода, смысл которого просто забыли, хороший. Ведь недаром это типовое решение используется множеством компаний.
SwingoPingo
И это «множество компаний» делало выбор в пользу УТ основываясь на «красивости кода контроля остатков»?
Не хотелось бы огорчать, но эта причина, скорее всего, не вошла даже в первую сотню причин выбора. И еще более скорее вообще не вошла в список причин выбора. (И для под«множества компаний» вообще не было важно есть ли там такой механизм в принципе, как и многим было достаточно что бы он просто существовал).
А критерий «красивости» уже будет определять сообщество, но уж точно не «множество компаний» фактом своего использования.
LARII
Разве я писал о красивости хода контроля остатков УТ? Я писал о релятивизме качества и красоты.
CrushBy
Ваша логика мне очень напоминает логику нашего бывшего президента. «Да, у нас плохо. Но посмотрите, что на Украине творится… Так что у нас все хорошо.»
LARII
Fixin по крайней мере указал на то, что считает недостатком. Что лично Вы можете сказать ужасного про УТ11.x?
CrushBy
Лично я могу сказать все тоже самое, что было описано нами в статье Почему не 1С.
LARII
Про УТ11.x?
NitroJunkie
Там к слову большинство примеров из УТ11.x.
LARII
Что плохого Вы можете сказать о приведенной Вами в качестве примера Функции ТекстЗапросаТаблицаЗаказыКлиентов?
NitroJunkie
Ну то, что зачем мне вообще как разработчику бизнес-приложений загоняться запросами, менеджерамивременныхтаблиц и прочими чисто техническими вещами. Но это еще цветочки, ягодки вот. Я бы к такому коду и на километр не подошел. А то будет как говорил наш бывший президент: «только за яйца взялся, молоко исчезло». Там же в одном месте поменяешь, все остальное поломается. Без явных типизаций, запросах в строках (то есть ранней проверки ошибок, пусть хотя бы на уровне запуска приложений), жесткой императивщине и т.п.
LARII
Разработчику бизнес-приложений баз данных… вы не оговорились?
NitroJunkie
Нет, просто бизнес-приложений. Мне в принципе все равно что там внутри SQL-базы данных, плоские файлы, NoSQL, внешние сервисы или что-то там еще. Это вообще проблемы платформы где и как она это все будет выполнять. Мне как разработчику всегда хочется максимальной декларативности. Хотя конечно чтобы при необходимости (но ТОЛЬКО при необходимости) я мог спуститься на более низкий уровень.
Ну и естественно, чтобы даже на высоком уровне декларативности производительность и масштабируемость была из коробки (максимум с небольшими «пинками» администратора).
LARII
То, что вам все равно, это мне было понятно три комментария назад.
Мне лично как разработчику не все равно: SQL-базы данных, NoSQL или плоские файлы.
По Функции ТекстЗапросаТаблицаЗаказыКлиентов у вас аргументов нет.
Кроме того что вы бы не подошли к обработчику ПередЗаписью регистра накопления, что ужасного в приведенном запросе с помещением во временную таблицу? Такой паттерн очень популярен.
NitroJunkie
Нет, я не спорю, любознательность очень полезный навык. Особенно для разработчика. Только за него к сожалению мало кто платит.
Я просто из названия функции не понимаю, какое это отношение имеет к решению бизнес-задачи поставленной передо мной работодателям / заказчикам. Явно у него там ни про какие Запросы и МенеджерыВременныхТаблиц не было. То есть мне придется делать лишнюю работу, которая мне ничего не даст (конечно в том случае, если есть инструмент позволяющий обойтись без этих абстракций, но при этом обеспечить хорошую масштабируемость / производительность).
LARII
Это заметно.
NitroJunkie
Там есть вторая часть предложения, которые вы благополучно опустили. Это называется «выдирать из контекста».
LARII
Я этот стыд даже скопипастить не могу. Извините.
NitroJunkie
Так зачем вы выдираете фразу из контекста и комментируете?
Это луддизм в чистом виде. Также было и с Java и ее сборкой мусора (мне как разработчику «не все равно когда создаются и удаляются объекты из памяти»), и с SQL («как читаются данные из базы») и с React'ом (как обновляется страница) и т.д.. Но со временем (пусть некоторые и через десятилетия) все они стали стандартом в отрасли.
LARII
А зачем вы пытаетесь критиковать синтаксис языка, вместо обсуждения кода функции УТ11?
NitroJunkie
Еще раз, вопрос не в синтаксисе языка (в 1С именно язык как раз предельно примитивный, там нечего критиковать), я имел ввиду, что с тем уровнем абстракций, что есть в 1С (запросы в строках, временные таблицы, отсутствие всяких механизмов вроде ограничений, наследования с полиморфизмом и т.п.) любой сложный проект (вроде УТ11) превращается в жуткий спагетти-код. Как будто небоскреб при помощи молотка и пилы строили.
Как это поддерживается и дорабатывается для меня загадка.
LARII
Прям бальзам на душу.
Чем больше для вас загадка, тем мне (и fixin-у) больше работы.
NitroJunkie
Ну то что многие разработчики не особо заинтересованы в скоросте и простоте разработки, как бы ни для кого не секрет. У них вообще противоположные KPI с заказчиком. Но зато с ними гораздо проще конкурировать (когда ты доработки можешь выполнять на порядок быстрее и как следствие дешевле).
LARII
Я не HR, у меня такой статистики нет. Зато когда человек смотрит на функцию возвращающую текст запроса для таблицы заказов клиентов из таблиц реляционной базы данных и пишет, что ее название не говорит какое отношение имеет это к решению бизнес задачи… То это стыд.
NitroJunkie
Вы опять передергиваете. Еще раз цитирую фразу:
То есть я не не понимаю, что это функция значит, я просто не понимаю зачем мне это понимать. И работать
с такими низкоуровневыми вещами как тексты запросы, менеджеры временных таблиц, управляемыми блокировками, реквизитамиформывзначение и т.п. Моя задача как бизнес-разработчика зарабатывать деньги, себе и заказчику, а не техногикерством страдать (хотя при этом если что иметь возможность спуститься на уровень ниже, про что я уже писал). Этим платформа должна заниматься.
LARII
Потому что во-первых мы программисты, а не администраторы, а во-вторых мы работаем с реляционными базами данных, а в-третьих мы обсуждали код УТ11. И кто здесь передёргивает?
NitroJunkie
Но мы же не программисты ради того чтобы быть программисты. Наша цель решать задачи поставленные заказчиком. И если для решения этих задач, нам нужно заниматься какой-то технической ерундой (не имеющих прямого отношения к задаче), значит мы скорее всего плохие инструменты используем. То есть мне может лопата очень нравится, но строить дом я буду с использованием бульдозера.
LARII
Самый первый тезис — неверен.
А чем дальше, тем больше искажения смысла и подмены понятий.
Дальнейшая дискуссия невозможна.
NitroJunkie
NitroJunkie
habr.com/ru/company/lsfusion/blog/468415/#events
Вот это не ужасно по вашему? Как вообще это можно дорабатывать / поддерживать?
fixin Автор
а можно узнать, что за красоты кода вы там нашли?
LARII
Можно. Я вообще вырос на типовых решениях под управляемые формы.
Когда начал работать с древним легаси в старых конфигурациях, оценил красоту удачных решений 1С еще больше.
Сергей, можете сказать насколько отличаются последние УТ11.х и ERP 2.x?
Klaster
LARII
Да, я задал наводящий вопрос. А вы его проигнорировали.
d-stream
А потом «переступившие порог» пишут
Число = Год(Дата)*10000+Месяц(Дата)*100+День(Дата)-(Год(Дата)*10000+Месяц(Дата)*100+20);
и «а чё смешного в том что человек незнает как писать, а зарабатывать хочется?»
fixin Автор
это вы в 7 или в 6 тыкали? в 8-ке ваши тыкания могли бы закончиться ничем. Я помню, пришел в контору на подработку, где были управляемые формы (УТ), а я знал только обычные. Кое-что натыкал конечно, но глобально передал задачу другому программисту.