Вход | Регистрация
    1  2  3  4  5  6  7  8  9  10  11   

Конкретные вопросы по lsFusion

Ø [длинная ветка, 14.10.19 - 21:06]
Конкретные вопросы по lsFusion
Я
   Bro
 
06.10.19 - 20:21
Здесь только вопросы по lsFusion, без оценок и срача, что в сторону lsFusion, что в сторону 1С. Кто будет начинать того будут блокировать.
   CrushBy
 
401 - 09.10.19 - 18:34
(393) В платформе есть два типа : STRING и ISTRING. Хранятся они одинаково. Разница в том, что первый тип регистрозависим, а второй нет. Так вот для первого, по умолчанию, включается фильтр на =, а для второго на Содержит (плюс не учитывается регистр). Для наименований и других подобных атрибутов, лучше делать тип ISTRING. Для всяких номеров, кодов - STRING.
   pechkin
 
402 - 09.10.19 - 18:35
(400) зависит от того одни люди хотелки клиетнов и платформу пилят или разные
   CrushBy
 
403 - 09.10.19 - 18:36
(391) Но изначально с фильтром такая тема была, что "И" сразу прокидывается в диалог и начинается фильтр по нужной колонке (правда такой колонки в диалоге может вообще не быть). Но потом этот функционал посчитал слишком сильным костылем и вырезали (она там под архитектуру не очень подкладывалась). Но мы еще думаем, как это сделать лучше.
   CrushBy
 
404 - 09.10.19 - 18:37
(402) Конечно разные. Платформу пишут на Java, а конфигурации на lsFusion. Также, как и в 1С.
   pechkin
 
405 - 09.10.19 - 18:37
нужно делать как в 1с, поиск по всем колонкам.
   CrushBy
 
406 - 09.10.19 - 18:48
(405) Вы представляете, какой там запрос будет, и какая это "дорогая" операция с точки зрения выполнения ? А если в таблице миллионы записей ?
   CrushBy
 
407 - 09.10.19 - 18:50
(405) В поиске по колонке по подстроке можно хотя бы GIN индекс построить, и она будет очень быстрая (мы так с наименованием товара делаем). И то это, если в родной таблице, а если JOIN или вычисляемое поле ?
   pechkin
 
408 - 09.10.19 - 18:50
(406) ну тогда хотя бы по ключевым полям
   CrushBy
 
409 - 09.10.19 - 18:56
(408) Вообще, если честно немного странный use case. Слабо представляю, когда это надо. Как правило, пользователь знает, где он хочет найти - или по номеру, или по поставщику, или еще по чему-нибудь. К тому же, практически все строковые атрибуты (наименования) будут по JOIN. И прямой индекс там не построится. И там в любом случае будут дорогие операции по фильтрации.
   palsergeich
 
410 - 09.10.19 - 19:07
(409) в 1С поиск по всем колонкам реализован через полнотекстовый поиск, а не через запроскБД
   palsergeich
 
411 - 09.10.19 - 19:08
но это не отменяет того что это все равно дорогая операция
   CrushBy
 
412 - 09.10.19 - 19:15
(411) Как минимум, вам придется строить gin индексы по каждой из колонок для этого. Но тут даже дело не в этом, там дорого не найти соответствующие записи в справочниках, а потом отфильтровать их по ключам по JOIN, если таких найдется много. В общем достаточно дорогой и достаточно бесполезный функционал (хотя не спорю, иногда может быть полезен). Поэтому пока в планах нет. Тем более, что есть workaround на конкретной форме. Вешается DATA LOCAL на форму и делается явный FILTERS по всем колонкам на нужной таблице, что даст такое же поведение.
   CrushBy
 
413 - 09.10.19 - 20:12
(396) Обычно просто кнопки удаления делаются только очень узкому кругу лиц, а большинству просто добавляется свойство Неактивный, которое добавляется одной строкой на все формы со списком объектов. Но в целом просто так, удалить те же товары все равно не смогут, так как обычно всегда добавляются ограничения на то, что для документов товар должен быть задан. И удаление упадет по соответствующему CONSTRAINT.
   Ещё1
 
414 - 09.10.19 - 21:19
(401) Кто ж знал, спасибо за подсказку. Это то что 1С-овцы называют методическими рекомендациями, и требовали от вас.
(403) Всё просто: по умолчанию при открытии списка выбора фильтр должен идти по полю, которое показано в столбце главной таблицы. Т.е. если в главной таблице столбец "Имя игрока", то и при открытии списка Player автоматом должно фильтровать по имени игрока, а не по коду. Наверное, можно как-то передать в список выбора имя поля, по которому вести отбор.
И возможно лучшим вариантом было бы не фильтровать список выбора, а отсортировать его по подстановочному полю (свойству), и откручивать к нужной записи по мере набора. Тогда пользователь может видеть, когда он приблизится к нужной ему записи, подберёт её стрелками вверх-вниз если нужно и нажмёт Enter.
(413) CONSTRAINT да, помешает окончательно удалить из базы при наличии ссылок. Но он когда сработает, непосредственно в момент удаления, или при сохранении изменений сессии в БД? Насколько я понял, 2-е. Т.е. пользователю придётся откатить все изменения сессии, и начать набор заново.

Я чего так придираюсь к лишним нажатиям кнопок, к откатам работы и повторному вводу. Это всё время, которое складывается в человеко-часы.
   Ещё1
 
415 - 09.10.19 - 22:00
Вопрос по языку lsFusion. Как наложить ограничение, чтобы свойство не было пустым?
Я нашёл такой способ:

CONSTRAINT Goal goal IS Goal AND NOT player(goal) CHECKED BY player[Goal]
  MESSAGE 'Игрок должен быть указан';

Есть вариант короче? Пробовал так, но выдаёт Java exception в Runtime:
CONSTRAINT NOT player(Goal goal) CHECKED BY player[Goal]
  MESSAGE 'Игрок должен быть указан';
   Ещё1
 
416 - 10.10.19 - 01:12
(415) Сам спросил - сам ответил: для контроля заполнения поля CONSTRAINT не обязателен. Достаточно добавить атрибут NONULL в его определение.
   Bro
 
417 - 10.10.19 - 09:07
(416) NONULL это синтаксический сахар для CONSTRAINT.
То есть:
f = DATA LONG (A) NONULL;
преобразуется в:
CONSTRAINT a IS A AND NOT f(a) MESSAGE 'f не задано';
Хотя CONSTRAINT это синтаксический сахар для WHEN. А WHEN синтаксический сахар для ON. Вообще в lsFusion строго вертикальная архитектура.
   Ещё1
 
418 - 10.10.19 - 09:58
(417) Ну собственно я про сахар и спрашивал: как меньшим кодом сделать контроль заполненности поля. "NONULL" - куда уж меньше. У вас кстати не все разработчики конфигураций про NONULL знают, если пишут такую проверку в CONSTRAINT. Добавьте в методические рекомендации.
   Bro
 
419 - 10.10.19 - 10:09
(418) Там просто часто нужна более сложная проверка. Или есть именно CONSTRAINT a IS AND NOT f(a), покажите, глянем коммит, лишим премии :)
   Ещё1
 
420 - 10.10.19 - 10:22
(419) Не, я сдавать не буду. Чтоб потом мне икалось?
А можете в 2 словах объяснить, зачем вообще эта отдельная проверка на тип?
CONSTRAINT Goal goal IS Goal AND NOT player(goal)
Если бы написать
CONSTRAINT NOT player(Goal goal)
сразу понятно, какое свойство какого класса не должно быть NULL.
Но так не проходит.
   Bro
 
421 - 10.10.19 - 10:40
(420) Вот тут да есть один нюанс (пока). Дело в том, что lsFusion язык не обязательно явно типизированный (то есть можно указывать классы параметров, а можно не указывать). То есть явная типизация по сути сбоку и нужна для поиска свойств / действий (на самом деле есть нюансы, но в данном случае это не важно). То есть после запуска:
CONSTRAINT NOT player(Goal goal) становится просто CONSTRAINT NOT player(goal). А дальше вот в чем фокус, по спецификации если DATA свойству передать объект не того класса (а логика классов опять таки своего рода сбоку), то оно вернет NULL. И поэтому получается что CONSTRAINT NOT player(goal) - TRUE например если goal это Game. Или LONG. То есть для бесконечного количества параметров. По этой же причине нельзя писать FOR NOT player(goal), и это кстати причина почему CONSTRAINT это заведомо ложное, а не заведомо истинное условие.

Но проблему да мы понимаем и скорее всего в будущих версиях сделаем, что при бесконечном количестве ключей (а может и всегда) при явной типизации Goal goal будет автоматически добавляться AND goal IS Goal.
   Ещё1
 
422 - 10.10.19 - 11:50
(421) Понимаю, что не всё просто. Немного поучаствовал в написании транспайлера Delphi - JavaScript.
   Злопчинский
 
423 - 10.10.19 - 12:32
(422) ну и как в связи с кучей тонкостей оцениваешь порог входа в 1С и в фузину?
   Bro
 
424 - 10.10.19 - 12:44
(423) У вас очень странный вопрос. Тут нужно сравнивать для выполнения одной и той же задачи. Потому как самый низкий порог входа будет в голый Pascal, но это ни о чем не говорит.
   Ещё1
 
425 - 10.10.19 - 13:02
(423) Если взять непрофессионала и научить его подправить отчёт или форму счёт-фактуры, то разницы нет. Если же речь за программистов, научиться серьёзным доработкам готовых решений или написания с нуля... Раньше я бы сказал конечно 1С проще, визуальное программирование и готовые конфигурации рулят. Но сейчас всё настолько усложнилось, что уже не уверен.

В lsFusion столбец таблицы БД (уровень СУБД) = свойству класса (уровень сервера приложений) = элементу визуальной формы или отчёта (уровень пользовательского приложения). Причём сразу получаем пользовательское приложение в Windows и Web. Пишем 1 раз - используем везде. А в 1С всё это - разные сущности.
   НиколаевГ
 
426 - 10.10.19 - 13:05
(423) Зависит от того, имеет входящий субъект ИТ-бэкграунд, или нет.
   Ещё1
 
427 - 10.10.19 - 13:14
Вопрос фузионистам: можно ли сделать 2 или более пользовательских приложения, работающих с 1 БД и 1 сервером приложений? Ну, например, общее приложение для бэкофиса, и лёгкое web-приложение для авторизованных клиентов для самостоятельного размещения заказов в системе?
   pechkin
 
428 - 10.10.19 - 13:17
а составные типы есть в фузине?
   Ещё1
 
429 - 10.10.19 - 13:18
(426) Ну да. Напр. в lsFusion без знания SQL никак, ибо запросы фактически пишутся руками. Но и в 1С не все запросы в конструкторе скомпонуешь, так что рано или поздно придётся изучить 1С-SQL (не знаю как правильно этот язык называется).
   Злопчинский
 
430 - 10.10.19 - 13:19
(424) в том смысле что у вас по пояснениям (по себе сужу исключительно) порог входа все выше и выше. с одной стороны проще (куча на себя платформа берет). с другой стороны как трукодера - выше надо. в 1С - как трукодера порог гораздо ниже, но надо больше знать прикладнуху и специфику автоматизированых вещей. в итоге так на так получается. с это точки зрения например мне выгоднее в 1С специализироваться бо оттуда я в РП выроту и в бизнесаналитики. в фузине в профкодирование, яву и среды разработки. Ниши решений даже с учетом имеющейся типа ерп на фузине - не особо пересекаются в итоге. Обсуждение конечно больше для луноветки.
 
 Рекламное место пустует
   pechkin
 
431 - 10.10.19 - 13:20
то что у них функциональный язык сильно (очень сильно) повышает планку
   Злопчинский
 
432 - 10.10.19 - 13:20
(430) " больше знать прикладнуху" - хорошо ориентироваться в возможностях типовых решений, отдельных блоков и кода типовых решений.
   Salimbek
 
433 - 10.10.19 - 13:32
(427) Видимо правами ограничить стандартную поставку, клиент то все равно ведь какой.
   CrushBy
 
434 - 10.10.19 - 13:54
(429) Напомню, что изначально SQL создавался как язык для бизнес-пользователей. Более того, сейчас многие бизнес-аналитики умеют делать SQL запросы, но не умеют писать императивные программы. Так что порог вхождения в SQL изначально ниже, чем в императивное программирование, как в 1С.
   CrushBy
 
435 - 10.10.19 - 13:55
(427) Пока, один инстанс сервера приложений = одна конфигурация. Можете просто запустить рядом второй сервер приложений со значительно меньшими выделенными ресурсами под него и использовать одну СУБД.
   Bro
 
436 - 10.10.19 - 14:05
(429) А вот тут можно поподробнее? Как раз во фьюжн знать SQL не надо, а точнее все эти левые правые соединения, объединения, таблицы и т.п. Работа идёт на уровне функций и формул логических операций. В остальных технологиях же технологиях так или иначе все сводится к sql.
   Bro
 
437 - 10.10.19 - 14:06
*функций, формул и логических операций
   Bro
 
438 - 10.10.19 - 14:10
(431) строго говоря lsFusion вообще не функциональный язык (основным атрибутом которого является передача функций в качестве параметров, а этого как раз в lsFusion нет) Он скорее комбинаторный (хотя это не очень устоявшийся термин).
   Bro
 
439 - 10.10.19 - 14:11
(438) вы тут наверное декларативный имели ввиду, но это как раз понижает порог вхождения.
   Bro
 
440 - 10.10.19 - 14:13
(428) их функцию наследование выполняет. То есть создаёте класс, наследуете от него нужные, и используете где хотите.Ну и реализация этого механизма не имеет никаких побочных эффектов (вроде дополнительных полей, неэффективных запросов и т.п.)
   _DAle_
 
441 - 10.10.19 - 14:25
(429) Все же руками пишутся не SQL запросы. Да, есть какие-то схожие черты в операторах группировки, например, но никаких ведь соединений, объединений ни знать, ни описывать не нужно. Среди наших коллег есть люди, которые не знают SQL, что не мешает им на вполне достойном уровне писать на lsfusion.
   Ещё1
 
442 - 10.10.19 - 14:47
(441) Возможно, неправильно выразился. В lsFusion нет SQL, но в них столько похожего, по структуре выражений, по используемым ключевым словам, типам данных и т.п., что знание SQL точно не повредит при изучении lsFusion. Даже написание ключевых слов капсом - это же явно оттуда. Хоть сейчас в большинстве СУБД позволяется писать как угодно. https://stackoverflow.com/questions/608196/why-should-i-capitalize-my-sql-keywords
   Bro
 
443 - 10.10.19 - 14:53
(442) Ну это да. Кстати к комменту Asmody про непривычность. Если lsFusion рассматривать не со стороны императивного программирования, а со стороны SQL, как его эволюцию, то он не будет выглядеть настолько жесткой сменой парадигмы.
   _DAle_
 
444 - 10.10.19 - 15:18
(442) >Даже написание ключевых слов капсом - это же явно оттуда.

Это только отчасти оттуда на самом деле.

>Хоть сейчас в большинстве СУБД позволяется писать как угодно.

Да, но ведь язык у них при этом обычно case-insensitive, так что это и неудивительно.
   Ещё1
 
445 - 10.10.19 - 22:00
Смотрю https://github.com/lsfusion-solutions/crm
Все текстовые строки заменены на "message '{system.events.message.exception}'" и под.
Почему вы так делаете, ничего не понятно же? Не, я понимаю, что для интернационализации. Но почему тогда не писать все по-английски, а русский или другой язык подгружать из файла при необходимости.
   Ещё1
 
446 - 10.10.19 - 22:15
(445) Это оказывается при открытии проекта CRM мне IDEA подгрузила jar-файл с платформой 3 beta, и когда Ctrl-кликаю по именам системных модулей в REQUIRE она мне извлекает из JAR соответствующие lsf-файлы, с обфусцированными строками...
   CrushBy
 
447 - 10.10.19 - 22:20
(446) Да, CRM не локализован. Только платформа. И это не обфусцированные строки - а id в ресурсных файлов. Собственно, таким образом платформа легко локализуется под любой язык. Достаточно один файл перевести.
   _DAle_
 
448 - 10.10.19 - 22:28
(445) Перейти на нужный файл с переводом можно с помощью clrl+b.

Мы используем стандартный механизм java для интернационализации, который предусматривает некий
идентификатор. Сразу соглашусь, что этот идентификатор в данном случае, конечно, мог бы выглядеть и понятнее.

Насчет предложения писать по-английски не совсем понял. Если в качестве уникального идентификатора принимать просто произвольный текст, который будет в англоязычной версии, то сразу нарываемся на следующие проблемы:
1. Одинаковый текст может быть переведен по-разному в различных контекстах. Самый простой пример - это хотя бы просто какое-нибудь слово с различными значениями в русском языке (live, например). Часто ведь текст собирается из нескольких частей, так что такие вещи вполне реальны.
2. У нас сейчас масса кода без интернационализации, где строковые литералы на русском. Перевести на английский их все не представляется реальным, делать русский в качестве идентификатора - это еще больше минусов. Понятно, что можно для этого какие-то опции придумывать, но..
3. Придется отказываться от стандартного механизма и реализовывать свой, не то чтобы это сильно сложно, но все же.
Думаю, я смогу еще придумать минусы, но эти три - первое, что пришло в голову.

Подобный подход (с использованием самого текста в качестве идентификатора) есть в QT, у них там все серьезно: и контексты есть, и Qt Linguist. Но для нас это была не настолько важная задача, чтобы реализовывать такой комбайн. Да и выглядеть это все будет так себе, у нас же не с++ все-таки.
   _DAle_
 
449 - 10.10.19 - 22:33
(448) Если файлы из jar-ки, то возможно ctrl+b не сработает, но это баг, он будет исправлен.
   _DAle_
 
450 - 10.10.19 - 22:44
(446) Хотел еще сказать, что теоретически мы сможем с помощью IDE отображать литерал на выбранном где-нибудь в настройках языке без всяких нажатий клавиш, но тут нужно и над UX думать, и над тем, как именно это реализовывать. Думаю, что это самая приоритетная задача данный момент.
   _DAle_
 
451 - 10.10.19 - 22:45
(450) Эх, почему же редактирования сообщений здесь нет.. Имелось ввиду: "Думаю, что это не самая приоритетная задача в данный момент"
   Ещё1
 
452 - 10.10.19 - 22:46
Ясно, я в Java новичок. Да, системные модули открываются прямо из server.jar. Нажимаю Ctrl-B на строковой константе - "Cannot find declaration to go to".

Хорошо, а как ваши разработчики разбираются в языке, системных модулях, описанных в них классах, свойствах? Конечно что-то понятно с названий идентификаторов. Но развёрнутого справочника по библиотеке, например как у PHP https://www.php.net/manual/en/langref.php - такого нет. Комментариев в коде я особо не наблюдаю. Вместо текстовых сообщений, названий классов и свойств - идентификаторы. Всё время нажимают на них Ctrl-B?
   _DAle_
 
453 - 10.10.19 - 23:05
(452) В теории имена идентификаторов должны быть такими, чтобы они были понятны любому, слегка знающему английский. Конечно, это идеальный мир, на практике все совсем не так хорошо.

>Хорошо, а как ваши разработчики разбираются в языке... Но развёрнутого справочника по библиотеке, например как у PHP https://www.php.net/manual/en/langref.php

Я может быть плохо понял или ссылка не та, ссылка вроде как на reference по языку, а не по библиотеке. Ну, по языку, я думаю, вы видели документацию https://documentation.lsfusion.org/pages/viewpage.action?pageId=1573050

>Вместо текстовых сообщений, названий классов и свойств - идентификаторы. Всё время нажимают на них Ctrl-B?
Это все же не названия классов, а всего лишь текстовые заголовки по умолчанию, их можно в дизайне менять. Но да, при интернационализации сейчас придется нажимать Сtrl+B, но тут зависит все от use case. Часто разработчику, когда он разбирается, нужно найти свойство/действие/форму, которые он наблюдает визуально на формах, в коде. И на форме он увидит заголовок на том языке, на котором захочет, а затем сможет перейти на место в коде (в хинтах будет указано как минимум место объявления, а для свойств и действий и само объявление).
   CrushBy
 
454 - 10.10.19 - 23:07
(452) https://habr.com/ru/company/lsfusion/blog/465573/
Вот тут описаны ряды кейсов как по коду читается логика.
   Ещё1
 
455 - 10.10.19 - 23:15
(453) Там на сайте PHP Manual у них всё. В поиск можно забить любое ключевое слово языка, либо библиотечную функцию - и откроется страничка с описанием. Но это наверное идеал, к которому всем нужно стремиться.

Я сейчас пока хожу по библиотечным модулям, и смотрю где что находится, что можно применить если писать своё приложение... Authentication, Integration, Time, SystemEvents, Service, Utils, Chat... Много всего есть, но как к этому подступиться...

Ещё вопрос: если подключаешь модуль к своему в REQUIRE, все классы, свойства, действия и формы в нём сразу становятся доступны? Т.е. какова область видимости идентификаторов в lsFusion, как она ограничивается?
   _DAle_
 
456 - 11.10.19 - 00:11
(455) Да, все именованные элементы системы (таким термином у нас объединяются все свойства, действия, формы, кклассы и т. д., имеющие имя, по которому к ним можно обратиться) становятся доступны. Способ доступа зависит от ситуации, либо просто по имени (name), либо если есть неоднозначность, используя явно пространство имен (namespace.name).

Подробности в этих статьях:
Именование https://documentation.lsfusion.org/pages/viewpage.action?pageId=35521066
Поиск https://documentation.lsfusion.org/pages/viewpage.action?pageId=3014689
   НиколаевГ
 
457 - 11.10.19 - 08:08
Ну ладно, ещё одна практическая задача - как вывести штрихкод в формате DataMatrix в шапку печатной формы документа?
   CrushBy
 
458 - 11.10.19 - 08:38
(457) В таких случаях берете google и пишете JasperReports DataMatrix
И находите кучу способов это сделать (например, при помощи barcode4j). Чего мы только не выводили на печатные формы...
   ДенисЧ
 
459 - 11.10.19 - 09:05
(458) У этих джасперов даже поиск на сайте не работает, так что пользоваться их продуктами не рекомендую.
   НиколаевГ
 
460 - 11.10.19 - 09:22
(458) То есть, опять надо гуглить и с явой разбираться? Вы бы сделали некоторую стандартную библиотеку, которую можно подключить при необходимости, для таких случаев.
 
 Рекламное место пустует
   Bro
 
461 - 11.10.19 - 09:50
(460) Нет для JasperReports java не нужна по сути. А если и нужна в сложных случаях то на уровне +, *, /, ==. Ну еще if, то есть a?b:c пригодится. И он встроен в платформу практически бесшовно (если бы ешл редактор еще под IDEA, а не под Eclipse был, вообще бы не отличили где заканчивается lsFusion и начинается JasperReports).
   Злопчинский
 
462 - 11.10.19 - 11:30
(454) Бяка страшная. Чтобы открыть (чужой) код и быстро _понять_ на общем что он делает - рекомендуется втыкать в код. сильно не нравится. что-то кардинально мешает написать
\\работа со списком клиентов для анализа платежеспособности.
.
это даже на уровне автосоставления документации помогало бы
   Flyd-s
 
463 - 11.10.19 - 11:35
У вас есть фреймворк по типу БСП, чтобы начать разработку не с нуля?
   Bro
 
464 - 11.10.19 - 11:42
(462) Не знаю мне часто приходится смотреть чужой код, и как раз по причине его лаконичности (то есть видно то что реально изменилось) мне это проще делать, чем смотреть на панель из сотни параметров и вкладок.

Плюс благодаря декларативности достаточно посмотреть на одно объявление (то есть одно событие или ограничение), а не пытаться в графе императивного кода понять что да как (а я в УТ смотрел многие вещи)

Ну и вопрос привычки, людям привыкших работать с кодом (Delphi, SAP, Axapta, Foxpro, Basic) и т.п. подход lsFusion привычнее, а значит удобнее.
   Bro
 
465 - 11.10.19 - 11:59
(463) БСП:

Администрирование и доступ пользователей.

Есть все.

Средства администрирования и обслуживания

Есть практически все:
Журналы, Интерпретатор, Настройки, Планировщик, Обновления, Профилировщик, Резервное копирование, Обслуживание

Сервисные подсистемы

Логирование, Групповая корректировка, Выгрузка / Печать из коробки. Из остального кое-что на прикладном уровне, кое чего нет.

Технологические механизмы и программные интерфейсы

Работа в модели сервиса есть. Остальное это какой -то микс из верхних пунктов. Из того что имеет смысл, что-то есть в платформе в Utils (вроде нумераторов), чего-то нет

Нормативно-справочная информация и классификаторы

Часть есть тут:
https://github.com/lsfusion/platform/tree/master/server/src/main/lsfusion/utils
Часть в ERP модулях:
https://github.com/lsfusion-solutions/erp/tree/master/erp-logics/src/main/lsfusion/masterdata

Интеграция с другими программами и подсистемами

Тут практически все есть (из того что нужно, зачем нужна OData, если есть прямой доступ через SQL и http неясно).
Почта, мессенджеры, СМС, http, EXTERNAL, INPUT, XML'и JSON'ф

Прикладные подсистемы и рабочие места пользователей

Здесь конечно часть есть (Чаты / Файлы), но всяких анкетирований естественно пока не делали.

Вообще можете зайти в демку hockeystats Администрирование, там конечно далеко не все из того что есть в платформе, но достаточно много.
   Flyd-s
 
466 - 11.10.19 - 12:22
(465), это в прикладном решении всё или платформе, где документация по платформе/решению?

>Часть есть тут: Часть в ERP модулях:
А смысл в них если у вас ERP коммерческий продукт с неопределенной стоимостью?

>Почта, мессенджеры, СМС, http, EXTERNAL, INPUT, XML'и JSON'ф
Наличие классов для разбора xml и то что сделано в БСП - совсем разные вещи
   Bro
 
467 - 11.10.19 - 12:50
(466) Все в платформе.

Что касается документации, то да тут к сожалению пока все не так звездно. Есть :
https://documentation.lsfusion.org/pages/viewpage.action?pageId=60555466
Но там только малая часть вещей описана и потоком сознания (разные люди делали и не те кто остальную документацию писали). Но все это в package utils. И все написано на lsFusion, соответственно как например с JDK (а lsFusion при этом высокоуровневее Java), чаще проще посмотреть по коду, чем читать текстовое описание (во всяком случае с Java я именно так делаю, там очень мало где реально нужны JavaDoc). Хотя как только utils жестко стабилизируется мы их сразу опишем детальнее.

>А смысл в них если у вас ERP коммерческий продукт с неопределенной стоимостью?
Ну masterdata действительно можно в платформу переместить, тут подумаем.

> Наличие классов для разбора xml и то что сделано в БСП - совсем разные вещи
Как раз разбор формирование xml в lsFusion сделан ОЧЕНЬ декларативно (тут даже JavaScript возможно отдыхает при работе с JSON). Но если поделитесь ссылкой, что вы имеете в виду под разбором XML в БСП, с удовольствием почитаю и напишу что и как с этим в lsFusion.
   Bro
 
468 - 11.10.19 - 12:51
(467) *Документации я имел в виду по пользовательской части БСП. Все остальное описано очень даже ничего.
   Ещё1
 
469 - 11.10.19 - 13:24
(467) Можно и без документации. Код в lsFusion очень лаконичен. Но тогда нужны комментарии в коде системных модулей. Ну и со строковыми константами... так себе решение. Мало того, что самим разработчикам системных модулей сложнее работать, так и читать сложнее. По мне, если сложно с английским языком, так лучше уже пусть писали бы на русском и комментарии, и строки. Если будет необходимость, лучше потом наймёте технических писателей со знанием языка, которые вам переведут эти модули. А русскоязычные сообщения сгрузите в ресурсный файл (или как там в Java).
   _DAle_
 
470 - 11.10.19 - 13:27
(469) В системных модулях, где сейчас есть интернационализация, необходимость уже есть, это уже в продакшене.
   Ещё1
 
471 - 11.10.19 - 13:56
(470) Ну не знаю, может вы ещё вернётесь к этому вопросу, с учётом открытия исходников платформы для публики. Исходные тексты программы должны писаться людьми для людей. Идентификаторы вместо строк - это нечто невероятное для меня, хотя может принято в среде Java. Возможно, вашим разработчикам пока не сложно в этом ориентироваться. Но если платформа + прикладные решения разрастутся со временем, без подробнейшей документации, почти без комментариев и с "зашифрованными" строками там не разберутся даже их создатели.

Также я не зря спрашивал про видимость идентификаторов. В lsFusion нет разделения на интерфейсную и имплементирующую часть (Delphi), или на отдельные файлы заголовков и реализации (как в С-подобных языках .h и .c), или объявления идентификатора доступным извне (ключевое слово Экспорт в 1С). Также свойства классов описываются на одном уровне видимости как сами классы (нет полной инкапсуляции как в любом ООП-языке). Поэтому при подключении модуля к своей программе в автодополнении сразу вываливается огромное число идентификаторов (свойства, классы и проч.), среди которых надо ориентироваться. Поэтому поначалу активно придётся заходить в модули платформы, и смотреть что там к чему.
   Ещё1
 
472 - 11.10.19 - 14:03
(471) > Идентификаторы вместо строк - это нечто невероятное для меня
Хотя вру конечно. В Delphi есть ресурсные строки resourcestring, чем-то напоминают то что в lsFusion. Но они описываются как константы вверху этого же модуля, можно Ctrl-Click и посмотреть значение. А при отладке - просто навести мышкой.
   Bro
 
473 - 11.10.19 - 14:16
>Ну не знаю, может вы ещё вернётесь к этому вопросу, с учётом открытия исходников платформы для публики. Исходные тексты программы должны писаться людьми для людей. Идентификаторы вместо строк - это нечто невероятное для меня, хотя может принято в среде Java. Возможно, вашим разработчикам пока не сложно в этом ориентироваться. Но если платформа + прикладные решения разрастутся со временем, без подробнейшей документации, почти без комментариев и с "зашифрованными" строками там не разберутся даже их создатели.

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

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

Вот тут не совсем понял. Вообще если известен контекст платформа дает то что реально может быть в этом месте, плюс приоритезирует некоторые варианты.

(472) CTRL+B тоже поддерживается, но тут недавно был такой баг, его пофиксили, не знаю попало в вашу версию или нет.
   Ещё1
 
474 - 11.10.19 - 14:43
(473) Про омонимы я понял. Но может, IDE могло бы при сохранении в ресурсный файл добавлять к строковой константе впереди имя модуля, тогда омонимы могли бы возникнуть только внутри модуля. Не знаю, можно ли сделать так. А внутри модуля одинаковые строки часто и должны совпадать, пример с system.lsf:
objectClassName '{system.object.class.name.object}' ...
prevObjectClassName '{system.object.class.name.object}' ...
Классы разные, а строка одна. Хотя непонятно что точно в ней написано.

> можно сделать чтобы сама IDE подсвечивала эти литералы переведенными значениями
Это несколько половинчатое решение. Потому что текст программы можно смотреть не только в IDE, но и в GitHub например. И желательно чтобы он был понятен сам по себе.

> Вообще если известен контекст платформа дает то что реально может быть в этом месте, плюс приоритезирует некоторые варианты.
Да, есть такое и это помогает. Но иногда по контексту может подходить и классы, и свойства. В ООП-языках ограничивается видимость свойств вне классов. Только в своём классе (либо в наследнике) можно писать свойства без квалификатора ("."). В принципе, конкретно с этим можно смириться, но на первых порах сложно.
   Ещё1
 
475 - 11.10.19 - 14:49
(474) Понимаете, надпись '{system.object.class.name.object}' не несёт никакой полезной нагрузки для программиста. Я и так вижу, что нахожусь в модуле system, в классе objectClassName. Она лишь занимает место, можно было бы с тем же успехом написать '{ID12345}'. И место меньше, и настолько же полезна.
   Bro
 
476 - 11.10.19 - 14:58
(474) Тогда будет обратная проблема, как в разных модулях одни и те же строки использовать.

>Это несколько половинчатое решение. Потому что текст программы можно смотреть не только в IDE, но и в GitHub например. И желательно чтобы он был понятен сам по себе.

В любом случае очевидного решения тут нет, поэтому мы пока использовали общепринятое. В принципе так как у большинства приложений задач интернационализации нет то и проблема не настолько критичная. Но да в будущем надо будет что-то придумать.
   Ещё1
 
477 - 11.10.19 - 15:19
(476) > в разных модулях одни и те же строки
Будут разные строки, что делать. Ну либо описать строковую константу в общем модуле и использовать её где нужно.
   Flyd-s
 
478 - 11.10.19 - 15:38
>Но если поделитесь ссылкой, что вы имеете в виду под разбором XML в БСП, с удовольствием почитаю и напишу что и как с этим в lsFusion.

Я про обмен в целом, а не про разбор XML в частности.
Что нужно чтобы организовать обмен данными между двумя базами Система1 и Система2?
1) Нужно понять что мы будем отправлять в Систему2. Обычно туда отправляются данные которые были созданы или изменены в Системе1. Для этих целей служит объект метаданных план обмена. В конфигураторе создается план обмена, в нем указываются объекты метаданных, которые нужно отправлять во вторую систему. В простом случае регистрируем всё, в более сложных пишем правила регистрации. При любом изменении данных будут фиксироваться изменения в плане обмена.
2) Нужно определиться со структурой XML, так чтобы одна система выгрузила объекты в определенной структуре, другая система прочитала XML и создала/обновила объекты у себя в системе. Для этого соответственно нужно написать код выгрузки и код для загрузки данных в двух системах. Вместо этого можно использовать конфигурацию конвертация данных, туда загружается структура метаданных двух систем и визуально настраивается соответствие объектов в двух системах и их ключевые поля + дополнительные обработчики, если они нужны. Полученные правила загружаются в БСП. Какой-то код писать не требуется.
3) Система1 должна передать файл Системе2, положив файлик куда-то или отправив на почту или подключившись напрямую к Системе2. Для этого в БСП можно задать настройки транспорта, где указать как будут отправляться сообщения между базами.
4) Нужно задать расписание обменов, чтобы данные оперативно обновлялись без участия пользователя. Для этого нужен какой-то планировщик заданий и монитор обмена. Это берет на себя БСП.
5) Если система2 не получила сообщение или не смогла его обработать, то Система1 должна отправить сообщение повторно, пока не получит подтверждение от второй системы, что сообщение получено и обработано. В этом случае в системе1 объект снимается с регистрации в плане обмена. Это тоже берет на себя БСП.
   Ещё1
 
479 - 11.10.19 - 22:45
(473) > CTRL+B тоже поддерживается, но тут недавно был такой баг, его пофиксили, не знаю попало в вашу версию или нет.
Обновил IDEA с плагинами. Ctrl-B на ресурсных строках заработало, спасибо. По-русски конечно ничего не понять (chat.edit.message=\u0420\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435), но по-английски всё читаемо (chat.edit.message=Edit message).
   Ещё1
 
480 - 11.10.19 - 23:09
Объясните, чем отличаются lsfusion-server-2.0-sources.jar от lsfusion-server-2.0.jar ?
Предположу, что один нужен для отладки, а 2-й для развёртывания. Но где какой?
   Ещё1
 
481 - 12.10.19 - 00:04
Всё ещё не понимаю до конца некоторых концепций языка lsFusion. Проект CRM, модуль Chat, вначале описаны:
CLASS Chat '{chat.chat}';
TABLE chat(Chat);
Нажимаю на таблице chat, Find Usages --> No usages found in Project Files.
Тогда в чём смысл этой дефиниции, почему нельзя было обойтись классом Chat?
   Bro
 
482 - 12.10.19 - 11:13
1. В lsFusion для этого используются события:
WHEN CHANGED f(a) DO
    send(a) <- TRUE;
2. Для этого просто создается форма, которую можно использовать как для приема (импорта), так и для отсылки (экспорта):
FORM a
   OBJECTS a=A
   PROPERTIES f(a)
;
Плюс по этой форме можно сформировать XML, а как следствие XSD. Ну и наоборот по любому XSD, XML и JSON можно сгенерировать форму.
3. Оператор EXTERNAL, ну и любое действие можно вызвать http запросом.
4. Планировщик и лог планировщика.
5. Тут достаточно простой архитектурный паттерн:
EXPORT myForm
EXTERNAL HTTP ...;
exported(a) <- TRUE;
Если падает EXTERNAL то exported не записывается, и соответственно будет следующая попытка планировщика.

Но вообще нужно понимать что такое современные интеграции. Это в 99% http запрос (если не считать прямого доступа через SQL), в 99% из которых в порядке убывания JSON, XML, CSV. И интеграции чаще вертикальные, чем горизонтальные (то есть база <-> сайт / сервис, а не база <-> база). То есть такие обмены (понятно что с более сложными формами):
https://documentation.lsfusion.org/pages/viewpage.action?pageId=55935068
Покрывают практически все интеграции.

На самом деле были попытки настроить абстракции наверх, но при том уровне декларативности что есть в lsFusion, это сократит количество действий максимум на 30%, но при этом создаст еще один уровень абстракции, который придется учить, и тем самым увеличит порог вхождения.
   Bro
 
483 - 12.10.19 - 11:24
(479) Мы тут не при чем. Это к IDEA: Project->Settings в поиске набираете File Encodings и там UTF-8 ставите.
(480) -sources это просто исходники. Нужны чисто для отладки в IDEA (соответственно если нет необходимости идти внутрь платформы, то не нужны)
(481) Если явно не задать таблицу, она сама создаться с именем _auto_chat. Их часто явно создают. Для чего, сложно сказать, вообще как я понимаю так, чтобы таблица без префикса была.
   Ещё1
 
484 - 12.10.19 - 11:55
(482) Сайт documentation.lsfusion.org всё?
https://lsfusion.org пока работает.
   Flyd-s
 
485 - 12.10.19 - 12:01
(482),
2. Если в обмене участвуют 30 объектов - нужно создавать 30 форм, нужно ли их генерировать в двух базах сразу, нужно ли описывать соответствие полей, ключевых полей кодом?

>Это в 99% http запрос
Чаще через файлы видел.
Сайт с документацией лежит
   Bro
 
486 - 12.10.19 - 12:06
(485) Нет, делайте одну форму и 30 объектов туда. В принципе если вы делаете обмен между двумя одинаковыми базами, то у вас там одна кодовая база. Если между разными можно код формы скопировать, ну и подправить, чуток. Но я не совсем понимаю про какой кейс вы говорите, про РИБ?

(485) А я его уже давно не видели. Только если с каким-то древним софтом (ну и бухгалтерией). Даже с 1С уже чаще через http запросы интегрируемся.

documentation смотрим, там что-то со всей виртуалкой похоже.
   Ещё1
 
487 - 12.10.19 - 12:06
(483) > File Encodings и там UTF-8 ставите
Поставил везде UTF-8, для ServerResourceBundle_ru.properties не помогает. Ну и ладно, по-английски понятно.
> Если явно не задать таблицу, она сама создаться с именем _auto_chat.
Я так и предполагал. Может, так проще найти таблицу в PostgreSQL вручную. Но строчка не обязательна, OK.
   Ещё1
 
488 - 12.10.19 - 12:11
(486) Может, потом закинете документацию по языку и платформе lsFusion на GitHub?
   Bro
 
489 - 12.10.19 - 12:35
(488) Вот тут все не так просто. Мы бы давно отказались от этого, даже не знаю какое слово подобрать, confluence, но мы используем функционал, в котором примеры embed'ся прямо из исходников, на том же гитхаб. А у гитхаб pages такого функционала нет.

Конечно нам это было важно, когда мы постоянно что-то меняли в языке с нарушением обратной совместимости (мы бы тогда убились бы следить за документацией). Но даже сейчас проверки ошибок в документации + подсветка синтаксиса - важный функционал, от которого не хочется отказываться.
   Asmody
 
490 - 12.10.19 - 12:53
Что-то я не нашёл, или пропустил, как сделать список или массив?
И ещё. Допустим, у меня десяток однотипных полей, и мне надо на них ограничения повесить. Как не переписывать условие 10 раз?
   Asmody
 
491 - 12.10.19 - 12:55
Еще не нашёл как задать дефолтные значения реквизитов
   CrushBy
 
492 - 12.10.19 - 12:58
(490) Не очень понимаю, о каких именно ограничениях идет речь, но, как минимум есть вариант мета-кодов :
META defineMyConstraint(field)
    CONSTRAINT field(MyClass o) > 5 MESSAGE 'Нельзя больше 5';
END

@defineMyConstraint(field1);
@defineMyConstraint(field2);
@defineMyConstraint(field3);
   Bro
 
493 - 12.10.19 - 13:01
(490) Список / массив это частный случай функции (свойства) от числа. Тут пример (внизу раздела про первичные свойства)
https://habr.com/ru/company/lsfusion/blog/458376/#data
(491)
f(a) <- 'ddd' WHEN SET(a IS A);
Вообще можно было бы, как и NONULL / DELETE сделать синтаксический сахар (DEFAULT 5), но логика значений по умолчанию обычно более гибкая (чем проверка на заполненность). Хотя если честно не помню почему не сделали (хотя тут пару часов работы).
   CrushBy
 
494 - 12.10.19 - 13:01
(491) Есть два варианта событий :

WHEN LOCAL SET(MyClass o IS MyClass) DO { // событие когда создался объект
    field1(o) <- 5;
    field2(o) <- 3;
}

Второй вариант :
field1(MyClass o) <- 5 WHEN SET(o IS MyClass);

Если нужно дефолтное проставить в зависимости от других свойств, то делается, например, так :

WHEN LOCAL CHANGED(stock(Order o)) DO {
   myField(o) <- defaultMyFieldValue(stock(o));
}
То есть при изменении склада для заказа проставлять поле из заказа. Ну и вообще так любое выражение можно использовать.
   Asmody
 
495 - 12.10.19 - 13:20
(493) какой-нибудь DEFAULT (TODAY()) вдоль и поперёк же!
   Asmody
 
496 - 12.10.19 - 13:27
(493) "Список / массив это частный случай функции (свойства) от числа"
Интересная точка зрения. Но это не то, что я имел в виду.
Мне нужен список значений.
Я хочу туда натыкать объектов, показать пользователю, построить фильтр типа "реквизит в списке" и т.д.
   Dzenn
 
497 - 12.10.19 - 16:11
(5) Дата локал лонг лонг лонг - звучит как рэп ;-)
   Михаил Иванович
 
498 - 12.10.19 - 16:16
(486) Хорошо, пусть будет РИБ. Как у вас дела с РИБом? С настройкой обмена с ним?
   CrushBy
 
499 - 12.10.19 - 16:32
(495) Тут просто особо других случаев для значения по умолчания (кроме подставления текущей даты) особо и не придумывается. А делать под очень частный случай целое ключевое слово - спорное решение. Тем более можно легко создать метакод под это. Но в целом может и сделаем.

(496) Для этого есть понятие статических объектов :
https://documentation.lsfusion.org/pages/viewpage.action?pageId=3014726

Суть в том, что в коде к любому классу можно добавить "статический" объект к которому можно обращаться. У статического объекта будут автоматически заполнены два свойства (staticName и staticCaption) куда будут записаны соответствующие значения из кода.

Но в целом статический объект по поведению ничем не отличается от объекта, добавленого пользователем вручную. Логически список значений - это набор объектов одного класса.
   CrushBy
 
500 - 12.10.19 - 16:35
(498) Обычно обмены делаем по принципу, который был описан выше :
https://documentation.lsfusion.org/pages/viewpage.action?pageId=55935068

Автоматической генерации такой логики по метаданным пока нет. К сожалению, пока не было потребности. Всем клиентам все ставим централизованно в одну базу. Вот, например, у нас есть клиент Остров Чистоты. Там около 500 магазинов по деревням и селам : https://ostrov-chistoty.by/magaziny
Все они сидят в одной базе (кто-то на ADSL, кто-то на 3G). А там где нету ни ADSL, ни 3G и магазинов тоже нет :)

Если будет такая потребность, то возможно сделаем какой-то универсальный механизм.
  1  2  3  4  5  6  7  8  9  10  11   

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.