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

Конкретные вопросы по lsFusion. Часть 2.

Конкретные вопросы по lsFusion. Часть 2.
Я
   CrushBy
 
14.10.19 - 21:08
В этой ветке только вопросы по lsFusion, без оценок и срача, что в сторону lsFusion, что в сторону 1С.

Для сравнения и троллинга есть отдельная ветка : OFF: lsFusion vs 1C. Раунд 3
 
 
   PR
 
101 - 15.10.19 - 02:59
(100) >>во время интерпретации создаем jvm объекты
>>мы создавали свойства, классы, формы (я тут использую именно понятия из нашей терминологии) с помощью кода на java
А как это сами создаете?
Разве java-машина не обрабатывает только готовый код?
Или у вас обертка на java как раз и содержит этот готовый код?

>>Вообще, на мой взгляд, язык в платформе - не главное, главное - это совокупность тех подходов (концепций, парадигмы, можно как угодно это называть), которые мы используем, и какие плюсы и минусы она в результате приносит
Про что речь? В двух словах на паре примеров.
   Михаил Иванович
 
102 - 15.10.19 - 03:08
ЕГАИС нет, так и запишем.
Что с маркировкой табака?
   _DAle_
 
103 - 15.10.19 - 03:26
(101) Отвечу на первую половину вопроса и пойду спать.

Мы что-то, похоже, уже не поняли друг друга. Я не зря написал, что под свойствами, классами и формами я подразумеваю понятия из нашей терминологии, а не из терминологии java. Я пример приведу. Сейчас мы пишем, например:

CLASS Item : AbstractItem;
name = DATA STRING (Item);

Это очень простой код, первой строкой мы объяыляем класс Item, который наследуется от класса AbstractItem. Второй строкой объявляем свойство - имя объекта класса Item. Теперь пофантазируем, как можно было бы написать этот код на java:

Class Item = new Class('Item', findClass('AbstractItem'));
Property name = new DataProperty('name', SystemClass.String, Item);

Вот было бы как-то так примерно. Проблема здесь даже не столько в громоздкости (а я напомню, что мы взяли совсем примитивный пример, где выигрыша почти нет) и низкоуровневости полученного кода, а в том, что имена нового свойства и класса задаются строковым литералом.. В результате мы получим, что у нас нет ожидаемых плюсов от использования уже готовых механизмов для анализа джава-кода. Потому что как мы, например, будем искать в коде все использования свойства name? Полнотекстовым поиском? Как переименовать это свойство, чтобы переименовались и все его использования? И т.д. То есть все равно для удобства нужно писать какой-то плагин, который будет каким-то образом трактовать эти строковые литералы как нечто большее. Так почему бы тогда не сделать свой язык с блек-джеком, который будет максимально близок к используемым концепциям?
   Конструктор1С
 
104 - 15.10.19 - 06:29
(82) есть такая штука - JetBrains MPS. Это платформа для создания собственнях предметно-ориентированных языков программирования (DSL). Твой ЯП сразу сможет использовать Intelij IDEA в качестве редактора кода.

Вот пример, как эта штуковина может использоваться
https://habr.com/ru/company/jetbrains/blog/180723/

Ребяты постарались, и изобрели свой DSL с блэкджеком и шлюхами. Только вот непонятно, на что ориентируется этот их как бы предметно-ориентированный язык. Казалось бы, бизнес-платформа должна "говорить" на бизнес-языке, но ничего подобного там нет. Оно и не SQL, оно и не си-подобный язык, оно и не бизнес-язык, а воплощение каких-то фантазий авторов. Для сравнения, 1С тоже имеет свой DSL, и он вовсю оперирует бизнес-сущностями: документ, справочник, реквизит, регистр, задача, отчет и многие другие.
   НиколаевГ
 
105 - 15.10.19 - 07:50
Всё-таки про "регистры сведений" в фузине осталось непонятно: Как определяется уникальность записи регистра? Нужно самому прописывать набор полей, по которым должна быть уникальность? И останется ли идентификатор записи тем-же, если вставить запись с таким-же набором полей уникальности?
   CrushBy
 
106 - 15.10.19 - 10:28
(105) Формально могут быть две записи в регистре с абсолютно одинаковыми наборами всех полей. За исключением одного - внутреннего идентификатора объекта (так как все записи регистра - это объекты, которые реализуют "интерфейс" регистра). Он глобально уникален в рамках всей системы. Соответственно при подсчете той же цены :

price 'Цена' (Stock stock, SKU sku, DATETIME dateTime) =
    GROUP LAST price(PriceLedger l)
          ORDER dateTime(l), l
          WHERE posted(l) AND dateTime(l) <= dateTime
          BY stock(l), sku(l);

В ORDER вторым параметром идет сам объект l. То есть, если совпадут stock, sku и datetime, то дальше приоритет будет выбираться по внутреннему идентификатору объекта.
   Ещё1
 
107 - 15.10.19 - 11:07
(106) Мне кажется, это не совсем правильно. В один момент времени на один товар на указанном складе должна быть установлена единственная цена. И она не должна зависеть от внутренней сортировки идентификаторов регистра или ещё какой-то внутренней кухни БД. При попытке записи ещё 1 цены с тем же датой/временем система должна давать ошибку, как в 1С. Посмотрите в 1С УТ - Регистр сведений - ЦеныНоменклатуры.

Поэтому вопрос: как сделать так, чтобы в PriceLedger по любому набору измерений регистра (в вашем примере набор из DATETIME, Stock, SKU) существовало не более 1 записи в регистре? В 1С эти свойства называются измерениями регистра (или ключевыми полями). есть ещё ресурсы и реквизиты http://1s-manual.ru/registry-svedenij-1s/#izmerenija-resursy-rekvizity
   НиколаевГ
 
108 - 15.10.19 - 11:12
(106) Внезапно... А как сделать поведение, аналогичное регистру сведений в 1С?
   _DAle_
 
109 - 15.10.19 - 11:17
(104) Мы, кстати, не использовали MPS. У нас в качестве рантайм парсера используется ANTLR (ведь сервер должен стартовать и без IDEA), а для плагина использовали grammar-kit от JetBrains. Я в последнее время не следил за MPS, но в то время, когда я его рассматривал, мне казалось, что MPS нужен для еще более сложной задачи. Это такое средство быстрых построений DSL-ей на любую прихоть. То есть понадобился тебе какой-нибудь xml-подобный язык со своими фишками, быстро наваял DSL, понадобилось обработать какой-нибудь конфигурационный файл - наваял другой DSL. И потом все это радостно и весело работает вместе. У нас задача в этом контексте была, в принципе, попроще - реализовать всего один DSL.
   Ещё1
 
110 - 15.10.19 - 11:31
(107) Более того, в 1С можно выставить периодичность записи в регистре сведений. Если периодичность установлена "в пределах дня", то в течение этого дня на этот товар на этом складе цену можно поменять только 1 раз. Это для периодических регистров сведений, есть же ещё и непериодические.
А есть и регистры накопления, и там свои бизнес-ориентированные вкусняшки добавлены. Отличие регистра сведений от оборотного регистра накоплений
   CrushBy
 
111 - 15.10.19 - 11:41
(107) Всегда можно добавить ограничение типа :
CONSTRAINT (GROUP SUM 1 BY sku(PriceListLedger l), stock(l), dateTime(l)) > 1 MESSAGE 'Несколько записей с одинаковыми ключевыми полями';

Другое дело, что не очень понятно зачем это надо ? Просто, чтобы проверить, что пользователь не ошибся и случайно не ввел один документ дважды ?

(110) Точно также можете сделать, просто в регистре делайте не DATETIME, а DATE. Ну или другой тип (вроде Week, Month) или что-то другое.
   Ещё1
 
112 - 15.10.19 - 11:55
(111) Всё верно, нужно ограничение через CONSTRAINT. И тогда в
ORDER dateTime(l), l
2-й параметр не нужен, потому что повторов точно не будет.

> в регистре делайте не DATETIME, а DATE.
Нет, там обязан быть DATETIME = дате/времени проведения документа, который добавил эту запись. В терминах 1С этот документ называется "Регистратор". Другое дело, что CONSTRAINT должен тогда выглядеть по-другому:
CONSTRAINT (GROUP SUM 1 BY sku(PriceListLedger l), stock(l), toDate(dateTime(l))) > 1 MESSAGE 'В течение дня цену товара можно поменять не более 1 раза';

А так как периодичность регистра сведений в общем случае может быть разная - в пределах секунды/дня/месяца/квартала/года, а также по позиции регистратора (т.е. просто DATETIME) и вообще непериодический, то на каждый случай должен быть заготовлен свой CONSTRAINT.

И если вы продвигаете свою идею 1С-никам, им нужны методические рекомендации, как сделать регистр сведений или накопления на платформе lsFusion на все случаи жизни.
   _DAle_
 
113 - 15.10.19 - 12:40
(101) Ну и задачку вы подкинули :) В двух словах на паре примеров.. Честно говоря, даже на мисте уже столько раз эти примеры приводились. Ну ок, пара частных примеров:

1. Платформа позволяет в любой момент материализовать любой вычисляемый показатель. То есть, у вас есть некоторое вычисляемое значение, вы указываете системе (с помощью опции MATERIALIZED), что теперь это значение будет не вычисляться, а храниться в базе (можно назвать это кешированием или мемоизацией). Это снизит сложность запросов и уменьшит скорость чтения данных. При этом платформа будет сама обновлять эти значения в базе, при изменении каких-то показателей, участвующих в вычислении. Это соответственно уменьшит уже скорость записи в базу. В результате эта функциональность позволяет вам довольно прозрачно находить баланс между производительностью получения данных и записью данных. Без переписывания множества запросов, в которых этот вычисляемый показатель участвует.

Это подробно разбирается вот в этой статье на хабре https://habr.com/ru/company/lsfusion/blog/459066/. Единственный момент в том, что эта статья была написана одной из первых и оперирует не столько терминологией lsfusion, сколько общепринятой. Например, наши свойства там называются функциями.

2. Модульность и расширяемость. Плюсом от того, что у нас нет ООП-инкапсуляции в плане "объединения данных и методов работы с ними", мы получаем довольно мощные возможности для расширения существующей функциональности без внесения изменений (либо с минимальными изменениями) в существующий код. Если вкратце, то мы, например:
  a) Можем расширять класс новой функциональностью, не только добавляя новые свойства, но и наследуя его от другого класса. Это возможно из-за открытости классов (отдаленно это похоже на открытые классы в ruby) и наличие множественного наследования.
  b) Можем расширять наши интерактивные формы
  с) Можем создавать свою реализацию для существующих абстрактных свойств и действий (по сути это полиморфизм, причем по любому параметру, являющемуся объектом пользовательского класса).
Это довольно обширная тема, по которой тоже есть статья на хабре с примерами: https://habr.com/ru/company/lsfusion/blog/461983/.
   Ещё1
 
114 - 15.10.19 - 12:51
Не нашёл, как задавать округление и разрядность у вычисляемых свойств. На примере, есть:
quantity 'Кол-во' = DATA NUMERIC[15,3] (Order, Good);
price 'Цена' = DATA NUMERIC[10,2] (Order, Good);
Хочу создать вычисляемое свойство amount с разрядностью и числом знаков после запятой как у price, т.е. NUMERIC[10,2].
amount 'Сумма' = quantity(Order o, Good g) * price(o, g);
По факту не IDE показывает, что это свойство будет NUMERIC[25,5] Но мне не нужна такая разрядность и высокая точность.
   НиколаевГ
 
115 - 15.10.19 - 12:53
(111) В 1С ещё можно, чтобы не ошибка выдавалась, а запись(и) просто замещались другими, с тем-же набором измерений, но с другими ресурсами/реквизитами. Вот так хочется.
   DTX 4th
 
116 - 15.10.19 - 13:15
На (49) ответьте плз
   _DAle_
 
117 - 15.10.19 - 13:56
(114) Преобразование типа: https://documentation.lsfusion.org/pages/viewpage.action?pageId=13860869

amount 'Сумма' = NUMERIC[10,2](quantity(Order o, Good g) * price(o, g));
   Ещё1
 
118 - 15.10.19 - 14:23
(117) Да, спасибо, уже нашёл. Не описано только как происходит округление, по арифметическим правилам (т.е. к ближайшему)?

Замечание по IDEA: внутри мета-кода (инструкция META) не работают переходы на определение класса и проч. плюшки. Когда мета-код небольшой, то ладно. А как в ERP, в файле Order.lsf, META defineOrder занимает с десяток экранов, то уже и не очень удобно.
   CrushBy
 
119 - 15.10.19 - 14:25
(49) Нет. Объявите один раз такую форму и используйте ее везде, где захотите. Или я не очень понимаю вопрос. Если можно, то какой-то конкретный пример.
   Злопчинский
 
120 - 15.10.19 - 14:34
(89) "desktop - Swing,"
- тут ваши коллеги сказали что в свинге нет возможности сделать "многострочную строку", наши коллеги скали что в свинге - есть такое. непонятно.
   Злопчинский
 
121 - 15.10.19 - 14:43
(119) конкретный пример.
нужен код, который будет программно вызываться из других мест, в этом коде на входе - конкретная организация, конкретный склад. На выходе - список товаров для этой организации для этого склада. код предполагается использовать без визуализации. получившийся итог выполнения кода - в совершенно другом модуле\коде\форме может быть обработан дополнительным способом (например показан пользователю, который поставит галочки и пнет на печать отмеченные или другому пользователю в другой форме\модуле будет показан список особым образом - начинающиеся на гласные слева окошко, на гласные - справа окошко).
   CrushBy
 
122 - 15.10.19 - 15:00
(121) Еще раз повторюсь. В lsFusion, функции (или свойства) - это не императивные функции, которые выполняются и что-то возвращают как результат выполнения. Они задают логику. Поэтому сравнивать тут не совсем корректно. Вы просто строите свойство in (Organization, Stock, Item) = ... . А потом можете, где угодно делать FILTERS (в формах или отчетах) по нему, или FOR для итерирования по всем товарам в действиях.
   Мэс33
 
123 - 15.10.19 - 15:28
Как дело обстоит в фузине с реструктуризацией бд? Как происходит допустим изменение типа поля и его длины?
   CrushBy
 
124 - 15.10.19 - 15:41
(123) Через ALTER TABLE. Соответственно, поведет себя так же, как и PostgreSQL. Например, сконвертирует число в строку без проблем. В обратную сторону только, если значения конвертируются. Иначе будет ошибка, и служба не запустится.
   DTX 4th
 
125 - 15.10.19 - 15:59
(Организация, Склад, Товар)

Мне в каждой форме надо выводить
[1c]Количество на складах из списка (Склад1, Склад2, Склад3) товаров с группой "Обувь", у которых в наименовании есть буква "а" и длина наименования кратна двум
[/1c]

Как это лучше реализовать?


Я честно даже зашёл на сайт, хотел скачать, но 2.6гб и 4 тулзы на мой комп для теста - ту мач.
   CrushBy
 
126 - 15.10.19 - 16:34
(125) Ну создайте свойство :

inMyList (Item i) = (balance(i, stock(1)) OR balance(i, stock(2)) OR balance(i, stock(3))) AND hasParent(i, group('Обувь')) AND name(i) LIKE '%a%' AND mod(charLength(name(i)),2) = 0;

И дальше используйте на любой форме :
EXTEND FORM ...
   OBJECTS i = Item
   PROPERTIES(i) READONLY name
   FILTERS inMyList(i)
;
   DTX 4th
 
127 - 15.10.19 - 16:58
Эдакая функциональная система для автоматизация учета получается
Достаточно упорото, но идея интересная

Если бы не такой язык программирования, я бы даже скачал попробовать.
CAPS LOCK сажает моё зрение
Хочется фигурных скобочек и Fluent interface
   Ещё1
 
128 - 15.10.19 - 17:09
В экранной форме, можно ли разложить свойства одного объекта на 2 отдельные панели? На примере:
FORM OrderForm 'Заказ'
  OBJECTS o = Order PANEL // Верхняя панель
  PROPERTIES(o) no, date //,...

  OBJECTS od = OrderDetail // Таблица посередине
  PROPERTIES(od) no //...
  FILTERS order(od) == o

  PROPERTIES(o) 'Общая сумма заказа: ' = amount // Нижняя панель
;
По факту все свойства объекта o сливаются в верхней панели.
   _DAle_
 
129 - 15.10.19 - 17:19
(127) Заверяю, если мы сделаем для вас fluent interface с фигурными скобочками на java (да хоть на kotlin), вам будет намного менее удобно, чем писать на lsfusion, мы то уже это проходили годы назад.
   CrushBy
 
130 - 15.10.19 - 17:21
(128) Дальше уже через DESIGN. Просто само объявление FORM генерирует определенный автоматический дизайн, который уже можно настраивать как угодно уже вручную.

DESIGN OrderForm {
     container {
         MOVE PROPERTY(amount(o));
     }
}

Там в статье про IDE есть GIF с настройкой дизайна :
https://habrastorage.org/webt/rw/tx/oh/rwtxohoulxz_m_yqhqxqiioaqfq.gif
 
 Рекламное место пустует
   Ещё1
 
131 - 15.10.19 - 18:10
(130) Ага, спасибо. Думал тут без DESIGN обойдётся, но можно и так.

Тогда ещё вопрос: как заменить стандартный заголовок HTML-страницы клиента с "lsfusion" на что-то своё?
   Bro
 
132 - 15.10.19 - 18:17
(131) Да, мне тоже интересно, а то тут https://demo.lsfusion.org/mm/ кто-то поменял, а я не могу сообразить где. CrushBy?
   CrushBy
 
133 - 15.10.19 - 18:21
(132) Администрирование / Настройки

Там можно поменять иконки, заголовки и прочее.
   CrushBy
 
134 - 15.10.19 - 18:22
(133) Только перезапуск томката есть подозрение, что требуется, так как кэшируется
   Конструктор1С
 
135 - 15.10.19 - 19:11
(132) так больше идет
   Ещё1
 
136 - 15.10.19 - 19:12
(133) Вот здесь как я понимаю: https://paste.pics/6YUKC
Поменял, перезапустил компьютер, заголовок окна не поменялся. Наверное где-то как-то надо почистить кэш Apache.
А где лучше поместить код в программе, чтобы он точно выполнился при запуске сервера?
WHEN ??? DO
  System.displayName <- 'Заголовок окна';
   Ещё1
 
137 - 15.10.19 - 20:44
(136) После очередного перезапуска компьютера заголовок в браузере поменялся. Ну, ладно.
   Ещё1
 
138 - 15.10.19 - 20:56
(136) > где лучше поместить код в программе, чтобы он точно выполнился при запуске сервера?
Сам спросил - сам ответил:
onStarted() + {
  displayName() <- 'Система заказов My Order';
}
   Bro
 
139 - 15.10.19 - 21:04
(138) Как вы это нашли? Этого же вроде в документации нет (не совсем пока понятно куда поместить).
   CrushBy
 
140 - 15.10.19 - 21:08
(138) displayName - это же первичное (DATA) свойство, которое хранится в базе. Его нет смысла записывать на каждом запуске сервера.
   Ещё1
 
141 - 15.10.19 - 21:22
(139) Покопался в System.lsf
(140) OK тогда мне надо как-то в программе отловить момент чистой установки, и сделать начальные настройки. Подправить displayName, завести пользователей в систему с правами, заполнить некоторые справочники и т.п. Я знаю, можно через запуск скрипта в Administration, но хотелось бы в виде lsf-модуля начальной настройки в программе.
   CrushBy
 
142 - 15.10.19 - 21:32
(141) Тогда да, через можно через onStarted. Только он будет срабатывать каждый раз при запуске сервера. Логичнее тогда делать так :

initialized = DATA BOOLEAN ();

onStarted()+ {
    IF NOT initialized() THEN {
        ....
        initialized() <- TRUE;
    }
}
   Ещё1
 
143 - 15.10.19 - 21:55
(142) Элементарно!
   Ещё1
 
144 - 15.10.19 - 22:30
Bro как-то писал, что можно переключить режим открытия форм, чтобы пользователь не открывал множество одинаковых. Как в демке ERP. Не могу найти.
   Ещё1
 
145 - 16.10.19 - 19:21
> currentAuthToken = NATIVE TEXT();
Что значит ключевое слово NATIVE? В документации нет описания.
   Bro
 
146 - 16.10.19 - 20:36
(145) Это свойства (и несколько других элементов), значения которых контролируются самой платформой. По аналогии с другими языками, например native hashCode в Java. Их на самом деле всего 7 в системных модулях, разработчик их создавать не может, поэтому и не описаны.
(144) В Security.lsf свойство forbidDuplicateForms (открывать форму один раз). Там оно для роли и пользователя может задаваться. В форме Администрирование -> Политика Безопасности
   Ещё1
 
147 - 16.10.19 - 21:23
(146) Лучше описать, хоть 1 строчкой. Чтобы не было вопросов.
forbidDuplicateForms нашёл, спасибо.
   Ещё1
 
148 - 16.10.19 - 22:02
Вопрос по Web-клиенту. Допустим, в приложении будет 1 главная форма. Получается, для простого пользователя полоска вверху со значками и полоса слева не нужны. Можно ли как-то оставить только рабочий стол с 1 формой, запускаемой автоматически при входе в клиент?
   Ещё1
 
149 - 16.10.19 - 22:16
(148) Как автоматически открывать форму при запуске Web-клиента разобрался.
onWebClientStarted() + {
  NEWSESSION EVAL 'run() \{ SHOW OrderForm NOWAIT; \};';
}
Остаётся вопрос можно ли убрать лишние элементы.
   CrushBy
 
150 - 17.10.19 - 10:19
(149) Это делается настройками (код не нужен) :
https://clip2net.com/s/447Ib8I

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

Дальше пользователей вяжете к ролям и при их логине все лишнее должно скрыться.
   Bro
 
151 - 17.10.19 - 10:23
(149) А зачем вы EVAL делали? Кстати в 3 версии NOWAIT не надо, она сама догадается, можно делать просто NEWSESSION SHOW OrderForm;
   Ещё1
 
152 - 17.10.19 - 11:07
(150) Ага, я это видел, но не понял механизма как это работает.
А можно сделать так, чтобы кладовщикам открывалась одна форма по умолчанию, а скажем менеджерам - своя форма?
(151) Это я где-то скопировал и подстроил под себя. OK.
   CrushBy
 
153 - 17.10.19 - 11:40
(152) Да, конечно. Принцип простой : пользователи привязываете к ролям (там в форме редактирования пользователя есть главная роль). В зависимости от этой роли и открываются нужные форму (циферки внизу зависят от выбранной вверху роли).
   Ещё1
 
154 - 17.10.19 - 12:25
(153) Ага, т.е. настройки в нижней таблице с деревом навигатора показывают настройки для выбранной роли в верхнем списке. В данном случае, для менеджера по расчётам сразу откроется 3 окна: Склад, Внутренние заказы и Выписка накладных.

Система прав доступа очень навороченная и настраиваемая. У меня много вопросов ней, неплохо бы отразить в документации.
- По-умолчанию в новом приложении нет ролей, значит все пользователи имеют доступ ко всем элементам приложения?
- Я добавил роли (admins, operators), но нижнее дерево с элементами навигатора пустое. Хотя у меня есть 1 форма, которая выводится в верхней панели приложения (там где со значками). Кроме моей формы, там по-умолчанию уже есть Master Data, Administration, Chat и Account. Раз они там есть, по идее доступ к ним тоже должен задаваться через Security Policy. А значит, нижняя таблица со списком элементов навигатора должна содержать все эти элементы.
- Как убрать модуль Chat из приложения?
- Нужно описание всех настроек для ролей. Например, Forbid all navigator elements - я предполагаю, что оно полностью отключает доступ ко всем элементам навигатора в верхней панели приложения. И тогда для этой роли доступ к конкретным элементам можно открыть через нижний список элементов навигатора, поставив в соотв. строке птичку Разрешить. Правильно?
- Что значат каждая из Дополнительных политик безопасности (Custom policy), и как их использовать.
   CrushBy
 
155 - 17.10.19 - 15:04
(154) Да, там будет 3 формы открыто по умолчанию, а навигатор будет свернут

- По-умолчанию, ролей нет. Любому пользователю доступно все.
- Нижняя таблица должна содержать все элементы. Запись этой таблицы в базу идет в момент запуска сервера (там идут процессы синхронизации). Синхронизация не будет запущена, если в Edit configuration стоит Light start. Но если этой галочки нету и сервер запустился целиком (в stdout есть successfully started), то должно все появлятся.
- Не подключать модуль Chat. Или политикой безопасности. По-умолчанию, подключаются абсолютно все lsf, которые будут найдены в classpath при старте. Этим можно управлять, если добавить в settings.properties строку
logics.topModule = MyModule
Тогда будут использоваться только те модули, от которых зависит MyModule. Например, вот topModule для ERP :
https://github.com/lsfusion-solutions/erp/blob/master/erp-logics/src/main/lsfusion/ErpDefault.lsf

Кстати, в settings.properties можно также добавить :
user.setTimezone=Europe/Minsk
user.setLanguage=ru
user.setCountry=RU

Тогда все будет на русском. Вообще про параметры запуска можно вот здесь почитать :
https://documentation.lsfusion.org/pages/viewpage.action?pageId=65241244

- Да, правильно.
- Дополнительные политики безопасности нужны, чтобы задавать политики, которые задаются в Java коде. Пока этим можно не загоняться.
   Ещё1
 
156 - 17.10.19 - 16:37
(155) Снятие галки Light Start помогло, таблица Navigator element теперь содержит всё.

Модуль Chat я специально не подключал в своих модулях LSF приложения. Трюк с logics.topModule сработал. user.setTimezone тоже.
   Ещё1
 
157 - 22.10.19 - 17:23
Как добавить кнопку-действие на форме внизу под таблицей, рядом с Добавить и Удалить?
Кнопка должна быть видна только при определённом условии. Вроде должно быть несложно, но не могу найти похожий пример в How To. Вот набросок кода:

setOrderStatus 'Отправить' (Order order, Status status) {
  status(order) <- status;
}

FORM ordersForm 'Заказы покупателей'
  OBJECTS o = Order
  //...
  PROPERTIES(o) setOrderStatus(o, Status.ReadyToSend) SHOWIF status(o) == Status.InPreparation TOOLBAR
  PROPERTIES(o) NEWSESSION NEWEDIT, EDIT, DELETE
;
   Ещё1
 
158 - 22.10.19 - 18:54
(157) Ладно, сделал чуть по-другому, без передачи нового статуса в параметре:

setStatusReadyToSend 'Отправить' (Order order) {
  status(order) <- Status.ReadyToSend;
}

FORM ordersForm 'Заказы покупателей'
  OBJECTS o = Order
  //...
  PROPERTIES(o) setStatusReadyToSend SHOWIF status(o) == Status.InPreparation TOOLBAR
  //...
   Bro
 
159 - 23.10.19 - 06:20
(158) На самом деле первый вариант тоже бы прокатил, но там надо было = перед setStatusReadyToSend поставить. Иначе грамматика не LL(*) становится. То есть надо lookahead делать. Мы это скорее всего уберем, но в любом случае так как для такого свойства надо либо заголовок('кол'=для интерактивного представления) задавать либо ид(col=для печатного представления) пока решили не париться.
   Smile 8D
 
160 - 23.10.19 - 09:43
(159) А когда вы что-то "уберете" в платформе, решения, которые это используют сломаются? Или вы оставляете обратную совместимость?
   Конструктор1С
 
161 - 23.10.19 - 09:55
(103) а зачем на Java так писать?

class Item extends AbstractItem {
   String name;
}

и получилось у нас:
"Это очень простой код, первой строкой мы объяыляем класс Item, который наследуется от класса AbstractItem. Второй строкой объявляем свойство - имя объекта класса Item"
   Ещё1
 
162 - 23.10.19 - 10:00
(159) Честно говоря не понял, как изменить код в (157) чтобы он скомпилировался.

(160) Обычно новые фичи в языке / платформе добавляют в новую версию, оставляя старую версию для обратной совместимости.
   НиколаевГ
 
163 - 23.10.19 - 10:04
(162) Вот и я о том-же. Синтаксис языка неочевиден, одно и то-же можно сделать десятком способов, а разработчик языка не в состоянии доступно объяснять особенности.
   _DAle_
 
164 - 23.10.19 - 11:47
(161) Потому что наши классы - это не java-классы. Даже логически: у них есть возможность расширения с помощью добавления новых методов и полей (если в терминологии java говорить) + множественное наследование + отсутствие инкапсуляции. Не говоря уже о том, как бы пришлось потом эти классы использовать для определения других элементов системы.
   1ctube
 
165 - 23.10.19 - 11:51
В этой системе есть аналог СКД?
   НиколаевГ
 
166 - 23.10.19 - 11:59
(165) СКД не нужен, родной :))
 
 Рекламное место пустует
   Злопчинский
 
167 - 23.10.19 - 12:01
(165) нету там.
текстовое описание источников отчета, передача в левую прогу, и в ней майсрячить...
   1ctube
 
168 - 23.10.19 - 12:08
(167) Жесть...
   Злопчинский
 
169 - 23.10.19 - 12:09
(168) зато модно и молодежно!
   1ctube
 
170 - 23.10.19 - 12:10
(169) Ахах)
Да я смотрю, те кто решил заниматься этой системой все модные и молодёжные))))
   HeKrendel
 
171 - 23.10.19 - 12:13
(164) Всмысле отсутствие инкапсуляции? А нафига вы тогда ООП представляетесь?
   _DAle_
 
172 - 23.10.19 - 12:18
(171) Где конкретно мы представлялись ООП? Мы везде пишем про полиморфизм и инкапсуляцию.
   _DAle_
 
173 - 23.10.19 - 12:18
(172) ошибся: *про полиморфизм и наследование
   K1RSAN
 
174 - 23.10.19 - 12:24
(173) Вы везде гнобите 1С за то, что она "не ООП", но сами тоже "не ООП"? Л - логика
   _DAle_
 
175 - 23.10.19 - 12:37
(174) Мы сейчас в терминологический спор уйдем, чего бы мне не хотелось. В lsfusion нет классического ООП по учебникам, то есть нет тройки: наследование, полиморфизм, инкапсуляция. В lsfusion все то же наследование и полиморфизм от ООП, но без инкапсуляции. Я нигде никого не гнобил, но когда гнобят, подразумевают обычно не три веселые буквы ООП, которые ничего не означают, а то, что в 1С нет нормального механизма абстрагирования и повторной используемости кода (в ООП за это отвечают наследование и полиморфизм).
   Злопчинский
 
176 - 23.10.19 - 12:55
(175) ну написать код который отрабатывает при создании нового в нужном месте - он будет повторно использоваться.. или это не то?
есть БСП, есть БПО - бери и используй в разработках. или это тоже не то?
   HeKrendel
 
177 - 23.10.19 - 12:57
(175) Вот этого- Инкапсуляция (англ. encapsulation, от лат. in capsula) — в информатике упаковка данных и функций в единый компонент.
   Ещё1
 
178 - 23.10.19 - 13:40
(177) Да, в lsFusion свойства классов и кортежей классов не инкапсулируются прямо соответствующие в классы и в кортежи классов, как принято в ООП. Хотя запись свойств в функциональном стиле lsFusion:
myProperty(myClass)  // Для свойств классов
myProperty(myClass1, myClass2) // Для свойств кортежей классов
фактически эквивалентна записи в ООП-стиле:
myClass.myProperty // Скобки для 1-го параметра можно опустить
(myClass1, myClass2).myProperty

И по сути свойства без указания соответствующих классов/кортежей не имеют смысла. Т.е. инкапсуляция как ни крути есть, только она сразу не видна программистам, привыкшим к ООП (как я, вы, и наверное большинство здесь собравшихся).
   Ещё1
 
179 - 23.10.19 - 13:42
(178) * Правильнее идентификаторы классов писать с большой буквы: MyClass, MyClass1, MyClass2. Так принято в Java и lsFusion.
   Конструктор1С
 
180 - 23.10.19 - 13:45
Давайте подведём итоги. Т.е. вы изобрели предметно-ориентированный язык программирования (DSL), в котором ООП не ООП,SQL не SQL, java не java, и бизнес-ориентация не бизнес-ориентация? Осталось только понять, на что ориентируется этот как бы предметно-ориентированный язык программирования...
   НиколаевГ
 
181 - 23.10.19 - 13:45
(178) А вот внятно и непротиворечиво они свою концепцию раскрыть для среднего 1С-ника не могут :((
Иногда даже думается, что не случайно.
   Конструктор1С
 
182 - 23.10.19 - 13:48
https://ru.wikipedia.org/wiki/Предметно-ориентированный_язык

Так какую, говорите, специфику отражает ваш ЯП?
   Bro
 
183 - 23.10.19 - 13:51
(181) тут проблема что ничего аналогичного в мире нет, и поэтому есть проблема с терминологией. Предметноориентированность вообще перпендикулярно ООП и всему остальному, это характеристика области применения. У lsFusion эта область приблизительно равна области где применяется sql.
   _DAle_
 
184 - 23.10.19 - 13:52
(182) https://habr.com/ru/company/lsfusion/blog/458376/ Можно вот тут почитать, начать можно с раздела "Немного теории".
   _DAle_
 
185 - 23.10.19 - 13:54
(180) Давайте, пожалуйста, из этого топика вынесем эти обсуждения и оставим здесь конкретные вопросы и ответы по платформе. А то сейчас опять скатимся в балаган.
   K1RSAN
 
186 - 23.10.19 - 13:58
(179) Присваиваете общепринятое написание переменных? Нам это рассказывал препод в универе, который учил это где-то в 90-х и застал программирование на перфокартах
   Конструктор1С
 
187 - 23.10.19 - 13:58
(185) так это конкретный вопрос - что есть lsFusion и под что оно заточено?..
   K1RSAN
 
188 - 23.10.19 - 13:59
(185) Ну вы начали свое пребывание здесь с балагана, так зачем же менять "традиции"? А вообще это вопрос по делу.
   K1RSAN
 
189 - 23.10.19 - 14:01
(183) Звучит как 0,44445 примерно равно 1, если 0,44445 = 0,4445 = 0,445 = 0,45 = 0,5 = 1 (везде примерно равно и округление по одному разряду за шаг)
   Ещё1
 
190 - 23.10.19 - 14:04
(180) Я для себя, после поверхностного изучения языка, определяю его как бизнес-ориентированный язык с элементами ФП и ООП. Если кратко - "SQL на стероидах" (C).
(186) Нет, ищу похожие черты с теми языками, что изучил до lsFusion. Классы - с большой буквы, свойства - с маленькой. Легко запомнить.
(185) Как передать с формы в ordersForm в функцию setOrderStatus статический объект Status.ReadyToSend в качестве параметра? (157) Я уже это по-другому переделал, но для понимания не помешает.
   НиколаевГ
 
191 - 23.10.19 - 14:05
(184) Эта статья написана в отвратительном стиле очень сложным языком, и для программистов очень высокого уровня.
   НиколаевГ
 
192 - 23.10.19 - 14:07
(183) А постарайтесь, ведь в процессе обсуждения "что такое свойство" были уточнены термины и практически всё разжёвано для понимания обычными 1С-никами. Значит, это всё-таки возможно, если есть желание.
   _DAle_
 
193 - 23.10.19 - 14:10
(190) У меня получилось как-то так
  PROPERTIES 'Отправить' =  { setOrderStatus(o, Status.ReadyToSend); } SHOWIF status(o) == Status.InPreparation TOOLBAR
   НиколаевГ
 
194 - 23.10.19 - 14:10
И, конкретный вопрос - в фузине нет инкапсуляции. Почему у вас такая реализация, какие плюсы от этого получены.
   НиколаевГ
 
195 - 23.10.19 - 14:12
(193) Почему у вас каждый разработчик показывает разные реализации одного и того-же простого  случая? Почему у вас нет стандартов написания кода?
   Ещё1
 
196 - 23.10.19 - 14:16
(193) Спасибо за короткий и понятный ответ!
   Конструктор1С
 
197 - 23.10.19 - 14:18
(190) бизнес-ориентированный ЯП должен "говорить" словами бизнеса. Хоть одно слово из бизнеса там есть?
   _DAle_
 
198 - 23.10.19 - 14:19
(194) 1. Множественный полиморфизм. Так как свойство не привязывается к какому-то конкретному классу, то получилось реализовать multiple dispatch (https://en.wikipedia.org/wiki/Multiple_dispatch)
2. Расширяемость и модульность. Так как объявлять свойства и действия можно не только "внутри" класса, как в классическом ООП, то мы можем добавлять функциональность к классам в сторонних модулях, не меняя исходный код базовых модулей.
   Ещё1
 
199 - 23.10.19 - 14:20
(195) Ну, в любом языке логику можно выстроить по-разному. Например, можно написать одну большую функцию, покрывающую разные применения, а можно сделать несколько помельче для каждого конкретного применения. В данном случае я уже накидал был некий код но надо было его поднастроить, чтобы компилятор проглотил.
   Злопчинский
 
200 - 23.10.19 - 14:23
(184) перенесите все статьи на ресурс вендора. реально напрягает по сторонним коморкам шарится.
  1  2  3  4  5  6   

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