Имя: Пароль:
   
IT
 
Конкретные вопросы по lsFusion
Ø (длинная ветка 14.10.2019 21:06)
0 Bro
 
06.10.19
20:21
Здесь только вопросы по lsFusion, без оценок и срача, что в сторону lsFusion, что в сторону 1С. Кто будет начинать того будут блокировать.
1 Bro
 
06.10.19
20:21
Вопрос от бегинер:
подскажите по платформе (то что это не бизнес-задача не надо спорить, чисто вопрос по возможностям компонентов платформы):
можно создать данные не хранящиеся в БД ( в физ. табличках постгри) и вывести их в грид?

1) создать 2д массив, без хранения в бд: а(1,1)=2;a(1,2)=4;a(2,1)=3; и т.д.
2) описать форму на которой будет грид у которого данные не из БД а из этого 2д массива - который храниться в жизни реалтайма
3) где почитать о программной работе с гридом:
3.1 узнать кол-во выделенных строк
3.2- программно отсортировать
3.3- программно отфильтровать/установить отбор
3.4- заморозить-зафиксировать нескол. колонок
3.5- программно скрыть/отобразить строку
3.6- программно раскрасить ячейку, а не всю строку грида

ответьте по пунктам желательно что есть что нет

т.е. каковы именно функц. возможности компонента UI вашего "gridview"

4) Jasper Reports  - аналогично, можно этот 2д массив вывести отчет?, т.е. выводить в отчет данные которых нет в БД, не ручками в редакторе прописать текстом - набрать массив, а программно вывести 2д массив в отчет.
2 Красный рассвет
 
06.10.19
20:21
Хай, Бро
3 H A D G E H O G s
 
06.10.19
20:25
Какие СУБД поддерживаются и где скачать сервер приложений?
4 H A D G E H O G s
 
06.10.19
20:26
Есть ли аналог внешних обработок?
5 Bro
 
06.10.19
20:29
1. Первичные свойства могут быть локальными, тогда они в базу не идут. Их можно в Администрирование ->Интерпретатор или где угодно создавать (например lsfusion.org/try). То есть делаете:

a = DATA LOCAL LONG (LONG, LONG);

// выведет все параметры а и их значения
FORM a
    OBJECTS (i1=LONG, i2=LONG)
    PROPERTIES VALUE(i1), VALUE(i2), a(i1,i2)
    FILTERS a(i1,i2)
;

// можно сделать хитрее, i2 закинуть в колонки выдаст матрицу 10x10 в ней будут значения
FORM a
    OBJECTS i1=LONG
    PROPERTIES VALUE(i1)

    OBJECTS i2=LONG
    PROPERTIES a(i1,i2) COLUMNS (i2) HEADER (i2)
    FILTERS iterate(i1,1,10), iterate(i2,1,10)
;

run() {
    a(1,2) <- 5;
    a(4,2) <- 7;
    a(1,3) <- 9;

    SHOW a;
}

все хранится в жизни риалтайма, как вы говорите.
6 Bro
 
06.10.19
20:36
3) например так:

// выведет галочку отметки и поле на форму с количеством отмеченных записей
selected = DATA LOCAL BOOLEAN (INTEGER, INTEGER);
EXTEND FORM b
    PROPERTIES selected(i1)
    PROPERTIES 'Кол-во отм.'=(GROUP SUM 1 IF selected(x))
;

но есть предопределенные операторы по работе с текущими фильтрами, порядками и т.п. например:
https://documentation.lsfusion.org/pages/viewpage.action?pageId=35520946

countAll = GROUP SUM 1 IF [FILTER b.i1](x); // показывает количество записей с учетом текущих фильтров в гриде i1
7 Bro
 
06.10.19
20:41
3.2-3.3 Нужно опять таки понимать что вся работа декларативна, если нужно добавить сложный фильтр, делается

filterX = DATA LOCAL BOOLEAN();
EXTEND FORM z
    FILTERS NOT filterX() OR (f(a,g(b)) + (GROUP SUM 1 IF h(c) = a) > 5)
;

соответственно если в где угодно будет
filterX() <- TRUE;
фильтр сразу включится, сбросите в NULL выключится

есть еще группы фильтров, которые может выбирать пользователь:
https://documentation.lsfusion.org/pages/viewpage.action?pageId=3866671

С порядками с большего все похоже, но есть нюансы, могу потом рассказать
8 Bro
 
06.10.19
20:43
3.4 к сожалению пока нет, так как ни свинговые не gwt гриды такого почему-то не поддерживают (то есть в мире почему-то не принято ими пользоваться). Странно конечно, но посмотрим может сами добавим в ближайшее время. Ну и в реакте явно есть компоненты, когда его подключим проблема уйдет автоматически.
9 Bro
 
06.10.19
20:45
3.5 Смотрите вы можете сделать
run() {
    a(1, x) <- NULL;
}

и тем самым по сути ряд с 1 удалится. Можно сделать
deleted = DATA LOCAL BOOLEAN (LONG);
EXTEND FORM a
    FILTERS NOT deleted(i1)
;

Тогда если где угодно написать
deleted(3) <- TRUE;

строка 3 по сути удалится.
10 Bro
 
06.10.19
20:46
3.6. Делаете

EXTEND FORM a
   PROPERTIES a(i1,i2) BACKGROUND RGB(255,0,0) IF g(i1) + h(i2) > 5
;

И она подсветит красным все ячейки у которых g(i1) + h(i2) > 5
11 Лефмихалыч
 
naïve
06.10.19
20:47
(0) чтобы было без оценок и срача, не надо было вам с них начинать. А то "я сначала высрусь сообществу на голову, а потом буду за культуру бытия агитировать". Иди уже теперь в жопу с вещами.
12 Bro
 
06.10.19
20:48
4. Просто вместо SHOW a, делаете PRINT a. И форма выводится на печать. К базе никаких обращений не будет (забыл сказать что LOCAL'ы во временных таблицах будут, то есть обращения будут но не к базе). Могу подробнее рассказать, что именно по отчетам интересует.
13 Bro
 
06.10.19
20:50
(3) Пока есть адаптеры к PostgreSQL и MS SQL. Но в продакшне пока MS SQL не тестировали (к сожалению желающих пока не было, когда есть бесплатный PostgreSQL).

Скачать тут:
https://documentation.lsfusion.org/pages/viewpage.action?pageId=18645035

Смотря что интересует, если для разработки раздел разработка, если для выполнения - раздел выполнение.
14 Злопчинский
 
06.10.19
20:54
Правильно ли понял, что если на форме есть поля, и надо по факту ввода в поле сделать какой-то простой арифметический пересчет (ну например ндс выделить), то все вычисляется на сервере? клиент только и сключительно рендеринг формы и ничего иначе?
15 CrushBy
 
06.10.19
20:55
(14) Да.
16 Bro
 
06.10.19
20:56
(4) Любые действия выполняют функцию внешних обработок:

run() {
}

Для того чтобы их выполнить есть функция EVAL, то есть :

INPUT f=TEXTFILE DO // запросили файл
    EVAL STRING(f); // выполнили код в нем, предполагается что внутри есть действие run

Также есть Администрирование -> Интерпретатор, который по сути этот EVAL и делает. Там можно ввести код и выполнить, как в условном SQL Management Studio (правда без подсветок и всего такого).

(14) Да. Идеологически очень к React близко.
17 Bro
 
06.10.19
20:57
(16) В интерпретаторе скрипты можно сохранять обзывать и т.д. и т.п.
18 Злопчинский
 
06.10.19
20:58
(15) если все считается на сервере - то вычисления пишутся на языке фузины? или надо что-то писать в терминах скриптов/процедур СУБД?
19 CrushBy
 
06.10.19
20:59
(14) Более того, все такие вычисления выполняются исключительно на сервере БД, а не на сервере приложений. Сервер приложений занимается в основном "компиляцией запросов" и другими техническими функциями.
20 CrushBy
 
06.10.19
21:00
(18) Нет, все только на языке фузины. Дальше это все "компилируется" в SQL запросы и выполняется на сервере БД.
21 Злопчинский
 
06.10.19
21:03
про язык программирования
"Каждый модуль состоит из последовательности инструкций"
- где посмотреть полный перечень допустимых инструкций
- каков вообще синтаксис языка? (могу тупить, привычного описания синтаксиса что-то не увидел)
- есть вообще что-то типа Синтакс-Помощника по языковым конструкциям (типа как в 1С)?
22 Злопчинский
 
06.10.19
21:06
(20) вдогонку к предыдущему вопросу про язык
- если все пишетяс на языке фузины - перечнь встроенных функций где посмотреть (типа как в 1С: Цел, Окр, СтрДлина, Сред, СокрЛП итд)..?
- какие примитивные типы данных есть? (не реквизиты/поля бд и форм), а именно типа как в 1С - Дата, Число, Строка итд..?
23 CrushBy
 
06.10.19
21:07
(21) Допустимые инструкции. https://documentation.lsfusion.org/pages/viewpage.action?pageId=2228688 Там же описан синтаксис.

Да, что-то похожее есть в IDE. Вот тут есть GIF'ки : https://habr.com/ru/company/lsfusion/blog/465573/
24 Devilment
 
06.10.19
21:08
(5) Это что, если мне надо дерево вывести на форму - мне его вручную собирать надо?
25 Bro
 
06.10.19
21:09
26 Злопчинский
 
06.10.19
21:10
(23) увидел сам уже. как-то малость непривычно - в самом начале описания языка идет какая-то куча кода в качестве примера (что нихрена непонятно), а раздел инструкций слева в меню...
27 Bro
 
06.10.19
21:12
(24) нет просто его объявить:
https://habr.com/ru/company/lsfusion/blog/460141/#tree
и тут:
https://habr.com/ru/company/lsfusion/blog/468047/
дальше все само.
(26) там есть отдельно описание понятий словами (раздел Парадигма) и описание синтаксиса (раздел Язык)
Вообще предполагается что изучается Парадигма, а в язык уже за подсказками лазится, когда уже все понятия знаешь.
28 Devilment
 
06.10.19
21:15
(27) Это из данных базы, понятно как соберется. А из внешних данных (преcловутый xml), которые в базу не надо писать - как?
29 Злопчинский
 
06.10.19
21:16
(27) нехорошо ссылаться на левые ресурсы при описании языка и общепринятых сущностей. все-таки лучше работу с деревом, таблицей значений, структурой (еще что-то?) описать на самом сайте продукта.
Те же самые примеры-статьи на хабре имхо лучше если они будут дублироваться из первоисточника на сайте.
30 ПросТак
 
06.10.19
21:16
Злоп, неужели тебе интересно разбираться в фузине?
31 Devilment
 
06.10.19
21:18
(30) Ему просто скучно... У меня вот был практический интерес, а платформа у них не может того, что мне надо :((
32 CrushBy
 
06.10.19
21:18
(29) Согласен. Возможно, перенесем. Просто там немножко другой формат - статьи, которые не очень соответствуют документации. В документации также есть в разделе HowTo немного про деревья :
https://documentation.lsfusion.org/pages/viewpage.action?pageId=46367457
33 Злопчинский
 
06.10.19
21:18
так как все вчисления в т.ч. и данне для отображения "делаются" на сервер - есть готовые инструментальные средства на языке фузины для популярных сущностей? например, разобрать и отобразить XML на форме? есть ли встроенные инструменты верификации сформированного иксемеля по схеме?
34 Злопчинский
 
06.10.19
21:20
Можно ли в списках/таблицах форм фузины делать одну строку в виде "многострочного моноблока из нескольких строк" (для предотвращения скроллинга на узких экранах)?
35 Bro
 
06.10.19
21:24
(33) Для работы с XML используются те же формы. То есть SHOW a, PRINT a, EXPORT a, IMPORT a. Механизм один и тот же.
В формате how/to tutorial:
https://habr.com/ru/company/lsfusion/blog/460141/#struct
и тут:
https://documentation.lsfusion.org/pages/viewpage.action?pageId=60555456

Более техническая информация тут:
https://documentation.lsfusion.org/pages/viewpage.action?pageId=29884537
36 Devilment
 
06.10.19
21:24
(33) О, нас двое, которым это надо :)) И я даже догадываюсь, почему :))
37 CrushBy
 
06.10.19
21:24
(33) В GUI, который формируется именно на фьюжене есть только Деревья (TREE), Таблицы (GRID) и свойства (что-то вроде объекты ввода). Плюс различные типы контейнеров, в которые их можно помещать. С визуальной точки зрения XML можно отобразить только используя их.

Разбор XML, как и JSON идет через оператор IMPORT, который берет XML и записывает их в свойства. Вот тут немного примеров, правда для JSON :
https://documentation.lsfusion.org/pages/viewpage.action?pageId=55935068
https://documentation.lsfusion.org/pages/viewpage.action?pageId=46367614

Встроенных в язык верификаций нет, но есть функции, которые принимают на вход 2 строки (xml и xsd) и записывают в специальное свойство результат проверки.
38 Bro
 
06.10.19
21:25
(33) Для верификации есть готовое действие внутри платформы
39 CrushBy
 
06.10.19
21:25
(34) Нет. На данный момент нельзя.
40 Злопчинский
 
06.10.19
21:27
(39) хреново. это чаще востребовано чем раскраска... появится когда нибудь?
41 Bro
 
06.10.19
21:27
(34) Нет, парадоксально, но я даже на реакте таких компонент не видел. Видимо считается что двухэтажные строки тяжело читать, так как весь смысл таблицы рушится.
42 Злопчинский
 
06.10.19
21:29
(37) "но есть функции, которые принимают на вход 2 строки (xml и xsd) и записывают..."
- где перечнь функций (которых возможностей нет в языке) с описанием вход-действие-выход? эти функции написаны на чем-то внешнем? (не на фузине)...? если да - то какой набор функций таких идет в установочном пакете?
43 CrushBy
 
06.10.19
21:29
(40) С нашей стороны это поддержать несложно. Проблема в нижележащих технологиях. В desktop'е используется JTable из Swing, в веб клиенте - не помню какой компонент. Ни тот, ни другой не поддерживают многострочных строк. Компонентов, которые это позволяют в природе очень мало (что в десктопе, что в вебе). Возможно, в какой-то момент мы изменим компоненты для отображений на другие, которые это поддерживают. Но это не в ближайшей перспективе.
44 Злопчинский
 
06.10.19
21:31
(41) читать легко, так как текущая такая многоэтажная строка выделяется сеlектом. конечно, при массовой ручной работе это может быть затруднительно, есть такое. Будет ли такая возможность, хотя бы опционально?
45 Devilment
 
06.10.19
21:31
(37) Это что за дичь: Для создания JSON с вложенными тэгами нужно создать форму с соответствующими объектами, связанными через конструкцию FILTERS. На основе зависимостей между ними создается JSON с соответствующей структурой.
Как форма связана с экспортом в JSON?
46 Злопчинский
 
06.10.19
21:31
(44) ответ в (43), ок
47 CrushBy
 
06.10.19
21:32
(42) Они написаны на Java. Мы их включаем в модули, написанные на языке lsFusion вместе с Java классами, которые их реализуют. Пока описания на documentation.lsfusion.org нет.
Вот тут большинство находится, но есть и другие. Как правило, все сводится к простой функции от параметров, которые записывают результат в свойство с предопределенным именем. Например, тут :

https://github.com/lsfusion/platform/blob/b35fba224014487217c91517b5047e6cf508a461/server/src/main/lsfusion/system/Utils.lsf

(41) Bro, сам же сказал без оценочных суждений и начал тут.
48 Злопчинский
 
06.10.19
21:33
(45) да, поддерживаю.
для меня вполне понятно, когда на вход обработки я получаю массив данных без физуального отображения и сериализую его в джсон.
получается что в фузине ряд действий нельзя просто" сделать не имея "вспомогательной" визуальной формы?
49 CrushBy
 
06.10.19
21:34
(45) Можно рассматривать JSON, как форму определенной структуры. Это не очень легко сначала понять, но после нескольких примеров обычно люди понимат. Плюс в IDE есть возможность автоматически сгенерировать структуру форму по шаблону JSON.
50 CrushBy
 
06.10.19
21:35
(48) Для плоского JSON (простого массива) будет простая форма (с одним объектом грубо говоря). Это нужно для случая сложного JSON'а. Посмотрите пример 4 вот здесь :
https://documentation.lsfusion.org/pages/viewpage.action?pageId=46367614
51 Злопчинский
 
06.10.19
21:36
(47) полуофф: нехорошо. получается фузина достаточно бедна для работы с кучей необходимого. и либо делать самому страдая и потея (хотя это сделано давно кемто) либо лазить по левым источникам и хрен чего там внутри.
.
отсюда вопрос: планируется ли наращивать функциональность языка для работы с разными типами данных рахными сущностями? или по крайней мере включать в поставку набор стандартизированных функций для популярных операций/сущностей? (типа как БСП в 1С)
52 Devilment
 
06.10.19
21:37
(49) Что такое "форма" в вашей парадигме тогда? Или в разных случаях под формой подразумеваются разные сущности?
53 CrushBy
 
06.10.19
21:37
(48) И эта форма не совсем визуальная. По сути она объявляет структуру. Ее при желании можно отобразить, но фактически она будет использоваться только для экспорта/импорта. Это сделано, так как по сути JSON и XML - это просто один из видов представления формы.
54 Злопчинский
 
06.10.19
21:38
(50) извините, не понимаю.
получается что для некоторых действий которые в принципе не требуют визуального отображения - трансформация одних данных в другие - мне обязательно надо делать визуальную форму? это ограничения\парадигма платформы или как?
55 CrushBy
 
06.10.19
21:39
(52) Нет. Всегда одно и тоже. Это набор объектов (OBJECTS) со свойствами (PROPERTIES), которые связаны друг с другом через фильтры (FILTERS).
56 CrushBy
 
06.10.19
21:40
(54) Она не визуальная, так как вы не настраиваете в ней дизайн. Вы объявляете структуру формы. См (55).
57 Злопчинский
 
06.10.19
21:40
(52) присоединяюсь к вопросу.
в 1С (ну по крайне мере в 77)
форма
- это сущность для какихто визуальных действий
- или контейнер для кода без визуального отображения.
58 CrushBy
 
06.10.19
21:41
(54) Это не ограничения - это смысл парадигмы в общем-то. Я понимаю, что это очень необычно, так как аналогов этому нигде нет. Но в этом и есть отличие lsFusion от всего другого. Хорошо это или плохо можно оценить только после использования.
59 Злопчинский
 
06.10.19
21:41
(56) детализируйте плиз более формально определение "форма"
60 Devilment
 
06.10.19
21:41
(53) То есть, форма существует только на сервере приложения, и программист управляет тем, будет ли она отображена на клиенте?
61 Devilment
 
06.10.19
21:43
(53) Интересный подход. А что тогда делать с двоичными данными в xml?
62 Злопчинский
 
06.10.19
21:43
(58) офф: вы заблуждаетесь ;-) все уже до вас проходили: точно так же форма как обычно визуальная сущность могла еще в 77 использоваться для неких вспомогательных действий, а т.ч. и с полями и обьектами на форме, но без визуализации.
63 CrushBy
 
06.10.19
21:44
(60) В lsFusion вы вообще не оперируете сервером и клиентом - для вас это "прозрачно". Поэтому рассматривать форму в таком контексте, я думаю не стоит.
64 Злопчинский
 
06.10.19
21:45
эээ. поясните.
у нас внезапно нарисовалась в фузине трехзвенка?
- клиент (только рендерит форму)
- сервер приложений (что такое это в фузине?)
- сервер БД
.
??
илия что-то неправильно понимаю?
65 CrushBy
 
06.10.19
21:46
(62) Возможно, тут скорее инновационность в способе ее задания, а не в том, что она существует без визуализации.

(61) Поясните, о каких двоичных данных идет речь ? Base64 ?
66 Злопчинский
 
06.10.19
21:47
(63) дайте более-мене формальное определение формы. что это такое и для чего используется. а то как-то непонятно.
67 CrushBy
 
06.10.19
21:47
(64) Технически там трехзвенка была всегда и есть. Клиент - тонкий и занимается только отображением и обработкой пользовательского ввода. Просто логически, когда вы разрабатываете на lsFusion вы вообще об этом не знаете и ничем не управляете. Все делается автоматически платформой.
68 Devilment
 
06.10.19
21:48
(63) Я про то, как устроено внутри. В 1С, например, форма одновременно может существовать на клиенте и на сервере, и изменения формы на клиенте не всегда приводит к взаимодействию с сервером.
69 Devilment
 
06.10.19
21:49
(65) Всё, что может быть в CDATA
70 CrushBy
 
06.10.19
22:09
(68) В lsFusion абсолютно другой принцип работы с формами, поэтому тут не очень легко сравнивать. С точки зрения текущей реализации могу для понимания сказать, какие данные где хранятся.

Во-первых, все таблицы в lsFusion - это динамические списки в терминологии 1С.

На клиенте всегда хранится только "видимое окно" таблицы со значениями всех колонок (например, 50 записей). Плюс все значения панельных свойств (проще говоря, одиночных полей ввода). А также текущие выбранные объекты.

На сервере приложений из данных в любой момент времени хранится тоже самое, что и на клиенте (текущие видимые записи и т.д.).

Все изменения, сделанные пользователем, но не сохраненные в базу данных хранятся во временных таблицах на сервере БД. Именно таким образом достигается возможность редактирования в динамических списках. То есть вы изменили, проскроллировали дальше. Этих данных уже ни на клиенте, ни на сервере нету. Но они есть во времянках на сервере БД.

Если что-то подробнее нужно, то пишите - расскажу.
71 CrushBy
 
06.10.19
22:11
(69) Не очень понимаю, почему они бинарные. Это просто данные примитивных типов. Вы просто объявляете на форме свойства с такими же именами, и когда идет IMPORT/EXPORT, то в них соответственно запишется или считается.
72 CrushBy
 
06.10.19
22:17
(66) К сожалению, достаточно тяжело дать простое и точное определение формы. Это как с определением предела в математике (для любого эпсилон больше 0 существует дельта больше 0 и т.д.). То есть понятие предела вроде как простое, а точное определение - сложное.

Наиболее простое и близкое определение я приводил выше :
Это набор объектов (OBJECTS) со свойствами (PROPERTIES), которые связаны друг с другом через фильтры (FILTERS).

Таким образом объявленная форма может использоваться в 3х случаях :

# Отображение пользователю (так называемое Интерактивное представление). Будет автоматически сформирован дизайн. Дальше он настраивается при помощи инструкции DESIGN.
# Формирование печатной формы JasperReports (Печатное представление). Тоже есть автоматическая формирование шаблона, но дальше нужно рисовать нужный шаблон в JasperSoft Studio.
# Собственно импорт экспорт JSON/XML. Изначально хотели сделать отдельные абстракции. Но в рамках борьбы с лишними абстракциями Bro решил натянуть сову на глобус и задействовать для этого логику формы. В этом есть определенный смысл, но есть и недостатки. Плюс в том, что разработчику не нужно учить новые абстракции.
73 tty12
 
06.10.19
22:27
(72) По моему мнению, в таком случае, полностью теряется понятие "Форма".
Под формой вы понимаете набор структурированных данных - если угодно, то некую таблицу). Которая может выступать источником данных для Формы (в нормальном понимании), а также отчета и (для меня это странно) источником/приемником, служащим для обмена данными.
74 CrushBy
 
06.10.19
22:32
(73) Тогда уж не таблицу, а несколько таблиц, связанных друг с другом. Да, можно было бы использовать какой-то другой термин, но учитывая, что он используется чаще всего именно для форм, то был выбран такой. Кроме того, он короткий - 4 буквы всего :) А как бы назвали Вы ? Источник данных - странно звучит, да и это не источник данных. Это именно объекты (сущности) объединенные по определенному принципу.
75 CrushBy
 
06.10.19
22:32
(74) Точнее связанные по определенному принципу.
76 Asmody
 
06.10.19
22:34
Нормальных отчетов у вас нет, я так понимаю?
77 Злопчинский
 
06.10.19
22:35
(70) "Все изменения, сделанные пользователем, но не сохраненные в базу данных хранятся во временных таблицах на сервере БД."
- двое одновременно "взяли" некий набор данных на редактирование. Например, условный пример. Юзер1 и Юзер2 получили обьект со значением 50.
Юзеру2 увеличил значение на 10.
Юзер1 увидит это изменение, или по крайней мере при записи своих измененйи будет уведомлен о том что данные изменены?
(пример вырожденный, в реальности может быть более сложное типа если юзеры прочитали одновременно еще неизмененный обьект, если один юзер изменил обьект, другие изменения других юзеров должны блокироваться) - как такое разруливается?
78 CrushBy
 
06.10.19
22:36
(76) Мы не разделяем формы на Формы и Отчеты. Просто у любой формы может быть печатное представление, которое может выводиться на печать или экспортироваться в Excel, Word и т.д.
79 Злопчинский
 
06.10.19
22:38
(76) нету у них. среда для автоматизации неполная. средставми платформы без привлеченяи левых сущностей хрен что напечатаешь. так я понял.
80 Злопчинский
 
06.10.19
22:39
"напечатаешь" = "печатное представление"
81 tty12
 
06.10.19
22:40
(74) В первую очередь - ваша "Форма" это набор данных.
То, что вы из нее делаете любую сущность - крайне странно, т.к. этот набор данных может подходить для отчета, но слишком избыточен для элемента справочника или наоборот и это лишь одна из вариаций...
Я правильно понял,что ваша "Форма" - абстрактный набор данных, из которого вы лепите, что хотите?
82 CrushBy
 
06.10.19
22:42
(77) Во-первых, в lsFusion нет понятия изменение объекта. Есть понятие Добавить/Удалить объект и понятие изменение значения свойства (которое может быть как для одного объекта, так и для нескольких объектов). При желании можно в какой-то момент времени (например, при открытии) запоминать старые значения свойств и сравнивать их с новыми при сохранении, при этом выдав сообщение. Но пока это придется делать вручную. Но есть возможность устанавливать что-то вроде "семафоров". То есть при открытии формы просто вешать на нее блокировку и не давать другим пользователям заходить на редактирование.

(79) Я же просил - в соседнюю ветку.
83 CrushBy
 
06.10.19
22:43
(79) И вы неправильно поняли. Все печатается исключительно при помощи средств lsFusion.
84 CrushBy
 
06.10.19
22:45
(81) Это не набор данных. Набор данных - это конкретное подмножество данных. А тут именно схема данных. Приблизительно такая же разница, как между XML (набор данных) и XSD (схема).
И, на самом деле, "схемы" у форм, отчетов и JSON/XML похожи.
85 tty12
 
06.10.19
22:50
(84) Тоесть "Форма" Это описание структуры данных, она же схема?
А почему вместо Form не использовали Schema? На две буквы больше? - да, но, кмк, логически более правильно для понимания программистом.
86 CrushBy
 
06.10.19
23:02
(85) Да, кстати, вот только что придумал термин получается :) Но тогда бы пришлось объявлять сначала SCHEMA, а затем FORM, что немного бы усложнило логику задания форм, хотя в 90% случаев схема бы создавалась ради формы. А сейчас они совмещены по сути. Так что да, возможно имело бы смысл. Возможно в дальнейшем сделаем такое разделение.
87 Garykom
 
06.10.19
23:04
(43) >В desktop'е используется JTable из Swing, в веб клиенте - не помню какой компонент. Ни тот, ни другой не поддерживают многострочных строк.

Вы ипанулись. Извините других слов нет ибо глобальные незнания свинга.
http://www.java2s.com/Code/Java/Swing-Components/MultiLineTable.htm
88 tty12
 
06.10.19
23:13
Еще один вопрос, связанный с задачкой про "установку наценок" (это где про наценку на группа товаров.
1. Этот механизм у вас реализован?
2. Как у вас увязаны цены, на которые вы делаете наценки, с ценами, которые высвечиваются для конечного клиента в заказе? Тоесть, есть первоисточник - входящая цена на товар, есть наценка, есть покупатель. Опишите логику формирования конечной цены для покупателя во Фьюжне. Пока скидки/акции и т.д. откинем.
89 Asmody
 
06.10.19
23:21
(88) Да чего откинем-то?
Резать - так резать.
Пусть будет несколько видов цен, включая динамические. В валюте. До 4х дес.знаков. А сумма по документу рассчитывается в рублях по курсу, который зависит от организации и способа оплаты. До двух знаков. С отнесением разниц на самую дорогую строку с обратным пересчетом цены.
90 tty12
 
06.10.19
23:26
(89) Ну вот. Подсказал. Я к этому и вел. 8)
91 CrushBy
 
06.10.19
23:31
Не превращайте, пожалуйста, ветку в срач. Для этого есть соседняя.

(88) Поясните, пожалуйста, вопрос. Есть статья - в ней реализована конкретная логика. Что значит реализован у вас механизм ?
Вы пишете "у вас увязаны цены". У вас - это где ? В платформе нету таких понятий, как цена, наценка и т.д.
92 CrushBy
 
06.10.19
23:34
(87) Также замечу, что для оскорблений есть соседняя логика.
В этом классе, они подменяют логику рендеринга. То есть отобразить не проблема. Там будут большие вопросы с редактированием и навигацией, если вы знаете, как реализован там JTable, который они используют.
93 Garykom
 
06.10.19
23:36
(92) И редактирование и навигацию тоже можно перекрыть, да возможно выглядеть это будет визуально не очень красиво (сдвижки и прочие артефакты) но вполне реально.
94 Asmody
 
06.10.19
23:37
(89)+ добавим жиру:
Пользователь, в зависимости от роли и подразделения, не может ставить некоторые виды цен. Но иногда может (есть признак у клиента, либо в самом документе). Но если выбрано доп.соглашение, то цены должны пересчитаться в обратную в у.е. из рублей в доп.соглашении и не могут меняться.
95 tty12
 
06.10.19
23:37
(91) Эта тема называется "Конкретные вопросы по lsFusion".
Вот конкретный вопрос:
Есть входящая цена - цена поступления.
Через какие механизмы, а точнее какие средства (не программистские, а пользовательские) существуют в демобазе, к которой вы предоставили доступ, для формирования отпускной цены для конечного покупателя? Интересуют все вариации, предусмотренные платформой и данной демобазой.
96 CrushBy
 
06.10.19
23:41
(93) Реально, но будет криво - уже пробовали на базе JTable много чего. Пока принято решение забить, так как выигрыш неочевиден. Если хотите с этим поспорить. то в соседнюю ветку.
97 Asmody
 
06.10.19
23:41
(94)+ а если в доп.соглашении нет товара, то цену брать по виду в договоре. А если там нет вида цен, то любую, которая доступна пользователю.
98 CrushBy
 
06.10.19
23:44
(95) Можете на платформе реализовать любую логику, при этом предусмотрев возможность пользователю настраивать что угодно. Как сделано в демобазе - не принципиально. Это лишь одна из возможных конфигурации и к платформе отношения не имеет.
99 Asmody
 
06.10.19
23:49
Мы же можем к полю таблицы динамический список выбора прицепить? Зависящий от значений в других колонках? И запретить ручное редактирование поля в таблице, а когда надо - разрешить?
100 CrushBy
 
06.10.19
23:52
(99) Что значит список выбора ? Для редактирования или что имеется ввиду ?
101 tty12
 
06.10.19
23:57
(98) Занавес...
Вывод у меня такой:
Во Фьюжне все ништяк, но ничего не зделано еще. Есть набор разрозненных таблиц в pgsql, графическое представление которых наблюдаем в демобазе, данные в которой вяжутся join-ом без какой-либо лигики (ИМХО: не знаю, может тупо по совпадению типа поля связь идет). Но фьюженовцы могут связать и по логике, только скажите КАКОЙ!
102 PR
 
07.10.19
00:15
(11) +100500
103 Злопчинский
 
07.10.19
00:15
(83) никакого другого ПО кроме фузины для формирования печатных форм - не надо? формирование, отображение, и вывод на печать печтаных форм фузина поддерживает самостоятельно, без стороннего ПО\без сторонних модулей (написанных не на фузине)..?
104 Flyd-s
 
07.10.19
00:21
1. Уже спрашивал в прошлой ветке - есть ли примеры сложных проверок при записи в базу? Не в виде остатков по одному измерению, а хотя бы сопоставимое по сложности с теми же остатками в УТ с учетом резервов, настроек складов, заказов поставщикам и т.д.

2. Как в платформе осуществляется разделение представления объектов (формы) и логики? И можно ли средствами платформы сделать красивую форму, не такую вырвиглазную как в демопримерах?
105 Злопчинский
 
07.10.19
00:24
(100) условно:
есть справочник.номенклатура.
у него может быть неограниченное количество визуальных представлений
- просто основная форма (открывается просто чтобы посмотреть)
- форма подбора (например вызывается откуда захочешь с передачей туда-сюда параметров)
- форма выбора, обычно вызывается из строки документа например для выбора номенклатуры.
в заисивмости от архитектуры решения логика поведения форм и их состав может быть лююой.
например в форме выбора можно только единичный выбор номенклатры сделать, а можно множественный выбор сделать
.
поэтому "для выбора" - это и значит открыта форма, из нее выбираем и может кудато результат выбора вноситься передаваться.
.
многие из формы списка основной например делают комбайны. у них форма списка номенклатуры превращаетс внекий АРМ по выбору строк товаров и сразу оформить заказ (а не создать заказ и наполнить номенклатурой).
в типовых решениях применен более-менее единый подход.
как сделать где конкретно - каждый ПРИ НЕОБХОДИМОСТИ решает сам
106 Злопчинский
 
07.10.19
00:27
(100) в принцие любой список номенклатуры (основная форма, форма выбора, форма подбора итд) повзволяет добавлять\удалять\редактировать существующие элементы. это можно как запретить, так и разрешить. все делается натыкиванием мышкой по большинству. точно также как состав действий по кнопке "еще" может завистеть от контекста и состава\ограничений наложенных в конфигураторе.
если чтото неправильно спецы по 8-ке поправять
я рассказываю в общем, с тем знанием типовых что у меня есть (маленькие и разрощненные, бо не сильно втыкаю - и без втыкивания почти все нахожу, бо идеология ясна, без допизучения могут быть неясны некие специальные непривычнве вещи с которым не сталкивался ранее)
107 Злопчинский
 
07.10.19
00:32
(100) "для редактирования или чего?" - нет немножко сложнее
- если юзер кнюпнул на ячейку такуюто в нашем списке то мы
- извлеаем из базы кучу данных, переколбашиваем их, считаем, преобразуем, на выходе получаем некий динамический список (который не содержит в себе никаких объектов БД в явном виде),
- вываливаем этот список юзеру, юзер выбирает что надо (одно значение или в общем случае несколько мультиселектом)
- по полученному значению тащим кучу данных из базы, переколбашиваеммиксуем с введеным значением и полученный результта записываем в ячеку таблиы на форме
108 Злопчинский
 
07.10.19
00:35
(104) вдогонку
3. и можно ли объекты (например прикладные, например заказ покупателя)м описать отдельно, а логику работы с этим объектом (для разных вариантов использования) описать отдельными логиками. Понятно, что вязание таблиц по ключу друг с другом мы логикой не считаем.
109 Flyd-s
 
07.10.19
00:37
+ к (104)

Как настраиваются доступы к объектам, есть ли аналог RLS из 1С?
110 Злопчинский
 
07.10.19
00:43
для фузиновцев: RLS - это платформенная поддержка (включается когда надо) разгранчиения прав доступа на уровне записей.

Запись - это запись БД в терминах прикладных объектов (т.к. 1С прикладное-обьектное программирование)

спецы по 1С поправят если я неверно сказал
111 _DAle_
 
07.10.19
00:44
(103) Платформа использует JasperReports для формирования печатных форм. Вот тут есть How-to: https://documentation.lsfusion.org/pages/viewpage.action?pageId=46367627
112 Злопчинский
 
07.10.19
00:52
(111) "Система сохранит автоматические шаблоны для Jasper Reports в папку исходников (src/main/lsfusion)."
- что такое джасперрепорт? входит в поставку продукта? будет ли фузина формировать и выводить печатные формы без него?
113 Flyd-s
 
07.10.19
00:53
(104), (110), приведу пример. Допустим нужно сделать так, чтобы пользователь видел документы только по своей организации или по списку организаций. Список будет задаваться в отдельной таблице, где-то у администратора системы.
Важно (!) ограничения заданные в RLS действуют не в конкретной форме ввода или отчета, а везде. Т.е. задали ограничение на видимость по организациям и пользователь не видит чужие документы во всех списках, формах выбора документов, во всех отчетах и т.д.
114 Злопчинский
 
07.10.19
00:55
(111) почитал вики, не обрадовался. Висивига для консрутирования печформ видимо нет.
115 _DAle_
 
07.10.19
00:56
(108) Не уверен, что правильно понял вопрос, конечно. Но попробую. Вы можете объявить класс (и возможно какие-то базовые свойства для этого класса) в одном модуле, а более сложную логику работы с объектами этого класса реализовывать в других модулях.

Часто в одном "базовом" модуле создается абстрактный класс с абстрактными свойствами, описывающими какую-то базовую логику, а затем при необходимости изменить эту базовую логику, вы объявляете конкретный класс, наследуясь от абстрактного, и переопределяете свойства. Реализуется это (по сути, это subtype полиморфизм) механизмом расширений: https://documentation.lsfusion.org/pages/viewpage.action?pageId=1146886 и дочерние статьи.
116 _DAle_
 
07.10.19
00:56
(112) Входит в поставку.
117 Злопчинский
 
07.10.19
00:59
(116) Висивиг - нет?
если мне надо модифицировать отчет по внешнему виду и составу данных - я сначала модифицирую текстовый шаблон в фузине, потом начинаю его майстрячить в джаспере?
119 Злопчинский
 
07.10.19
01:18
(116) если мне в джасперстудио во время майстрячения макета понадобились допданные для отчета резво вытянуть из базы - я так понял мне надо вертаться куда-то "взад", вытаскивать эти данные, пихать описание их в шаблон и майстряить дальше? простого способа взять "реквизит обьекта" из базы (например наименование контрагента из закза) и кинуть его на макет печатной формы - так можно?
120 _DAle_
 
07.10.19
01:19
(117) Если только по внешнему виду, то достаточно будет отредактировать соотвествующий jrxml файл в Jaspersoft Studio. Так как печатные формы - это в платформе просто одно из представлений формы, то для изменении состава данных нужно будет сначала изменить форму
121 Злопчинский
 
07.10.19
01:20
(офф) давным-давно, мой друг (охеренный программист дельфист и все такое прочее работой котрого и было только программить) ваял на сторону решение для ЖКХ. я просто изнервничался весь, наблюдая как он майстрячил это решение, вязал таблички по ключам и все такое прочее (ну как в фузине). причем все ну практически 1-в-1 как в 1Сине было. Наблюдать это было мне очень тяжко. А тажк как майстрячились отчеты в КристалРепортс. Ну не хочу я такого повторения.
122 Злопчинский
 
07.10.19
01:23
(120) печально. наполовину хуже чем даже в 7.7. но хорошо хоть чтото есть.
Однако будет тяжело, когда придется с клиентом какую-нить новую печформу ваять - то в джаспер лезть, то назад в фузину, то в дажспер, то в фузину (а вот сюда для номенклатуры вытащить код ТНВЭД).
124 Злопчинский
 
07.10.19
01:27
(120) сколько примерно занимает времени от а до я майстрячение печформы сопоставимой по наполнению разнородными реквизитами и визуально выглядевшей типа как российская ТОРГ12? есть примеры таких печформ в ерп живые посмотреть?
125 Злопчинский
 
07.10.19
01:29
у нас, у 1Сников, маястрясение печформ для документов (заказы, накладные и про) и справочников - это поле деятельности самых что ни на есть джунов, в фузине как?
126 Злопчинский
 
07.10.19
01:36
(офф) мелкая обучаловка по основам работы с фейсом https://www.youtube.com/watch?v=OcJro5xiglk
127 Злопчинский
 
07.10.19
01:47
? есть какая-то подсистема простановки должностей-подписей сотрудников организации и сортудников клиента в печатные формы документов? желательно - с разделением какие документы имеют право подписывать какие пользовтаели?
128 Злопчинский
 
07.10.19
01:48
"какие документ" = какие печатные формы к каким документам, т.к. документ может иметь несколько разных печатных форм и сотрудники разный доступ к подписи разных печформ.
129 Devilment
 
07.10.19
05:48
(70) Так вот, если мы объявляем форму для экспорта в xml, она где будет существовать, только на сервере СУБД, получается, в виде временной таблицы? А готовый xml где будет получен для последующей отправки почтой, например?
130 Devilment
 
07.10.19
05:50
И ещё, я не понял, что является уникальным идентификатором сущности, например, конкретного документа или элемента справочника.
131 NUser
 
07.10.19
08:53
(87) откуда вы такие тупые беретесь?
132 Bro
 
07.10.19
08:57
(77) lock есть для пессимистических блокировок.
(76) Форма и является отчетом, то есть может содержать любые вычисляемые данные. Для печати JasperReports.
(87) А MultiLineHeader, плюс его ресайзинг. Плюс в Web'е нужен такой же компонент.
(94) CONSTRAINT forbidden(organization(currentUser()), currentRole(), priceType(Document d)) AND NOT allowed(d) AND ... MESSAGE ''
(95) CrushBy надеюсь поделиться ссылкой с gitHub где эта логика задается.
(97)
numberSkusInAgreement(Agreement a) = GROUP SUM 1 IF skusInAgreement(Sku sk, a);
CONSTRAINT ... AND (NOT numberSkusInAgreement(agreement(d)) OR )...
(99) PROPERTIES g(a) READONLYIF h(a)
133 Bro
 
07.10.19
09:13
(104) Сложность обычно не в самом ограничении, а в сложности показателя. То есть обычно CONSTRAINT состоит максимум из пары строк, но показатели которые он использует могут в конечном итоге использовать сотни других показателей, операторов
Дизайн задается практически точно также как в УФ. Дерево компонент. То есть CSS Flex. Можно задать любой дизайн. Но вопрос в модульности и политике безопасности, то есть то что любой компонент может исчезнуть при неподключении модулей, или запрете показателя
(105) Можно любой форме задать признак что это форма редактирования или выбора
FORM A
    OBJECTS d ...

...

    LIST MyClass OBJECT b  // форма списка
    EDIT MyClass OBJECT b  // форма редактирования

;

Потом можно делать SHOW EDIT MyClass ... вызовется A.
(107) f(a) ON CHANGE {
     DIALOG someDialog OBJECTS x=oldValue INPUT {
         ... делаем что-то
         f(a) <- something(a) * d + (GROUP SUM ...) ...
     }
}
(113) EXTEND FORM someForm
      FILTERS in(organization(d), currentRole())
;
Можно конечно сделать для класса Document, чтобы на все формы добавлялся, но непонятно скажем, что с внутренними перемещениями делать
(117) Если только дизайн не надо, если данные

PROPERTIES g(a)
и используете в дизайнере Jasper'а, все переходы в IDE максимально автоматизированы.
(127) Здесь платформу обсуждаем, для обсуждения ERP можно отдельную тему создать
(129) Форма это метаданные. Он на сервере приложений. Локальные первичные свойства, если одно изменение на сервере приложений, больше временная таблица на сервере БД. XML на сервере приложений (если его на клиента не передадите)
(130) Внутренний идентификатор. LONG. Кстати их можно генерить одним запросом:

FOR iterate(i,1,10000) NEW d=Document DO {
  ....
}

На самом деле сделает один запрос (рекурсивными CTE).
134 Devilment
 
07.10.19
09:25
(133) Я ННП. Вот есть ваше утверждение, что программист никак не управляет, только на сервере приложения будет жить форма, или ещё на клиенте? Опять же, если XML на сервере будет сформирован, я, получается, то-же могу предать его на клиент, то есть управлять таки клиент-сервером.
По идентификатору - я не понял, он автоматом генерируется платформой для всех объектов, то есть для документа как для шапки, так и для каждой строки табличной части? Или, надо его программисту реализовывать самостоятельно?
135 Bro
 
07.10.19
09:26
(125) В lsFusion тоже. Самые первые задачи которые идут джунам. Условно принцип такой:

1) Отчеты (PRINT), DATA, композиции (f(g(a))), FORM
2) DESIGN интерактивного представления (SHOW), GROUP SUM, GROUP LAST (суммы, последние), TREE
3) Классы / наследования, AGGR, PARTITION, XML (EXPORT / IMPORT), EXTERNAL HTTP / SQL
4) RECURSION
136 Bro
 
07.10.19
09:31
(134) Если вы сделаете
EXPORT XLS myForm; // тут он на сервер
open(exportFile()); // передастся клиенту и откроется

EXPORT XLS myForm; // тут он на сервер
EMAIL SUBJECT 'HI' BODY exportFile(); // пошлется по почте, на клиента передаваться не будет, даже если им инициировано действие

Нет, не надо ничего руками делать есть просто NEW;

NEW d=Document
   FOR iterate(t, 1, 10) NEW dd=DocumentDetail
      document(dd) <- d;

Кстати при такой схеме можно переносить строки между документами

move(Document from, Document to) {
     document(DocumentDetail dd) <- to WHERE document(dd) = from;
}
Есть еще один фокус вообще не делать строки:

quantity = DATA LONG (Document, Sku);

и делать :
addDocument10(Document d) {
   FOR name(Sku s) LIKE '%NIVED%'
      quantity(d, s) <- 10;
}
То есть с данными сразу как в Excel, а не по строкам работать. Так при работе с ассортиментами очень удобно.
137 Bro
 
07.10.19
09:37
(134) Чтобы лучше понимать, объект это фактически идентификатор LONG (+ свойство хранящее его принадлежность классу, но оно явно не используется, более того если у класса нет потомков его может и не быть)
out(Sku s) {
MESSAGE LONG(s); // выводит внутренний id Sku
}
138 Devilment
 
07.10.19
09:40
(136) Ладно, допустим, с файлами понятно. А этот вот код, он в каком месте пишется?:
NEW d=Document
   FOR iterate(t, 1, 10) NEW dd=DocumentDetail
      document(dd) <- d;
И, уникальность этого кода, получается не глобальная - т.е, теоретически, этот код может быть одинаковым у документа и справочника?
139 Bro
 
07.10.19
09:44
(121) Еще один момент, который видимо непонятен:
Документ.Организация.Банк.Х, в lsFusion это
Х(Банк(Организация(Документ)))
То есть чисто синтаксическое различие, чтобы унифицировать когда параметров станет несколько, то есть если Банк зависит от магазина, то в lsFusion:
Х(Банк(Организация(Документ), Магазин))
Хотя конечно и в синтаксисе с . это можно сделать:
Документ.Организация.Банк(Магазин).Х
И возможно мы и такой синтаксис поддержим.
140 Bro
 
07.10.19
09:46
(138) Вот не понял если честно этого вопроса. Это действие, можно писать где угодно в событиях например.
Этот код одинаково генерировать может записи для и справочника и документа. На уровне платформы нет таких различий (есть в прикладных библиотеках), ей все равно "табличные части" это справочников или документов .
141 Devilment
 
07.10.19
09:48
(140) Так если я его не напишу - уникального кода не будет, что-ли. А если будет, то зачем его писать?
142 Bro
 
07.10.19
09:54
(141) Все равно не понимаю. Этот код создает новый документ и 10 строк. При этом генерятся коды и документу и строкам документа.
143 Devilment
 
07.10.19
10:04
(142) Тьфу теперь понял, забыл, что вы склонны не только на поставленный вопрос отвечать, но ещё и сверху лишнего накинуть :)
Тогда вопрос - вот есть у нас идентификатор в виде строки, как по нему найти объект? Или, для этого обязательно знать тип объекта?
144 Bro
 
07.10.19
10:11
(143) Сейчас в новой версии будет
OBJECT(id), но так лучше не делать, так как ей придется по всем таблицам смотреть (если в контексте использования не будет понятно что это за класс, скажем по используемым свойствам), так что лучше все же указать хоть какой-то абстрактный класс, например OBJECT(id, Document);

Но вообще в старых версиях если использовали внутренние идентификаторы то делали так
FOR LONG(Sku s) = id DO sku(dd) <- s;
Правда обычно у объектов есть внешние идентификаторы, тогда это делается так
number = DATA STRING (Document);
docByNumber = GROUP AGGR Document d BY number(d); // на выходе получается свойство STRING -> Document
фокус GROUP AGGR что автоматически создается ограничение что документ с номером максимум один.

Плюс преимущество что можно делать сразу по многим параметрам:
docByNumber = GROUP AGGR Document d BY number(d), organization(d); // на выходе получается свойство STRING, Organization -> Document

Тогда ограничение, что номер уникален в рамках одной организации.
ЗЫ: опять сверху лишнего накинул, не обижайтесь :)
145 Devilment
 
07.10.19
10:28
(144) Я это к чему - не очень понятно, как делать обмены, если документ приходит из внешней системы, например, разработчик обмена со стороны внешней системы что должен сделать, чтобы в вашей системе при загрузке документ не задублировался? Или, вы это решаете добавление идентификатора внешней системы ко всем объектам? Или используются таблицы соответствия?
146 Flyd-s
 
07.10.19
10:30
(133), "Сложность обычно не в самом ограничении, а в сложности показателя. "

Чем это принципиально отличается от написания процедура в 1С типа ПроверитьОстатки(,)?
147 ptiz
 
07.10.19
10:31
(0) 1) Как выполняется сортировка документов, движений "регистров" внутри секунды?
2) Могу я расположить документы внутри секунды произвольным образом?
3) Как наложить условие на получение движений от начала месяца "до конкретного документа", не включая его движения.
148 Bro
 
07.10.19
10:41
(145) Вот здесь пример 3 посмотрите, просто сначала добавляются недостающие, а потом сам импорт
https://documentation.lsfusion.org/pages/viewpage.action?pageId=46367614
(146) Тем что ограничение декларативно. Вам не нужно думать о местах его проверки. Не надо следить, что именно изменилось (как например если в приходе товара поменяли пару позиций), и строить алгоритмы инкрементального обновления.
(147) 1) Смотрите вы когда делаете GROUP LAST может указать допполя

last = GROUP LAST SkuLedger ledger ORDER dateTime(ledger), ledger;

То есть сначала по секунде, потом по внутреннему id. Но можете любые свойства указывать. Если условие будет недетерменированное, то как и в SELECT поведение будет недетерминированное
2) Да смотри выше, можете сделать
order = ABSTRACT LONG (SkuLedger); и  

last = GROUP LAST SkuLedger ledger ORDER dateTime(ledger), order(ledger);

3) тут я может не понял, но
last(DATETIME dt) = GROUP LAST SkuLedger ledger ORDER dateTime(ledger) WHERE dateTime(ledger) < dt;
run(Document d) {
  MESSAGE last(dateTime(d));
}
Ну или с замыканием:
run(Document d) {
  MESSAGE GROUP LAST SkuLedger ledger ORDER dateTime(ledger) WHERE dateTime(ledger) < dateTime(d);
}
149 pechkin
 
07.10.19
10:41
(147) вроде в сиквелах секунда - это не минимальная единица времени
150 Bro
 
07.10.19
10:44
(146) Хотя и императивно (как и в остальных системах) вам ограничение никто проверять не мешает. Представьте что это аналог CONSTRAINT'ов в СУБД, только в общем случае.
151 ptiz
 
07.10.19
10:45
(149) Совсем нет. Ну и в 1С, сортировка внутри секунды - это сам УИД. А тут, как я понял - некое поле ledger.
(148) Можно про суть поля ledger - это что такое?
152 ptiz
 
07.10.19
10:46
(149) Пардон, не так понял. Но 1С всё равно использует только секунду "целиком".
153 ptiz
 
07.10.19
10:47
(149) Как я понял, у фьюжен нет типа "дата с долями секунды" и они тоже оперируют целыми секундами. Или не так?
154 Bro
 
07.10.19
10:51
(151) Это не поле, это сам объект, а точнее его id (имя параметра не важно, то есть можете так написать GROUP LAST Document d ORDER dateTime(d), d). Хотя в конечном итоге это грубо говоря ключевое поле таблицы.

Но вообще в GROUP LAST вы можете любой шлейф свойств использовать. То есть сначала по дате потом по организации, и т.п.
(153) Мы на самом деле это отдаем СУБД, хотя да предполагаем что секунды. В любом случае с точки зрения вашей задачи это не важно. С датами та же проблема.
155 Flyd-s
 
07.10.19
10:52
(133)? "EXTEND FORM someForm
      FILTERS in(organization(d), currentRole())"

не совсем понял подход. Что в переменной d? Что если в одной роли будет ограничение по организациям, в другой по подразделениям, а в третьей не будет ограничений и пользователю будут назначены любые из трех ролей?

Как я понял вы ограничения доступа накладываете непосредственно в форме списка, путем принудительной установки фильтров для пользователей. При создании отчета берущего данные, имеющие ограничения доступа - нужно будет там тоже прописывать ограничения заданные в ролях доступа?
156 Bro
 
07.10.19
10:52
(154)  GROUP LAST Document d ORDER dateTime(d), d - последний документ по дате, а если они равны по внутреннему id документа (у кого больше тот и последний, генерятся эти id по возрастанию при использованию NEW, так что как правило это удобно)
157 Flyd-s
 
07.10.19
10:56
(148), а зачем думать что изменилось, если мы проверяем остатки по документу?
158 Bro
 
07.10.19
10:56
(155) d это объект документа (который в виде списка отображается). Вы в in можете написать все что угодно:
in(Organization o, Role r) = CASE WHEN strict(o) THEN allowed (o, r) ELSE TRUE;

(155) Да это просто дополнительный фильтр. Отчет это такая же форма.  То есть вы задает in. А потом EXTEND FORM injection делаете в нужные формы. Можно конечно в платформе сделать чтобы автоматически какое то условие embed'илось во все формы (задача на полдня). Но я если честно не могу придумать постановку как в таком брутфорсе, случайно не вырубить скажем во внутренних перемещениях документы прихода с секретной организации.
159 Bro
 
07.10.19
10:59
(157) Ну я приводил пример с документами прихода, где не по всему документу надо проверять. Там по одной строке уменьшили с 10 до 5. Вам придется выяснить по какой строке уменьшили, причем руками.

Ну и с декларативностью в принципе проще. Повесили в каком то модуле ограничение, и вам все равно как другие разработчики будут проводить свои документы, это ограничение они без вашего ведома не обойдут.
160 Мэс33
 
07.10.19
10:59
(111) похоже на аналог - BIRT, с таким в свое время работал.

По удобству создание отчетов в 1С - самая удобная, имхо. Не самая быстрая в работе, но красивая и удобная.
161 Мэс33
 
07.10.19
11:01
(125) немного офф - поэтому те же пользователи sap давно плюнули на желание получить отчеты "как в 1С" и часто просят абаперов просто выкидывать им портянки таблиц, которые потом выгружают в excel  и там уже доводят до ума.
162 Bro
 
07.10.19
11:02
(160) Да, там два конкурента BIRT и JasperReports. Последний популярнее и функциональнее (он там такие форматы поддерживает, что я половины не знаю). Ну и нам нужна была чиста система печати, за работу с данными lsFusion отвечает. Тем более что она общая и для печати и скажем всех экспортов (и конкретно оптимизирована под формирование быстрых запросов).
163 Bro
 
07.10.19
11:03
(161) Есть другой подход, выгружать в BI (или подключать прямо к базе), а дальше уже крутите как хотите данные. Типа как http://bi.lsfusion.ru/.
164 Мэс33
 
07.10.19
11:03
(162) непривычно будет это для 1Сников, скажу вам сразу. Да и пользователям тоже смотреть на кривые отчеты (а они в большинстве случаев будут кривые) не в радость.

Бизнесу это часто не мешает от слова совсем.
165 Devilment
 
07.10.19
11:04
(148) Так в примере у вас id внешней базы совпадает с id во внутренней, а если из внешней приходит GUID, например, то, получается, вы вашей системе добавите поле GUID внешней системы. А если таких систем несколько с разными идентификаторами, для каждой поле надо будет добавить, получается?
166 Bro
 
07.10.19
11:04
(164) Давайте не разводить опять срач. Но я уже говорил Россия не приоритетный рынок (без оценок хорошо это или плохо).
167 Flyd-s
 
07.10.19
11:05
(158), о каких секретных перемещениях идет речь и для чего оставлять пользователю к ним доступ?
168 Мэс33
 
07.10.19
11:06
(166) "Но я уже говорил Россия не приоритетный рынок" - ну тогда я вас совсем не понимаю.

Ну ок, дело ваше.
169 Flyd-s
 
07.10.19
11:11
(159), я просто проверю весь документ - ушел в минус, значит плохой документ, не ушел хороший, без разбирательства где изменения произошли

Глобальные ограничения на остаток в 1С тоже можно прописать в модуле регистра, но этого не делают, потому что логика проверок может отличаться от документа к документу. Например оптом занимается один разработчик, а розницей второй. И первому нужно проверять остатки, а второму нет
170 ptiz
 
07.10.19
11:12
(154) Если ledger - "Это не поле, это сам объект, а точнее его id", то тогда его нельзя взять и поменять у документа, правильно?
Т.е. позиционирование документа внутри секунды - такое же, как у 1С (Дата + ссылка)?
Например, в журналах как строится упорядочивание? Или для получения остатков?
171 Bro
 
07.10.19
11:12
(165) Нет, вы создаете одно поле GUID и работаете с ним. Смысл GUID в том что он один. Если систем несколько, то я уже приводил пример:
docByNumber = GROUP AGGR Document d BY number(d), organization(d); // на выходе получается свойство STRING, Organization -> Document
И везде вторым параметром вставляете организацию.
(167) Смотрите у вас форма внутренних перемещений с одного склада на второй.
Вы ограничили видимость всех расходов с секретной организации. Идет перемещение с секретной организации на мою. Если я ограничу видимость всех расходов с секретной организации, то человек не сможет видеть и приходы на его не секретную организацию. То есть нужно какое-то хитрое условие строить, что если расход не с секретной организации ИЛИ приход в мою организацию.

Но с другой стороны почему нет я подумал можно сделать что-то типа такого в объявлении класс:
CLASS Document FILTERS d AS NOT forbidden(from(d)) OR allowed(not(d))

И автоматически добавлять во все формы (как сейчас с CONSTRAINT CHECKED делается). В принципе задача не сложная, еще подумаю.
172 Bro
 
07.10.19
11:14
(170) нет, я же приводил пример:

можете сделать:
order = DATA LONG (SkuLedger);

last = GROUP LAST SkuLedger ledger ORDER dateTime(ledger), order(ledger);

или

last = GROUP LAST Document d ORDER date(d), priority(from(d)), d;

Журналы тут не причем. Там просто:

FORM A
   OBJECTS a=A
   PROPERTIES f(a), g(a), h(a)
   ORDER f(a), h(a)
;
173 Flyd-s
 
07.10.19
11:18
(171), если это доступ для кладовщика, то ограничение делается по складу, а не по организации. Ограничение по организации - это для менеджера , чтобы он занимался только своими делами и не лез в чужие, ему не нужны секретные перемещения, только остатки товара, которые от документа не зависят
174 Devilment
 
07.10.19
11:21
(171) Так как один на несколько внешних систем? Если изменится номер документа во внешней системе, как вы его при таком подходе найдёте? Или вы будете товарищей, которые обмен пишут со стороны внешней системы, заставлять ваш id в свою базу обратно пихать?
175 ptiz
 
07.10.19
11:23
(172) Очень тяжело понять такое после привычки работать с 1С.
Получается, такое понятие как "порядок" - можно определять для каждого объекта? И по-разному?
176 Smile 8D
 
07.10.19
11:29
(171) Тут у вас проблемы с методологией, раз вы даже склады и организации путаете. Внутреннее перемещение только между складами. При перемещении между организациями будет приход и расход. Соответственно, при ограничении по организации человек не будет видеть расход, а приход видеть будет, т.к. организация там другая, а "секретная" является контрагентом уже.
Но тут скорее спрашивают про встроенные механизмы прав, ограничений и т.д. В 1С за годы существования пришли к пониманию, что ряд механизмов нужен на уровне платформы. Скорее всего вы тоже к этому со временем придете.
177 pechkin
 
07.10.19
11:30
(175) их сложно понять потому что это какая то извращенная модель функциональщины.
она сама по себе то не проста, а в их исполнении совсем полных швах
178 Flyd-s
 
07.10.19
11:32
(133), "Дизайн задается практически точно также как в УФ. "

Прям с визуальным редактором как в 1С?
179 ПускинАС
 
07.10.19
11:33
(178) FORM A
   OBJECTS a=A
   PROPERTIES f(a), g(a), h(a)
   ORDER f(a), h(a)
;
вот так АДЫН пУк  и все.
180 ПускинАС
 
07.10.19
11:34
(178) Фузиновцы считают у них уху евший дизайн уи который не нужно совсем прям трогать)))
181 Devilment
 
07.10.19
11:35
(177) Я тут вижу проблему, что при таком подходе одни и те-же вещи их платформа позволяет сделать несколькими способами, и, при отсутствии внятной методологии и зафиксированных стандартов разработки, это неизбежно приведёт к хаосу в решениях.
182 pechkin
 
07.10.19
11:38
(181) разве есть языки где нет множества подходов?
183 pechkin
 
07.10.19
11:38
но для программистов изучать фузна# нет никакого смысла. куда потом с этими знаниями идти?
184 Devilment
 
07.10.19
11:40
(182) Так да, но в 1С, например есть методология и стандарты разработки, и большинство разработчиков таки им более-менее следуют.
185 Devilment
 
07.10.19
11:41
(183) Как куда? Самому клиентов искать и окучивать, ведь в этом случае сколько клиенту зарядил - все твои :))
186 Bro
 
07.10.19
11:46
(174) не понял вопроса, id (GUID или что-то другое) либо есть в формате обмена, либо нет. Если его нет, то и определить изменение теоретически не вижу (175) Смотрите, вы правильно сказали, что Регистр сведений это:
GROUP LAST измерение(Ledger l) ORDER dateTime(l), l;

В lsFusion в ORDER может быть что угодно.
(178) Речь шла про дизайн. Логически также задается, физически также. То есть не мышкой, а кодом, но справа сразу рендерится форма:
https://habrastorage.org/webt/rw/tx/oh/rwtxohoulxz_m_yqhqxqiioaqfq.gif
(176) Политика безопасности по колонкам есть в полном объеме. Даже с некоторыми очень крутыми фишками вроде логирования любого показателя на форме.
По рядам, вопрос был в том что логика безопасности может быть практически любой. Хотя я уже писал как это решается и можно решить (но все равно не уверен, что в сложных случаях это заработает).
(181) На самом деле дублирования абстракций практически нет. Очень мало вещей можно сделать разными способами.
pechkin, Devilment, ПускинАС есть соседняя тема. Здесь практические вопросы разбираются. Не знаю насколько у CrushBy есть права скрывать сообщения не по теме, но если нет, то смысла конечно в отдельной ветке нет :(
187 Devilment
 
07.10.19
11:51
(186) Понятно, сложных обменов, значит, вы не делали.
188 МихаилФ
 
07.10.19
11:55
(187) Они не каких не делали, похоже. Всё в теории..
189 Мэс33
 
07.10.19
12:01
(182) например, python way - должен быть быть способ сделать что-то самым оптимальным образом )
190 pechkin
 
07.10.19
12:01
(185) мы точно про программистов говорим?
191 Devilment
 
07.10.19
12:05
(190) Так они же смогли, значит и остальные так-же хотят :))
192 Мэс33
 
07.10.19
12:13
Наверное этот вопрос задавали, сорри, если повторяюсь.

А на форме можно динамически отображать/скрывать элементы интерфейса? В зависимости от действий пользователя? Можно ли сделать что-то наподобие визарда в интерфейсе?

Простой пример: ПКО в типовом 1С имеет где-то с десяток вариаций одного и того интерфейса, тем не менее это один объект метаданных.

Второй вопрос: есть ли аналог понятия субконто?
193 Bro
 
07.10.19
12:15
(192) PROPERTIES f(a) SHOWIF g(a) > 5. Как только g(a) станет больше 5 f(a) скроется (колонка или поле). В зависимости от действий пользователя или чего угодно.
(192) В платформе прикладных бухгалтерских понятий естественно нет. Есть в библиотеках, но такие скорее к ERP чем платформе относятся.
194 ptiz
 
07.10.19
12:16
(186) Спрошу по-другому про порядок документов.
Я - манагер, хочу в пределах 1 секунды сделать два документа: покупателю А, и покупателю Б. Могу я какой-либо кнопкой или корректировкой какого-то поля (даты) менять расположение этих документов относительно друг друга (сначала А потом Б, или сначала Б потом А)? И будет ли это изменение порядка отображаться во всех отчетах?
В 1С это проблема, вот и хотел узнать - решили ли вы её.
195 Salimbek
 
07.10.19
12:25
(194) Отвечу чисто теоретически - во все документы, которые должны обрабатываться подобным образом, добавляешь свойство order_by. И все документы/отчеты/движения выводишь сортируя сначала по времени, потом по этом полю. Далее - в каждый документ добавляешь кнопочку (или что-то более креативное), которое может указать, что "этому документу быть в данной секунде пятнадцатым!"
196 Bro
 
07.10.19
12:27
(194) Смотрите, заводите поле порядок:
order = DATA LONG (Document);
при необходимости есть метакоды по генерации действий их управлением

далее, есть две разные вещи Регистр Сведений и Формы / Отчеты:

И там и там в опцию ORDER добавляете
dateTime(d), order(d), d
197 МихаилФ
 
07.10.19
12:44
А есть ли у вас аналог СКД?
198 Asmody
 
07.10.19
12:50
(100) Список выбора - это dropdown.
199 Salimbek
 
07.10.19
12:55
(197) Отвечу тоже, теоретически - нету, есть Формы, которые собирают данные и эти Формы можно вывести в Отчет, через встроенные механизмы JasperReports
200 pechkin
 
07.10.19
13:02
(196) для отчетов обычный Sql используется?
201 ptiz
 
07.10.19
13:11
(196) - но это же переписка всего решения, всех запросов. Есть же у вас какой-то устоявшийся стандарт на порядок документов, запросы к остаткам? Каков он?
202 Salimbek
 
07.10.19
13:33
(201) Вы уверены, что в чужой системе есть проблема 1С-ная с сотней тысяч документов в последней секунде?
203 ptiz
 
07.10.19
13:52
(202) Мне интересно: сталкивались ли они с этим и как решали. Пока вижу ответ: "если надо - допилите вот так и вот так". Что странно, учитывая позиционирование системы "для больших".
204 Мэс33
 
07.10.19
13:54
(203) кстати, приведенный пример "допиливания" показывает, насколько сильно можно кастомизировать поведение системы. В 1С ты привязан к уже созданным заботливо разработчиками платформы объектам, здесь же, в фузине, ты сам волен менять все, как тебе нужно. )
205 Salimbek
 
07.10.19
14:00
(203) А для чего это нужно? Ну вот, например. Манагер "А" посмотрел, что есть такой-то товар в нужном количестве и сделал наряд на сборку заказа. Грузчику прилетело задание - он пошел его собирать. Тут же манагер "Б" посмотрел - что товар тоже есть и сделал второй наряд - но ему пришел отлуп, что товара в нужном количестве нету. Он посмотрел - действительно, количество доступное уже уменьшилось, и пошел смотреть альтернативные варианты. Так для чего нужно получать остатки с точностью до "порядок документов в секунде"?
206 ptiz
 
07.10.19
14:02
(205) Перепроведение задним числом.
207 Bro
 
07.10.19
14:32
(197) Уточните какие именно его функции. В lsFusion за ее функцию отвечает другие абстракции.
(198) Вместо dropdown используются формы, но платформа сама пробрасывает ввод в фильтр этой формы.
(200) в конечном итоге все сводится к sql, причем минимуму запросов, императивно отчет только рендерится.
208 Bro
 
07.10.19
14:35
(201) нет как раз, если был
last = GROUP LAST Document d ORDER dateTime(d), d;
Вы изменяете на
last = GROUP LAST Document d ORDER dateTime(d), order(d), d;

Все запросы где использовалось это свойство "перепишутся сами".
209 Asmody
 
07.10.19
15:05
(207) Мне не нужен фильтр. Я хочу значение в поле выбрать из выпадающего списка. Вы же хвалитесь, что у вас жутко редактируемые строки в таблицах.
210 Asmody
 
07.10.19
15:08
Вот так можно сделать?
https://i.imgur.com/bTuIK4z.png
211 Bro
 
07.10.19
15:11
(209) А чем это отличается от формы под полем ввода? В смысле выпадающий список это просто форма без рамок. И основной фокус редактируемости строк, не в самом процессе редактирования, а в том что список показывается с учетом сделанных изменений, но не сохраненных в базу.
212 Asmody
 
07.10.19
15:12
(211) Так я у вас и спрашиваю. Как это сделать в 1С я знаю.
213 Bro
 
07.10.19
15:18
(212) Так ничем не отличается, поэтому обычно делается формой. Можно если сильно надо рамки сделать уже.

Может конечно когда-нибудь сделаем специальный стиль формы "dropdown" (без заголовка и линий), но пока смысла не видно зачем.
214 Devilment
 
07.10.19
15:29
(213) А мы вот не видим смысла, зачем динамические списки редактировать...
215 Asmody
 
07.10.19
15:30
(213) Отличается тем, что Ctrl+Down, Down, Down,...Down, Enter
216 Bro
 
07.10.19
15:31
(215) SPACE, down, down, down, CTRL+ENTER.
217 Asmody
 
07.10.19
15:52
А так можно сделать? https://i.imgur.com/eJLbyKA.png
218 pechkin
 
07.10.19
15:55
(210) а как ты такое сделал? или список форматирвоанную строку принимает нынче?
219 pechkin
 
07.10.19
15:56
(216) у вас выбор из формы не по ентеру?
220 Ёпрст
 
07.10.19
15:58
(0) не увидел в демке.. радиобуттоны есть ?
221 Asmody
 
07.10.19
15:59
(218) Список выбора у элемента УФ понимает
222 Bro
 
07.10.19
16:06
(217) С точки зрения контролов пока есть жесткий их выбор. Но тут проблема в том что таких как вы кинули контролов миллионы. Поэтому мы сейчас хитро делаем, реакт прикручиваем для рендеринга, и тогда можно как с отчетами, сохраняешь дизайн и любую React-компоненту вставляешь. Это даст просто дикую гибкость и позволит фронтенд в том числе делать.
(219) По ctrl+enter, так как enter ввод в поле. но можно перегрузить.
(220) Для этого просто BOOLEAN используется
PROPERTIES 'A' = (x()=T.A), 'B' = (x()=T.B), 'C' = (x()=T.B)
При нажатии на checkbox x() меняется на выбранное значение, а второе значение автоматически становится false и снимается
ну и смотри верхний ответ.
223 pechkin
 
07.10.19
16:07
(222) Это нужно будет еще и реакт знать?
Однако стек технологий и учебная курва для вашего языка все вышеи выше
224 Юрий Лазаренко
 
07.10.19
16:10
(223) А "учебная курва" это что?
225 Bro
 
07.10.19
16:11
(223) нет, если вам не нужно будет суперкастомный дизайн, парадигма будет старой ( как сейчас или в УФ) Но если захотеть, можно будет любой фронтенд прикрутить. Вплоть до классического интернет банкинга, за данные (state) при этом будет полностью платформа отвечать.
226 pechkin
 
07.10.19
16:12
(224) learning curve
227 Юрий Лазаренко
 
07.10.19
16:15
(226) Ишь как...
228 pechkin
 
07.10.19
16:17
(227) не читал ты в детстве компьютерру
229 Юрий Лазаренко
 
07.10.19
16:23
(228) В детстве я читал "Радио" и "ЮТ для умелых рук". Там такого не было.
230 Hillsnake
 
07.10.19
17:33
(224) напомнило Ну Масяня, стерва-курва… (С)
231 Ещё1
 
08.10.19
00:10
(139) Будет здорово если сможете реализовать синтаксис с точкой, т.е. Объект.Свойство вместо Свойство(Объект). Мало того, что многим ООП-стиль более привычен (1С-никам в т.ч.), так ещё и автодополнение можно будет использовать: набрал "Объект." и выпал список свойств.
232 Ещё1
 
08.10.19
00:14
(231) И заодно возможность набирать reserved words не КАПСОМ. Можете запретить идентификаторы, совпадающие с зарезервированными словами языка lsFusion, чтобы избежать ошибок. Но это даже набирать тяжело: надо держать левой рукой всё время Shift зажатым, остаётся правая рука для набора текста.
233 Злопчинский
 
08.10.19
00:28
? есть какой-нибудь функционал оформления и печати  путевых листов (пусть даже простых)
234 Злопчинский
 
08.10.19
00:29
? есть ли самый простейший вариант адрсеного учета - справочное хранение? (без количества, просто справочно в какой ячейке какие товраы хранятся).?
235 Злопчинский
 
08.10.19
00:30
есть ли поддержка ордерных складов? или чисто только учетная схема "приход-расход"?
236 Злопчинский
 
08.10.19
00:31
полностью ли реализована схема комиссионной торговли (как со стороны комитента, так и комиссионера)?
237 Злопчинский
 
08.10.19
00:32
есть ли учет факторинговых операций?
238 Злопчинский
 
08.10.19
00:33
есть ли полдная поддержка ВЭД (хотя бы тупо отражение операций по импорту с пошлинами, сборами).
239 Злопчинский
 
08.10.19
00:33
как отражаются допрасходы на доставку товара по поступлениям и по отгрузкам?
240 Злопчинский
 
08.10.19
00:35
есть ли анализ какие заявки покупателей (входящие заявки на отгрузку от нас-порставщиков покупателям) оплачены?
242 _DAle_
 
08.10.19
01:27
(232) Вкратце: ключевых слов у нас довольно много (сейчас около 400), многие из них вполне себе распространенные слова английского языка, запретить их все - это немного жестко. Более того, с текущей схемой мы при расширении языка и добавлении в него новых ключевых слов не нарвемся на потерю обратной совместимости. Возможно, мы сделаем что-нибудь в этом направлении, но там у каждого известного мне решения есть свои минусы.

Насчет набора кода.. Сейчас при наборе кода в IDEA на ключевые слова неплохо вроде бы работает автоподстановка, так что можно набирать начало ключевого слова маленькими буквами и затем нажимать "ввод". В таком случае не нужно вообще трогать shift
243 Ещё1
 
08.10.19
01:34
(242) Ясно, спасибо. 400 ключевых слов в языке это конечно жёстко, их же нужно помнить...
244 H A D G E H O G s
 
08.10.19
01:36
(242) Есть ссыль на типы данных?
Массивы, структуры, соответствия - вот это все.
245 Злопчинский
 
08.10.19
01:39
не понял как идейно сделать:
- есть на визуальной форме документ (тут вроде понятно)
- есть кнопка на форме
- жмакаем на кнопку - хотим получит эксельный файл в котором будет некая печатная форма неких данных (связанных с этим документом, например документ-основание) и эту печформу в формате экселя отправить по почте (автоматом, без всяих вопросов и визуальных форм, предполагаем что все данные есть и настроено).

каким образом формируется эксельная печформа? - запускается форма фузины (без визуального отображения), которая описывает шаблон печформы.. а дальше что - ?
246 Злопчинский
 
08.10.19
01:43
(98) "при этом предусмотрев возможность пользователю настраивать что угодно." - то есть я должен написать некий универсальный метаконструктор настроек отображения формы (как пример) - и написать такой метаконструктор на прикладном уровне?
247 Злопчинский
 
08.10.19
01:48
(135) то евть для рисования простейшей формы - джун в фузине должен иметь навыки программирования для извлечения и связи данных, составляющих источник для печатной формы? то есть по сути - знать всю фузину?
248 МихаилФ
 
08.10.19
04:20
(207) "Уточните какие именно его функции." Кого ЕГО? Вы вообще в курсе за СКД?
249 бегинер
 
08.10.19
07:58
(244) такое накопал:
Оператор STRUCT - создание свойства, которое создает структуру.

https://documentation.lsfusion.org/pages/viewpage.action?pageId=7012362
https://documentation.lsfusion.org/pages/viewpage.action?pageId=1572909
250 Devilment
 
08.10.19
08:03
(243) Кроме этих четырёхсот ты ещё должен знать много слов из Postgre...
251 ProgerVShapke
 
08.10.19
09:02
Может быть вопрос уже был, но лень читать все миллионы веток...
А почему вообще решили, что нужен ещё один конструктор типа 1с?
1С, как мне кажется, держит рынок за счет типовых решений. А конструктор (конфигуратор) это приятный бонус.
Если уж писать систему с нуля, то почему бы не выбрать js,java,python,c# или любой другой "типовой" язык?
Что фузина даёт такого, что на node.js, например, будет делаться через адские муки и миллионы человекочасов?
252 Devilment
 
08.10.19
09:15
(251) Более высокий уровень абстракции.
253 HeKrendel
 
08.10.19
09:16
Методология учета затрат на себестоимость материалов, товаров, готовой продукции, базы распределения статей затрат
254 Devilment
 
08.10.19
09:19
(253) Нет у них такого, для них себестоимость - это цена закупки.
255 ProgerVShapke
 
08.10.19
09:28
(252) например?
256 Bro
 
08.10.19
09:32
(231) Да, но там есть нюанс с тем что такой синтаксис пересекается с пространствами имен, и еще с парой мелких правил. Хотя пока как видится можно будет добавить, даже не нарушая совместимость, так что я думаю сделаем. Что касается completion, есть CTRL+ALT+W который делает что-то похожее, complete'ит именно выражение в коде, то есть пишите Документ, жмете CTRL+ALT+W и видите все свойства документа, набираете их, IDE сама скобки расставляет. Хотя да не привычно.

Вообще в будущем возможно еще инкапсуляцию и множественное объявление добавим:

CLASS A {
    quantity, stock, date = DATA LONG, Stock, DATE;
}

Но это все синтаксический сахар, и для модульных решений не так критичен.

(232) Уже говорили IDE комплитит, делали так, чтобы не заблокировать всякие распространенные слова вроде sum.
Но вообще есть простой способ, кто-то на хабре подсказал, сделать если module с маленькой то все слова с маленькой. Ну и естественно надо escape'инг идентификаторов будет добавить.
(243) В SAP и SQL емнип их около 1000. С другой стороны completion в каждом месте знает ключевые слова, плюс даже если "библиотечным стилем" делать, вам все равно придется помнить имена классов, методов, параметры и т.п. Плюс возможно мы еще CTRL+Q добавим, чтобы на операторе сразу документация подтягивалась, как в Foxpro когда то было.
257 Devilment
 
08.10.19
09:33
(255) Например, они скрывают от тебя взаимодействие клиента с сервером приложения, и сервера приложения - с СУБД.
258 _DAle_
 
08.10.19
09:33
(250) Ключевые слова postgresql вам понадобится знать только в редких случаях. Запросы руками в lsfusion не пишутся.
259 ProgerVShapke
 
08.10.19
09:36
(257) А в чём это хорошо? То есть платформа сама рулит тем, когда ей ходить на сервер и как, когда ей ходить в СУБД и как. В простейших случаях это прекрасно. Но если возникает проблема оптимизации? Например, расстояние до сервера 10000км. Пинг приличный. Ходить туда при каждом чихе получается долго и дорого, надо как-то оптимизировать клиент-серверное взаимодействие. А как?
260 Bro
 
08.10.19
09:37
(244) А они не нужны в lsFusion (по ссылке примеры с коллекциями):
https://habr.com/ru/company/lsfusion/blog/458376/#data
Массив / Список - это свойство (функция) с параметром INTEGER. Map<A, B> это свойство с параметром A и значением B. И т.п.
(245)
FORM myPrintForm
  OBJECTS d=Document
  ....
;

sendSomething(Document doc) {
    PRINT myPrintForm OBJECTS d=doc XLSX TO exportExcelFile;
    EMAIL TO 'myAdress' ATTACH exportExcelFile();
}

FORM documents
    OBJECTS d=Document
    PROPERTIES sendSomething(d)
;
261 ProgerVShapke
 
08.10.19
09:37
(257) И опять же непонятно тогда, а как рассчитывать ресурсы? Например, купим крутой сервер, а платформа начнет всё на клиенте делать. Как решать проблему?
262 ProgerVShapke
 
08.10.19
09:39
(257) или например такая ситуация. Мне надо получить какую-то таблицу из СУБД и выполнить некоторые операции. Допустим таблица большая. Тащить её из СУБД на сервер приложения более менее ок, тащить на клиент как-то не очень. Где будут выполнены операции?
263 Bro
 
08.10.19
09:43
(249) На самом деле этим функционалом мы очень давно не пользовались. Он вводился как костыль для GROUP MAX STRUCT(f(a),g(a)), но потом необходимость отпала когда GROUP LAST появился - GROUP LAST a ORDER f(a),g(a). Для него я не помню есть ли явные типы и т.п.
(250) Зачем?
(255) https://lsfusion.org/opportunities что из этого может обеспечить java/c# и т.п. из коробки?
(259) На клиенте платформа старается ничего не выполнять (если только явно не попросить). Количество раунд-трип вызовов минимизируется практически до абсолютного минимума, плюс все что можно сделать асинхронно, делается асинхронно.
(261) (262) На клиент ничего не тащится, он считается слабым звеном, так как нестабилен, не может шарить ресурсы с другими процессами и т.п.
264 Bro
 
08.10.19
09:46
(262) Более того даже с сервера БД на приложений очень редко что тянется, только если отчет отрендерить и клиенту отдать.
265 ProgerVShapke
 
08.10.19
09:48
(263) что вы подразумеваете как "из коробки"? Не из коробки, это нужно накодить причем на языке, который надо ещё выучить.
266 Bro
 
08.10.19
09:51
(247) Нет, там одна и та же логика везде. То есть изучаете три оператора, OBJECTS, PROPERTIES, FILTERS (хотя там изучать нечего, просто добавляешь их на форму). И можешь и интерактивные формы создавать, и печатные, и с CSV, XML, JSON и т.п. работать.
(265) Из коробки значит сделали
FORM f
    OBJECTS d=Document, dd=DocumentDetail
    PROPERTIES date(d), sum(d), любыеВычислимыеДанные1(d), любыеВычислимыеДанные2(dd)
    FILTERS document(dd) = d
;
А дальше оно все само. И ввод обеспечивает, и форму обновляет при изменении любых данных и при сохранить нажать в базу все записывает. И все в 4 строках кода.
267 Ещё1
 
08.10.19
10:16
(256) В Delphi к примеру если нужен идентификатор, совпадающий со служебным словом, ставим перед ним знак "&": https://imgur.com/a/Q0bSBzy Для справки, в Delphi "всего" 64 служебных слова.

Чтобы посмотреть параметры функции/метода, либо место определения идентификатора - просто наводим на него мышкой. Можно также во всплывающей подсказке показать выдержку из справки по этому идентификатору (Help Insight).

При наборе имени объекта и "." сразу же появляется выпадающий список его свойств. Можно продолжать набор, и список будет фильтроваться. Также можно вручную вызвать автодополнение нажатием Ctrl-Space: https://imgur.com/a/czvTsCe

Аналогично при наборе имени метода/функции и "(" сразу же всплывает списки параметров для всех вариантов этого метода/функции, с учётом перегрузок. Т.е. Delphi IDE очень хорошо заточено на ручной набор кода.

Понятно, что всё сразу сложно осилить, но это важно с учётом ориентации lsFusion на ручной набор кода, а не визуальный дизайн.
268 NoFusion
 
08.10.19
10:21
(266) А можете максимально подробно, как для новичков, объяснить что делает этот код и что при этом происходит на сервере приложения и в СУБД?
269 vitkhv
 
08.10.19
10:23
Читаю таблицу Сравнение платформ по возможностям и сразу в глаза бросается, что 1С не работает в ORM стиле?
А к какому стилю вы отнесете такие обращение к объектам БД?:
ПоступленияУТ = Документы.ПоступлениеТоваровУслуг.Выбрать(НачалоДня(ДатаНач), КонецДня(ДатаКон));
Пока ПоступленияУТ.Следующий() цикл
КонецЦикла;
270 Bro
 
08.10.19
10:28
(267) Вы видимо не видели что уже сделано в IDEA. Там это все есть, и completion и подсветка ошибок и куча чего еще

То есть пишете f(A a, B b) = набираете и она сама начинает подставлять только свойства с классами A или B, приоритезировать варианты и т.п. Да когда синтаксис "обратный" с композициями проблема, если нужно x(t(a)), то x не будет комплитится. Соответственно можно набирать сначала t, оно комплитится, а потом жать ctrl+alt+w и набирать x. Не очень привычно, и да при синтаксисе с точкой процесс эргономичнее был бы (но это допсинтаксис мы его доделаем)

Единственное до чего пока руки не дошли до CTRL+Q (помощь по синтаксису), но сделаем.
(268) Объявляет форму с двумя объектами (по умолчанию списками):
Документ и Строка документа.
Добавляет показатели на форму (в оба списка)
Показывает строки только верхнего выбранного документа.
(269) Там специальный тип Doc-style под 1С выделен, как микс. Но вообще конечно там надо переделать, по сути и Axapta и SAP и 1C это SQL-style, у них есть ORM-style но на практике он очень мало используется.
271 ДенисЧ
 
08.10.19
10:28
(269) В таблице сравнения с 1с - сплошная ложь. Не надо её читать.
272 NoFusion
 
08.10.19
10:32
(270) Еще подробнее, прямо построчно. Что такое d, Document и так далее. Откуда форма берёт данные? Что делает Filters?
273 vitkhv
 
08.10.19
10:33
(270) Довольно часто он используется на практике, когда нужно накидать что-то быстро, не важна производительность и особенно часто его любят использовать при COM соединениях (что мне потом отдают на оптимизацию).
7.7 - так это вообще торжество ORM, там фактически только ORM.
Ну и по остальным пунктам куча вопросов критических, особенно отсутствие чистого SQL в запросах.
274 vitkhv
 
08.10.19
10:45
(270) А 8.x все манипулирование данными INSERT, UPDATE суть ORM.
275 Bro
 
08.10.19
10:54
(272) Document - класс. d - имя объекта. Читает из базы. Фильтрует показываемые объекты на форме. Вот тут достаточно простой пример с пояснениями целиком
https://documentation.lsfusion.org/pages/viewpage.action?pageId=2228240
Тут по частям.
https://documentation.lsfusion.org/pages/viewpage.action?pageId=60555450

>> 7.7 - так это вообще торжество ORM, там фактически только ORM.
Для 7.7 - отдельная колонка (смотрите внимательнее).

>> особенно отсутствие чистого SQL в запросах.
Вот тут да, 1С надо в левую колонку к SAP переместить

>> А 8.x все манипулирование данными INSERT, UPDATE суть ORM.
Поэтому полностью в колонку к САП и Аксапта не переместишь. По сути чтение - SQL, запись - ORM. Но чтение все же важнее записи, так что все же в колонку SQL-style пойдет.
276 NoFusion
 
08.10.19
11:56
(275) То есть d - это набор экемпляров класса Document, получается?
277 Bro
 
08.10.19
11:58
(276) вроде того. но d - имя. Можно его не задавать и обращаться Document, но это просто неудобно.
278 NoFusion
 
08.10.19
12:05
(277) То есть, получается, в момент открытия формы из БД будут выбраны все документы с нужными реквизитами одним запросом, или платформа определит, что на форму помещается, условно, 20 записей, и при скролле для новых документов, появляющихся на форме, будет новый запрос к БД?
279 Bro
 
08.10.19
12:08
(278) Нет естественно, не все, то что влезет на экран + следующую страницу. По мере перемещения текущей записи дочитает остальные. Но можете поставить PAGESIZE 0 тогда все считает и на сервер лазить не будет.

Тут кстати важный момент сначала запросом читаются объекты, потом одним запросом свойства. Это позволяет "протолкнуть считанные объекты" в запрос свойств и считать их только для видимых объектов.
280 NoFusion
 
08.10.19
12:16
(279) А управлять количеством выбираемых записей можно программно, или платформа сама считает от разрешения экрана? И, если, допустим, у каждого документа по 100 тыс. детальных записей, в каждой по 30 полей, серверу БД не поплохеет от такой выборки?
281 Bro
 
08.10.19
12:22
(280) Опция PAGESIZE я же написал. Но по умолчанию платформа сама автоматически рассчитывает его от разрешения экрана. То есть чтобы влезло в грид + страница сверху / снизу для pagedown и pageup.
282 NoFusion
 
08.10.19
12:28
(281) Понял, я думал только либо 0, либо платформа сама. А на второй вопрос каков ответ?
283 Bro
 
08.10.19
12:33
(282) Про 100 тыс. детальных записей?

Ну так она считает первые 50 только, а остальные 99500 не будет. Или я не понимаю в чем вопрос?
284 NoFusion
 
08.10.19
12:37
(283) Вот у нас на экране - 50 документов, у каждого по 100 тыс. детальных записей - вопросы:
1. Сколько детальных записей будет считано.
2. Сколько детальных записей будет считано, если в документе есть вычисляемое на лету свойство - количество детальных записей.

Если ответ на оба вопроса одинаковый, то откуда тогда возьмется количество детальных записей
285 Bro
 
08.10.19
12:48
(284) То есть вы не про мой пример, а про:

count = GROUP SUM 1 BY document(DocumentDetail d);
FORM
   OBJECTS d = Document
   PROPERTIES (d) count
;

Она считает 50 записей документов. При подсчете count протолкнет туда предикат и в запросе будет что-то типа:
SELECT COUNT(*) FROM documentDetail dd JOIN view.id=dd.document GROUP BY dd.document
В этом случае, SQL сервер скорее всего количество записей индекса прочитает, но да в худшем случае пробежит по всем.

Но есть магия, добавляете в count MATERIALIZED:

count = GROUP SUM 1 BY document(DocumentDetail d) MATERIALIZED;

И все она достанет это поле прямо из базы. И к documentDetail обращаться не будет. И инкрементально будет сама обновлять count (причем опять таки не обращаясь к documentDetail, добавилась одна запись, просто count увеличит на единицу)
286 NoFusion
 
08.10.19
13:03
(285) Понятно, а где нибудь в документации это подробно описано? Если нет, то стоит описать, так как это достаточно неочевидные вещи, ведь, получается, неудачно выбранное для вывода в шапку группировочное свойство по детальным записям может создать в некоторых случаях проблемы.
287 Bro
 
08.10.19
13:10
(286) в документации естественно описано, но в разделе физическая модель. Собственно разработчики могут не заниматься premature оптимизацией управляя физической моделью. Теоретически этим может условный dba заниматься. Конечно было бы круче если бы платформа сама расставляла материализации (как и индексы, расположение в таблицах) в зависимости от статистики использования, но это дело будущего.
288 NoFusion
 
08.10.19
13:14
Ладно, пошли дальше - допустим, у нас форма вида master - detail, где  в detail  - строки детальных записей. В этом случае, получается, будет считано тоже 50 детальных записей? А если, допустим, в detail мы захотим изменить сортировку - считаются во временную таблицу на сервере СУБД все детальные записи, из них будет выбрано 50 первых по порядку сортировки, и только они уедут на сервер приложения и затем на клиент? А на СуБД временная таблица будет уничтожена?
289 NoFusion
 
08.10.19
13:15
(287) Сама хорошо, конечно, но для начала неплохо было бы хотя-бы предупреждение разработчику выдавать в таких случаях, что, например, неплохо было бы это свойство материлизовать.
290 HeKrendel
 
08.10.19
14:04
С Себесом инфы не подвезли? А не то ваши ИНсерты прямо очень интересны и за 4к сообщений уже немного поднадоели
291 CrushBy
 
08.10.19
14:17
(290) Это вопрос к конфигурации, а не платформе. Как сделаете, так и будет.
292 Bro
 
08.10.19
14:18
(253) (290) В платформе? Нет. Это вообще ветка про платформу.
(288) Причем тут временная таблица? Она сразу делает запрос с LIMIT'ом, если есть индекс СУБД пробежит по первым 50 записям и вернет их. Нет, сделает sort внутри (никакой времянки все равно не будет), но это уже к СУБД вопрос.
На сервер приложений, а дальше клиент только 50 едут.
(289) Ну вы заранее не знаете, как часто будет форма использоваться, сколько записей будет считываться и т.п. То есть эта задача эквивалентно автоматическому определению материализаций.
293 NoFusion
 
08.10.19
14:28
(292) В теории да, а вы с профайлером всё это гоняли для всяких разных случаев? Если нет, то тоже было бы неплохо погонять и результаты выложить, всё полезнее, чем с 1С-никами сраться :))

А про второй вопрос - ничего вам не мешает запилить режим проверки конфигурации, с варнингами для разработчика, если платформе что-то покажется подозрительным, даже если это разработчик так задумал :)) Некий упрощённый вид статического анализатора.
294 NoFusion
 
08.10.19
14:29
(291) А как вы будете СЛАУ решать на вашей платформе?
295 CrushBy
 
08.10.19
14:32
(294) Если понадобится, то на Java или PostgreSQL в отдельном модуле. В нем появятся новые свойства и действия, которые потом разработчик при желании сможет использовать.
296 NoFusion
 
08.10.19
14:33
(295) И сколько времени, думаете, у вас это займёт в человекочасах, ну хоть примерно?
297 Bro
 
08.10.19
14:44
(296) ну минут 10:
http://commons.apache.org/proper/commons-math/userguide/linear.html
https://mvnrepository.com/artifact/org.apache.commons/commons-math3/3.2

В pom прописывается

<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-math3 -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-math3</artifactId>
    <version>3.2</version>
</dependency>

И вперед, математическая библиотека по подсчету чего угодно уже в проекте
298 Мэс33
 
08.10.19
14:46
(297) кстати тестами покрываете продукт?
299 Ещё1
 
08.10.19
14:47
У вас в команде кто-нибудь пользуется тёмной темой оформления в IDEA? Низкий контраст текста по-умолчанию, без поднастройки никак. https://imgur.com/a/keKf99A

Всплывающие подсказки пока отсутствуют, те что есть - неинформативны ("Implicit declaration"?).

Свёртывание блоков кода не работает, или я не знаю как его готовить (в IDEA новичок). Ведь пометки типа //#game - //#game end для свёртывания кода?

В модуле HockeyStats мне кажется есть небольшая ошибка, надо исправить идентификатор
CONSTRAINT hostTeam(Game team) = guestTeam(team)...
на
CONSTRAINT hostTeam(Game game) = guestTeam(game)...

Есть ли специализированный форум для комьюнити lsFusion для общения? Всё-таки mista.ru не совсем то. Если только хозяева этого сайта не решили расширить сферу деятельности.
300 NoFusion
 
08.10.19
14:49
Ладно, идём дальше. Я могу на основании xsd-схемы как-то сгенерировать класс, например, и вывести его на форму? Или всё руками делать надо?
301 NoFusion
 
08.10.19
14:51
(299) Хозяева сказали - "пусть расцветают все цветы", так что - кто его знает :))
302 Bro
 
08.10.19
14:52
(299) Да, темной темой пользуются у нас мало кто, надо будет подстроить, спасибо.

Там warning'ов и ошибок много поддерживается, Implicit declaration один из них, да сейчас изменим название. Например при записи на несоответствие типов. Или что вы под всплывающими подсказками имеете ввиду?

Да, наверное, сейчас глянем.

Мы используем slack.lsfusion.org. Но вот и на мисте теперь :)
303 Bro
 
08.10.19
14:53
(300) Пока сделана в IDE генерация по XML и JSON формы и свойств. Но есть куча готовых генераторов по XSD - XML. То есть генерите XML, а потом остальное.
304 NoNoFusion
 
08.10.19
14:58
(303) Пальцем покажи, где именно, плиз.
305 _DAle_
 
08.10.19
15:02
(299) >Свёртывание блоков кода не работает, или я не знаю как его готовить (в IDEA новичок). Ведь пометки типа //#game - //#game end для свёртывания кода?

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

>Есть ли специализированный форум для комьюнити lsFusion для общения?

Заходите в наш slack: lsfusion.slack.com
306 Ещё1
 
08.10.19
15:02
(295) А не рассматривали возможность вместо собственного языка lsFusion использовать Java, но со своими добавками, типа LINQ в C#? Разработчиков на Java пруд пруди, им только въехать в специфику бизнес-приложений и СУБД.
307 NoNoFusion
 
08.10.19
15:05
(305) Так там регаться надо хрен пойми в чём, сделаёте уж в Телеге, как все нормальные люди :))
308 _DAle_
 
08.10.19
15:09
(307) telegram - instant messenger, slack - это исходно корпоративный чат. slack намного больше подходит для обсуждений и обмена исходным кодом (как минимум).
309 Bro
 
08.10.19
15:13
(304) В меню сверху: LSF -> Generate FORM
(306) Язык очень сильно отличается. Ну прям вот совсем. Он гораздо декларативнее тех же Java и C#. И действия в нем это 10-15% всего кода. А в Java и C# по сути 97%

Ну и скажем:
FOR f(A a, g(c(B b))) DO
    t(a) <- b;
непонятно как бы выглядел.

То есть это было бы скрещивание ежа с ужом.

(307) Там веб-версия есть где можно ничего не ставить, но может да, надо еще и мессенджеровый канал сделать
310 _DAle_
 
08.10.19
15:18
(306) Это долгий разговор, который обычно называется "DSL vs eDSL". Если вкратце, то у нас в платформе есть много абстракций, которых нет в java, и даже с очень продуманным java-интерфейсом задания этих абстракций, будет намного менее удобно. Более того, java-программистам все равно нужно для начала понять "парадигму", а это одинаково что с DSL, что с eDSL.
Вообще, если уж делать eDSL, то точно не на java - это один из худших языков для этого, тут хотя бы Kotlin нужен, да и то.. В java часть вещей была бы в строковых константах, да и не было бы такой поддержки IDE, как сейчас есть у языка lsfusion. Это если вкратце, тема, конечно, куда обширнее для обсуждения, начиная с того, что вообще платформа не для java-программистов предназначена.
311 _DAle_
 
08.10.19
15:25
(305) Ошибся с ссылкой. slack.lsfusion.org
312 edem911
 
08.10.19
16:29
Главный вопрос жизни, вселенной и всего такого: Сколько стоит ERP lsFusion, та что в демо-доступе?
313 Джо-джо
 
08.10.19
16:30
(312) 0
314 CrushBy
 
08.10.19
17:27
(312) Она коммерческая. В ней еще нету локализации под российское законодательство, так что прайс назвать не могу. Платформа - бесплатна и может использоваться в коммерческих решениях.
315 МихаилФ
 
08.10.19
18:08
(314) Опа, так в ней еще и нету ничего... а чего же мы тут все обсуждаем?
316 IamAlexy
 
08.10.19
18:11
(315) убийцу 1С вестимо..
317 PR
 
08.10.19
18:15
(315) Для размытых неконкретных вопросов OFF: lsFusion vs 1C
318 Asmody
 
08.10.19
23:18
Наконец-то осилил обе статьи с описанием языка на Хабре.
Что могу сказать?
Вы весьма крутые и очень упоротые. И, кажется, начинаю по-немногу вкуривать идеологию языка. Замешать в кучу декларативное и функциональное программирование – это смело. Мозговыворотно, но очень смело.
Вообще, чувствуется под всем этим серьезная академическая работа. Я такой подход на уровне _концепций_ только в университетской среде встречал.
В общем это – снимаю шляпу!
319 Злопчинский
 
08.10.19
23:20
(263) "На клиенте платформа старается ничего не выполнять (если только явно не попросить)."
- внезапно выясняется, что на клиенте все-таки не только чистый рендеринг, но еще какая-то чисто клиентская работа может выполняться (не будем говорит что это тождественно 1С на клиенте), но все же...
то есть - при необходимости - можем управлять клиентом вручную?
320 Злопчинский
 
08.10.19
23:26
Вопрос: если есть чел готовый "заехать" под фузину и начать на ней прогать как джун с возможным выходом в мидла/синьора, причем только удаленно и только под вас (ну по крайней мере на начальный длительный период, а то и на постоянку? причем сильный как программист и незамутненный 1Сом и силен в вопросах использования БД и всякое такое) - вы готовы его взять и платить ему? отвечать можно в личку в телегу @Dobrop или скайп Zlopun. Спасибо.
321 _DAle_
 
09.10.19
01:33
(318) Спасибо, что потратили наверняка довольно много времени на прочтение этих статей, все же это непросто прочитать их целиком. Только хотел сказать, что статей с описанием языка на Хабре три:
Логика предметной области: https://habr.com/ru/company/lsfusion/blog/458376/
Логика представлений: https://habr.com/ru/company/lsfusion/blog/460141/
Физическая модель: https://habr.com/ru/company/lsfusion/blog/460887/
Уж не знаю, обрадует это вас или расстроит :)
322 Ещё1
 
09.10.19
01:46
Посидел тут вечерком с IDEA и накидал решение для тестовой задачи http://luxsoft.by/rabota-v-komande/
Решение минималистическое, только по указанным явно требованиям в задании.
Вот тут: https://pastebin.com/JuReq5Lv

Что хочу сказать, из плюсов:

1. Минимум дубляжа в коде. Один раз описываешь объект со свойствами (таблица со столбцами в терминах БД) - и всё, больше никаких самоповторов, никаких копирований из базы в форму, из формы в какие-то внутренние структуры для обработки и т.п.

2. Если ориентируешься теории реляционных баз данных, отлично знаешь SQL, знаком с функциональным подходом в программировании - то проблем не будет. Иначе придётся попотеть и вспомнить или изучить.

3. Из 1. и 2. следует, что работая с lsFusion приходится больше думать и анализировать, чем печатать и копировать куски кода. Но зато код получается компактным.

4. После компиляции получаешь сразу готовые программы под Windows и Web. Иди и устанавливай клиенту.

Минусы также есть. Но это не серьёзные проблемы, а скорее мелкие недостатки, вызывающие раздражение. Они есть и в IDE при наборе текста и отладке, в документации, и в скомпилированной клиентской программе. Возможно, часть из них вызвана непривычностью как языка, так и IDEA, а часть вполне объективны. Мы разбалованы качественными IDE типа Delphi и Visual Studio, с подробнейшей документацией, с большими коммьюнити и тоннами примеров кода. Так что lsFusion есть куда стремиться.
323 Ещё1
 
09.10.19
01:51
(322) Забыл ещё добавить плюс

5. При доработке проекта под себя можно писать код в новых модулях, добавляя свойства в классы (поля в таблицы в терминах БД), дополняя готовые формы приложения, при этом не меняя старый код. Т.е. с точки зрения 1С-овцев, можно дополнять конфигурацию поставщика, не изменяя её, а только дополняя/заменяя, где это необходимо заказчику.
324 Злопчинский
 
09.10.19
02:17
(321) не забудьте перенести на сайт в раздел типа "практика программирования" (я выше писал пожелание)
325 Злопчинский
 
09.10.19
02:22
(322) было бы хорошо, чтобы накидал это же задачу-решение на 1С8.
и даже может бы сравнил их по собственным ощущениям процесса разработки. затрат времени (с учетом знаний каждого инструмента), удовлетворенности результатом и прочее еще.
было бы полезно.
326 Злопчинский
 
09.10.19
02:24
(322) возможно не в тему, но как это решение задачи в итоге визуально выглядит?
оно самодостаточное для визуализации или плагин к уже готовому тестовому примеру?
327 НиколаевГ
 
09.10.19
07:52
(322) О, ты меня прям вдохновил один мини-проектик на фузине сделать :))
328 НиколаевГ
 
09.10.19
07:56
Фузиновцы, как у вас подключить устройство, которое в винде видится как COM-port, выставить параметры порта, и при открытии определенной формы ждать события от устройства, по которому обработать и записать в БД полученные из порта данные? Есть что-то готовое, чтобы не с нуля писать?
329 Salimbek
 
09.10.19
08:51
(328) Я спрашивал на счет работы с Торговым оборудованием - ответ был такой:
" Торговое оборудование только в десктоп клиенте. Там очень забавно сделано, десктоп-клиент абстрактный (одинаковый для всех), но умеет забирать и classload'ить классы с сервера. Поэтому на сервере на java есть классы работы с оборудованием, например:
https://github.com/lsfusion-solutions/erp/blob/master/erp-logics/src/main/java/lsfusion/erp/region/by/machinery/cashregister/fiscalshtrih/FiscalShtrih.java "
Тут: Очередной убийца 1С - lsfusion, Часть 3
330 Salimbek
 
09.10.19
08:53
+(329) Т.е., чисто теоретически, даже если в фузине нет ничего такого, что тебе хочется, то можно по аналогии написать на Java и обвязать вокруг фузиновским кодом.
331 НиколаевГ
 
09.10.19
08:59
(330) Для такой фигни на Java что-то выглядит как из пушки по воробьям. К тому-же, у меня не стандартное устройство, а самоделка, которая в 1С работает через NativeAPI драйвер сканера штрихкода.
332 Asmody
 
09.10.19
09:06
Но ребусы, типа "RECURSION 1 AND child IS ItemGroup AND parent = child STEP 1 IF parent = parent($parent)" - это ж чокнуться можно!
333 Ещё1
 
09.10.19
09:07
(325) На 1С это выглядело бы как создание нескольких зависимых справочников с формами выбора и просмотра, и пары документов с формами ввода. Хотя можно было бы ещё добавить регистр для накопления статистики по хоккейным матчам, но на такой мелкой задаче это overkill и выход за рамки поставленной задачи.

(326) Я всё сделал в отдельном модуле (по ссылке), не меняя исходный модуль. Т.е. в проекте "Турнирная таблица" к демонстрационному модулю HockeyStats, прикладываем написанный мной модуль Plus, компилируем и запускаем. Я специально сделал отдельным модулем чтобы посмотреть, получится ли так. Потому что в 1С мы знаем при обновлении платформы часто сложно совместить свои наработки с новой конфигурацией поставщика. А когда весь свой код лежит отдельно, проблем нет.
334 Ещё1
 
09.10.19
09:13
(327) Я тоже думаю, может в Фузине попробовать сделать простенькое Web-приложение для размещения заказов клиентов, с импортом-экспортом в нашу 1С УТ. Когда время свободное появится...
335 Asmody
 
09.10.19
09:15
(322) [следует, что работая с lsFusion приходится больше думать и анализировать, чем печатать и копировать куски кода. Но зато код получается компактным. ] - это вообще хорошее свойство функциональных и декларативных языков. Приходится думать в терминах "что должно получиться в результате", а не "как это сделать по шагам". Традиционное программирование, да и "жизненный опыт" в целом затачивает мышление на императивный стиль. И перестраиваться весьма не просто.
336 Asmody
 
09.10.19
09:17
Парни, вам надо со стороны веб не попсовый React прикручивать, а что-нибудь такое же мозговыкрутательное, типа elm.
337 Ещё1
 
09.10.19
09:20
(332) Да, это рекурсия как она сделана в SQL. С наскока не понять. Вот пример для PostgreSQL: https://habr.com/en/post/269497/
338 Bro
 
09.10.19
09:37
(318) Так получилось, что в команде есть крутые информатики, крутые математики, а еще на них деньги блин надо зарабатывать на конкурентном бедном рынке. И это вылилось в условия, где как раз академические подходы не прокатят, а соревноваться с крупняками "в ширину" бесмысленно. Пришлось идти в глубину: никаких дублирующих абстракций, все должно быть максимально выверено и четко, четкий стек, каждое понятие строится на предыдущем, не переписывать то что есть, а использовать все готовое, ну и т.п.
339 Bro
 
09.10.19
09:39
(319) Для десктопа есть клиентские действия, но они используются только для оборудования. В вебе они не работает, но там такая песочница что и не разгонишься. В будущем подключим реакт причем практически бесшовно для тонкой фронтендовой настройки (что кстати в SAP/Axapta/1С практически нереально реализовать).
340 Bro
 
09.10.19
09:40
(320) Я более того скажу, мы ищем таких людей: https://news.tut.by/press/656172.html
341 Paint_NET
 
09.10.19
09:41
>(что кстати в SAP/Axapta/1С практически нереально реализовать)

Вы не спецы ни по чему из перечисленного, зачем такие бессмысленные и глупые заявления? Вот тупо не писать то, что в скобках - никак?
342 НиколаевГ
 
09.10.19
09:41
(340) Вопрос был про удалёнку :)
343 Ещё1
 
09.10.19
09:44
(336) "Добей меня танцем!" (С) Дети лейтенанта Шмидта. :)
344 Джо-джо
 
09.10.19
09:45
(340) (340) На базе платформы разработано и первое крупное бизнес-приложение для торговли — lsFusion ERP. Сейчас это решение успешно внедрено на многих крупных предприятиях торговли и сферы услуг. Программа оптимизирована и подтверждена возможность одновременной работы в ней более тысячи пользователей. На сегодня мы — лидеры в сегменте рынка автоматизации розничных сетей в РБ и работаем с лидерами

А где можно посмотреть ваше портфолио? Список этих крупных предприятий и розничных сетей
345 Джо-джо
 
09.10.19
09:53
+отзывы от топов по выполненным проектам
346 Bro
 
09.10.19
09:59
(322) Если бы вы привыкли к IDEA, вопросов бы не было, там все по аналогии. Например Structure или Hierarchy, ну и вообще все остальное (нестандартное там Design, Dependencies, нюансы в дебаггере и т.п.).
(325) Мы скорее сделаем обратное, возьмем эту штуку:
https://github.com/1C-Company/dt-demo-configuration
и сделаем ее на lsFusion и статью на хабре выложим (или на инфостарте, но не уверен что там можно)
(328) CrushBy ответит. Знаю что с COM'ом периодически интегрировались. Там есть готовые модули функции.
(335) То что перестраиваться не просто, есть такое. Но это скорее сводится к возможности и желанию учиться. Я периодически когда пишу на lsFusion, ощущения - очень забавные (я то на Java в основном пишу). Но академический интерес в нашей стране штука редкая. Возможно на западе с этим получше.
(336) Я с elm плохо знаком (надо будет глянуть). Но реакт как будто создан для lsFusion. Реакт обеспечивает реактивность на клиенте, а lsFusion на сервере. Вот пример (если не видели, кстати к той же hockeystats демке подключается):
https://codesandbox.io/s/1y0o894rx4
(332) Ну да, она на самом деле не проще SQL'ых. И это я когда писал уровни разработчиков тут самый высокий уровень, даже мне тяжело дается (хотя я в ее реализации участвовал). Но на практике берут основные примеры использования и опытным путем меняют под задачу. Кстати ее прикол в том что она очень хорошо инкрементируется (оптимизируется ее выполнение), на уровне GROUP SUM (а это самые хорошо инкрементируемые операторы)
(341) Я просто представляю какой уровень декларативности (абстрагирования для этого нужен). Хотя да, скорее всего погорячился. Извиняюсь.
(342) Пока у нас опыта мало (хотя как раз с российскими проектами так и работаем). Но готовы рассматривать.
(344) https://luxsoft.by/klienty/ и в новостях те что в процессе. Мы делали пару бумажных отзывов для какого-то тендера, говорили о том, чтобы выложить на сайт (не знаю сделали или нет). Но самый лучший реф - это личный отзыв, и если реально кому интересно, можем дать в личку.
347 НиколаевГ
 
09.10.19
10:08
(346) Про COM-port вопрос принципиальный, если с этим какие-то проблемы, например на Java писать надо :), то не будет у меня проектика :)
348 CrushBy
 
09.10.19
10:23
(347) В общем, в самой платформе этого нет, но есть в ERP.

Нужно будет использовать 3 файла :
https://github.com/lsfusion-solutions/erp/blob/master/erp-logics/src/main/lsfusion/daemon/ScannerDaemon.lsf

Там объявляются параметры ком-портов и добавляется действие scannerDaemon, исходный код которого вот здесь :
https://github.com/lsfusion-solutions/erp/blob/master/erp-logics/src/main/java/lsfusion/erp/daemon/ScannerDaemonAction.java

Оно пересылает на клиент Java класс, который там выполняется :
https://github.com/lsfusion-solutions/erp/blob/master/erp-logics/src/main/java/lsfusion/erp/daemon/ScannerDaemonClientAction.java

Внутри этого класса есть метод connect, который запускается, обрабатывает события с COM-порта (по сути просто считывает оттуда что пришло) и вызывает метод :
eventBus.fireValueChanged("SCANNER", value);
Собственно, предполагается, что на Java изменяется внутренний обработчик, чтобы принять данные с ком-порта, преобразовать, если надо и вызвать нужное событие.

Дальше просто на уровне lsFusion при объявлении свойства добавляется метка EVENTID 'SCANNER', и с точки зрения разработчика, событие из ком-порта (сканера) будет равносильно тому, что пользователь на форме отредактировал это свойство на значение  value.
349 Bro
 
09.10.19
10:26
(348) Я кстати задумался почему эти классы не в платформе в Utils. Надо будет перенести туда.
350 CrushBy
 
09.10.19
10:30
(348) Точнее неправильно выразился, писать в Com порт есть модуль в платформе :
https://github.com/lsfusion/platform/blob/master/server/src/main/lsfusion/utils/Com.lsf

А вот, чтобы читать пока нет.

(349) Да, можно. Только там различные устройства любят слать всякую ерунду, или присылать данные с задержками в произвольном порядке. Непонятно, что считать завершением ввод с COM-устройства. Так что в ряде случаев все равно придется пользоваться Java. Но, какой-то простой случай можно поддержать.
351 НиколаевГ
 
09.10.19
10:31
(348) Сложно как-то, а есть готовый коду уже на языке платформы, без необходимости с вызовами явы копаться.
352 pechkin
 
09.10.19
10:31
(350) а как сканеры штрихкодов у вас работают?
353 НиколаевГ
 
09.10.19
10:36
(350) Я знаю, что мне с ком-порта придёт, мне просто надо пробросить в форму всё, что приходит с него.
354 CrushBy
 
09.10.19
10:44
(352) Собственно это и есть в ERP обработчик событий со сканеров для подключения сканеров.

(353) Так вот конкретно это Java действие как раз это и делает. Оно просто слушает COM-порт. Видит, что пришел какой-то символ (event.isRXCHAR()) . Ждет 50 миллисекунд (так как сканнер может не сразу все прислать) (Thread.sleep(50)), а потом считывает весь буффер (portBytes = serialPort.readBytes()), и вызывает событие изменения свойства на все, что считал (eventBus.fireValueChanged(SCANNER_SID, barcode.trim())). Если Ваше устройство так и работает, то в Java коде ничего править не придется. Просто подключаете в проект эти 3 файла и пользуетесь. Для начала постройте интерфейс, в котором будет свойство, куда пользователь сможет вводить вручную. А потом просто к его объявлению в конце добавьте EVENTID 'SCANNER'. И тогда при событии с COM-порта туда "запишется" считанное значение, как будто пользователь ввел его вручную.

Да, и все это работает только в Desktop-клиенте.
355 НиколаевГ
 
09.10.19
10:51
(354) То есть, по сути, у вас работа с ком-портом в режиме эмуляции клавиатуры организована. Т.е. чтобы получить данные в поле, надо чтобы фокус ввода на этом поле был?
356 pechkin
 
09.10.19
10:53
(355) нет, ты не правильно понял
357 НиколаевГ
 
09.10.19
10:54
(356) Возможно, я в яве ничего не понимаю, от слова совсем :)
358 CrushBy
 
09.10.19
10:56
(355) Там не в Java вопрос. Java просто шлет на специальную "шину" событие. Дальше платформа на форме находит видимое свойство с соответствующим EVENTID и вызывает для него то же событие, что ручное изменение пользователем. При этом не важно, где находится фокус на форме (но важно, чтобы форма была активной и свойство было видимым).
359 Bro
 
09.10.19
11:02
(358) >>свойство было видимым
Вот это кстати не факт, но надо смотреть.
360 Bro
 
09.10.19
11:18
(322) Вот зачем вы выложили правильное решение (совсем детали я после посмотрю, но в целом вроде ок). У нас же тестовое задание :(

Но кстати что интересно. Класс Player вы назвали 'СоставЫ команд', а Goal - 'Гол'. Очень часто те кто присылают решение, называют классы во множественном числе, это весьма забавно с точки зрения того что у людей происходит в голове. Потому как сам класс называют в одиночном числе, так как
player = DATA Players (Game) выглядело бы странно.
361 Ещё1
 
09.10.19
11:26
(360) Я на самом деле сделал для вас услугу: можете сравнивать мой код с присылаемым от конкурсантов. Ведь задачу можно решить многими способами, зато любителей списывать не думая сразу можно вычислить и отсеять. :) Тем более что решение не самое идеальное, писал на коленке, пробуя разные подходы в платформе. Например, можно было бы сделать всё в одном окне, но сделал отдельное окошко для бомбардиров турнира, чтобы попробовать.

Я видел этот момент со множественным числом. Чего-то подумалось, что список игроков с подписью "Игрок" выглядел бы странно, переделал подпись на ту, как в задании.
362 CrushBy
 
09.10.19
11:37
(361) Да, на самом деле, решение все равно неполное. Обычно мы еще просим настроить дизайн формы (чтобы вводились голы в одной основной форме). Плюс еще в нем нету связи голов для матча и голов, введенных вручную. То есть счет может быть 3:2, а голов будет введено 4. Там тоже есть много вариантов решения (начиная, через CONSTRAINT, событие, изменения способа подсчета голов и т.д.).
363 Ещё1
 
09.10.19
13:21
(362) Да, я знаю. Вчера поздно вечером писал, не было времени все CONSTRAINTS прописать, и красиво расположить на форме. Но я же не для конкурса писал, а чтобы понять "что за зверь такой lsFusion".

Если интересно, пара моментов с точки зрения стороннего наблюдателя, что вспомнил, в произвольном порядке.

IDE и язык

- При переименовании модуля (Refactor - Rename) название в заголовке MODULE остаётся.
- В языке есть подстановочные поля (или свойства, не знаю как правильно в терминах lsFusion). Типа teamName 'Команда' (Player player) = name(team(player)); IDE выводит на лету для них тип и вставляет в редактор ("-> STRING[30] ="). Эта вставка не всегда обновляется при редактировании свойства. Пару раз пришлось закрыть - открыть проект.
- При наборе выражений типа "name(team(player(goal)))", после набора "(" IDE иногда невпопад вставляет скобку ")". Возможно, это зависит от способа набора, потому что мне с ООП-бэкграундом проще идти от уже заданного в левой части объекта "goal", потом посмотреть его определение и добавить связующее свойство "player(goal)", потом опять сбегать в определение и добавить следующее свойство в цепочке "team(player(goal))", и наконец выбрать то что нам надо "name(team(player(goal)))".
- Почему в CONSTRAINT используем оператор "=", а в FILTERS - "=="?
- Если в модуле есть ошибка, IDE подчёркивает её красной волнистой линией. Но когда делаем Recompile или Build, проект компилируется, внизу написано "Loaded classes up to date. Nothing to reload." И на этом всё. IDE не переходит на строку с ошибкой и не выделяет её цветом. Ошибка обнаруживается только в момент запуска сервера командой Run или Debug. Причём её нужно искать в консоли, среди прочих строк.
- По стилю написания, зачем-то свойства в примерах описываются в одну длинную строку. В IDE Right Margin'ы не просто так сделаны. И не у всех очень широкие рабочие мониторы.

Клиентское приложение

- Мелкий текст в клиентском приложении, не всем подходит. Если в Web-клиенте в браузере это не проблема (в Опере увеличить масштаб), то в Windows-клиенте простого решения не нашёл.
- В процессе разработки 2 раза слетело содержимое таблицы Player (после перезапуска приложения). Кнопку Save перед остановкой сервера нажимал. В зависимой от неё Goal вместо игроков появлялись "Not defined". Не разобрался, с чем связано.
- Если в одной из открытых форм (в одном клиентском приложении) есть зависимые данные, то они обновляются только после проталкивания изменений в основном окне в базу кнопкой Save. В моём примере форма "Таблица бомбардиров" обновлялась, только после сохранения изменений в форме "Турнирная таблица". Причём мало было переключиться на форму "Таблица бомбардиров", нужно щёлкнуть по таблице "Лучшие бомбардиры" в любом месте.
- Пользователь может открыть множество одинаковых форм. Можно ли как-то вместо открытия нового экземпляра формы переключать его на уже открытый?
- Набираем данные в таблицу клавиатурой. Как, редактируя ячейку со связанным списком значений, открыть окно выбора значения из списка? Клик мышкой работает, а с клавиатуры? Пробовал Enter, Ctrl-Enter, F4 как в 1С не работает. Оказалось надо просто нажать в этом поле любую алфавитно-цифровую клавишу. Почему так сделано - непонятно. Ведь нажатие алфавитно-цифровой клавиши в обычной ячейке приведёт к замене текста в ней на введённый символ. Т.е. при быстром наборе таблицы нам надо помнить, где просто текст или число, а где связанный список.
- В выпадающем списке подбора можно делать произвольные манипуляции с данными: удалять, редактировать. Это неправильно и чревато случайными ошибками. Окошко выбора должно быть максимально простым, со списком без возможности редактировать, сохранить в Excel и т.п.
- Нажатие кнопки Delete под таблицей приводит к немедленному удалению строки. Это неправильно. Случайное такое нажатие удалит не только сроку в текущем справочнике, но и все ссылки на удалённое значение во всех справочниках и документах. Представьте, в течение одной сессии вы набрали много данных, нажали случайно Delete - и слетела информация в куче связанных документов, в том числе проведённых. Да, если вовремя заметишь неладное, можно нажать кнопку Cancel в окне и вернуться к тому, что было. При этом придётся набирать всё заново.

Не воспринимайте эти замечания как "наезд". Это скорее предложения как сделать лучше с точки зрения программиста и пользователя.
364 Ещё1
 
09.10.19
13:45
(363) Вообще, что касается редактирования табличных данных, можно посмотреть как это сделано в Excel, Access. Это программы, которыми сейчас пользуются везде в офисах, их знают даже секретарши - скопируйте внешний вид и поведение, и пользователи будут аплодировать. Возьмём Access: черезстрочное выделение цветом, лёгкое изменение ширины столбца мышкой, перетаскивание столбцов, сортировка и фильтр спрятаны в маленьких кнопках в заголовке (не загромождается экран), текущая запись, общее количество, кнопка отключения фильтра внизу. Можно добавить сумму, среднее значение как в Excel.

Многое можно также почерпнуть из 1С. Да, у них устаревшие подходы в разработке и древний язык. Но вот над GUI они очень хорошо поработали. Если скрестить одно с другим получится бомба.
365 Злопчинский
 
09.10.19
13:52
(340) "собеседование в офисе компании" - это обязательное условие? удаленно никак?
366 Злопчинский
 
09.10.19
13:54
А как идейно выглядит такая штука у вас как
допустим, список товаров, визуальная форма. Идем по списку курсором, на визуальной форме для текущего товара показывается картинка товара?
367 Злопчинский
 
09.10.19
13:57
минипредложение: как-то с терминологией определиться: чтобы когда говорим\пишем "форма" - имеем в виду визуальную форму, а не FORM (можно и FORM писать но неудобно в обсуждениях раскладку переключать), упомянутый выше "схема" было бы проще для обозначения ваших FORM.
368 Злопчинский
 
09.10.19
13:58
кстати, можно ли у вас сохранить старое FORM в платформе для совместимости, и юзать синоним типа SHEMA?
369 Злопчинский
 
09.10.19
13:59
а поддерживает ли платформа позиционирование в в визуальных списках по первым набираемым буквам в текущей колонке?
370 _DAle_
 
09.10.19
14:02
Небольшие пометки по пунктам к IDE.

>- При переименовании модуля (Refactor - Rename) название в заголовке MODULE остаётся.

Дело в том, что пока у нас нет такого требования, чтобы имя файла совпадало с именем модуля.

>- Почему в CONSTRAINT используем оператор "=", а в FILTERS - "=="?

В качестве оператора сравнения у нас можно использовать и "==", и "=" (что мне лично, например, не нравится).

>- Если в модуле есть ошибка, IDE подчёркивает её красной волнистой линией. Но когда делаем Recompile или Build, проект компилируется, внизу написано "Loaded classes up to date. Nothing to reload." И на этом всё. IDE не переходит на строку с ошибкой и не выделяет её цветом. Ошибка обнаруживается только в момент запуска сервера командой Run или Debug. Причём её нужно искать в консоли, среди прочих строк.

Для того, чтобы получить список всех ошибок, найденных IDE, можно использовать команду LSF|show errors (ctrl+alt+shift+e).
371 _DAle_
 
09.10.19
14:04
(363) Да, забыл написать, спасибо большое за перечисленные моменты.
372 Ещё1
 
09.10.19
14:11
(369) Нет, в lsFusion либо начнётся редактирование текущей ячейки, либо откроется окошко подбора значения из списка. Поэтому я и написал (364)
373 _DAle_
 
09.10.19
14:18
(368) Да, теоретически это возможно.
374 Bro
 
09.10.19
14:24
>>- В языке есть подстановочные поля (или свойства, не знаю как правильно в терминах lsFusion). Типа teamName 'Команда' (Player player) = name(team(player)); IDE выводит на лету для них тип и вставляет в редактор ("-> STRING[30] ="). Эта вставка не всегда обновляется при редактировании свойства.

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

>>-При наборе выражений типа "name(team(player(goal)))", после набора "(" IDE иногда невпопад вставляет скобку ")". Возможно, это зависит от способа набора, потому что мне с ООП-бэкграундом проще идти от уже заданного в левой части объекта "goal", потом посмотреть его определение и добавить связующее свойство "player(goal)", потом опять сбегать в определение и добавить следующее свойство в цепочке "team(player(goal))", и наконец выбрать то что нам надо "name(team(player(goal)))".

Да есть такое. Сверху я отвечал. Есть CTRL+ALT+W, но к этому нужно конечно привыкать. Ну и может просто сделаем при вводе точки, чтобы она комплитилась как при CTRL+ALT+W и при ENTER оборачивалось в скобки (пока кстати выглядит самым реальным вариантом).
375 Bro
 
09.10.19
14:31
>>- Если в модуле есть ошибка, IDE подчёркивает её красной волнистой линией. Но когда делаем Recompile или Build, проект компилируется, внизу написано "Loaded classes up to date. Nothing to reload." И на этом всё. IDE не переходит на строку с ошибкой и не выделяет её цветом. Ошибка обнаруживается только в момент запуска сервера командой Run или Debug. Причём её нужно искать в консоли, среди прочих строк.
376 Bro
 
09.10.19
14:32
Тут нужно понимать что Build чисто java классы build'ит, к lsFusion это никакого отношения не имеет, у него фазы build'а как класса нет. В этом смысле это "скриптовый" язык
377 Злопчинский
 
09.10.19
14:46
(374) давайте уже пора выставлять вознаграждения за баги\помарки. или вы как херовая 1С все на юзерах и разработчиках тестировать будете? пойдете по нехорошему пути 1С? или как лидеры отрасли - типа как гугл и прочие - вознаграждение за ошибки найденные? если деньгами трудно - ничего, я, например, на билет от москвы до бреста в купейном соглашусь ;-)
378 Ещё1
 
09.10.19
14:48
(370) > Для того, чтобы получить список всех ошибок, найденных IDE, можно использовать команду LSF|show errors (ctrl+alt+shift+e)

OK сделал LSF - Enable meta, LSF - Show errors.
Показала "ошибки":
14:44    (HockeyPlus) Main.lsf(14:60): Ambiguous reference
14:44    (HockeyPlus) Main.lsf(62:83): Ambiguous reference
14:44    (HockeyPlus) Plus.lsf(6:58): Ambiguous reference
А реальную ошибку (я набил мусор "***" в пустую строку) не показала.
Да и обычно компилятор сам тебя тыкнет в ошибку в коде, да ещё выделит цветом. Я ж пишу, избалованы мы хорошими IDE.
379 Bro
 
09.10.19
14:48
>- Мелкий текст в клиентском приложении, не всем подходит. Если в Web-клиенте в браузере это не проблема (в Опере увеличить масштаб), то в Windows-клиенте простого решения не нашёл.
В Администрирование -> Доступ -> Пользователи есть Размер шрифта, % Можно его задать.
>- Если в одной из открытых форм (в одном клиентском приложении) есть зависимые данные, то они обновляются только после проталкивания изменений в основном окне в базу кнопкой Save. В моём примере форма "Таблица бомбардиров" обновлялась, только после сохранения изменений в форме "Турнирная таблица". Причём мало было переключиться на форму "Таблица бомбардиров", нужно щёлкнуть по таблице "Лучшие бомбардиры" в любом месте.
То что после сохранения только видно, то в этом собственно и смысл. Про обновление это в 3.beta пофиксили (возможно надо было во 2 влить, но это не критиичный баг).
380 Bro
 
09.10.19
14:50
>- Пользователь может открыть множество одинаковых форм. Можно ли как-то вместо открытия нового экземпляра формы переключать его на уже открытый?
Переключается режимом, в той же ERP демке включено
381 Bro
 
09.10.19
14:52
>- Набираем данные в таблицу клавиатурой. Как, редактируя ячейку со связанным списком значений, открыть окно выбора значения из списка? Клик мышкой >работает, а с клавиатуры? Пробовал Enter, Ctrl-Enter, F4 как в 1С не работает. Оказалось надо просто нажать в этом поле любую алфавитно-цифровую клавишу. >Почему так сделано - непонятно. Ведь нажатие алфавитно-цифровой клавиши в обычной ячейке приведёт к замене текста в ней на введённый символ. Т.е. при >быстром наборе таблицы нам надо помнить, где просто текст или число, а где связанный список.
Там когда вы жмете кнопку сразу открывается форма и выставляется фильтр, чтобы можно было нажать enter и отфильтровать то что надо. И там не алфавитно-цифровой, например пробел тоже подойдет. И как раз аналогия с текстом и числом, не надо помнить что там именно, вы либо в это поле вводите, либо в фильтр. Как раз симметрия получается, но видимо вопрос привычки.
382 Bro
 
09.10.19
14:53
>- В выпадающем списке подбора можно делать произвольные манипуляции с данными: удалять, редактировать. Это неправильно и чревато случайными ошибками. >Окошко выбора должно быть максимально простым, со списком без возможности редактировать, сохранить в Excel и т.п.
Ну тут философский вопрос. Случайную ошибку там не так просто допустить. Но если вы подменяете диалог (а это часто бывает), просто не добавляйте туда эти кнопки.
383 Bro
 
09.10.19
14:56
>- Нажатие кнопки Delete под таблицей приводит к немедленному удалению строки. Это неправильно. Случайное такое нажатие удалит не только сроку в текущем справочнике, но и все ссылки на удалённое значение во всех справочниках и документах. Представьте, в течение одной сессии вы набрали много данных, нажали случайно Delete - и слетела информация в куче связанных документов, в том числе проведённых. Да, если вовремя заметишь неладное, можно нажать кнопку Cancel в окне и вернуться к тому, что было. При этом придётся набирать всё заново.

Дело в том, что для "глобальных" объектов обычно DELETE идет в новой сессии (NEWSESSION), а в этом случае логика немного другая. А для "локальных" DELETE не так критичен. Но тут да, возможно надо понастраивать будет логику по умолчанию.
384 Bro
 
09.10.19
14:57
>Можно добавить сумму, среднее значение как в Excel.

Ну это как раз есть, что касается остального. Нужно было соблюсти баланс между Excel и бизнес-приложениями. Мы старались получить что-то посередине, но возможно да, нужно было больше акцентов в сторону Excel / Access. Но тут надо еще фидбек пособирать.
385 Bro
 
09.10.19
14:59
(365) Можем рассмотреть и удаленно. Хотя такого опыта мало, надо будет пообсуждать.

(366)
image = DATA IMAGEFILE (Sku);
EXTEND FORM sku
      PROPERTIES image(s) PANEL
;
Собственно в ERP в товарах так и сделано
386 Ещё1
 
09.10.19
15:00
(374) Спасибо. Непривычно, но CTRL+ALT+W работает как надо. Всяко лучше чем бегать по коду и искать определение.
387 Bro
 
09.10.19
15:02
(368) Можно. Если слово новое проблем с обратной совместимостью не возникает. Тут согласен было два варианта:
- Схема
   Представления:
   - Форма
   - Отчет
   - Экспорт

- Форма
   Представления:
   - Интерактивное
   - Статичное
       - Печатное
       - Структурированное

Второе чище, но менее привычно. Тут решили пойти "hard way".
388 Bro
 
09.10.19
15:04
(378) Там хитро, так как граматика сложная, как recovery'ся после грамматических ошибок. Во многих случаях recover нормальный, но его можно только императивным путем улучшать, что мы постепенно и делаем. В IDE GrammarKit это не из коробки (и не уверен что из коробки это теоретически можно сделать).
389 Bro
 
09.10.19
15:17
>давайте уже пора выставлять вознаграждения за баги\помарки. или вы как херовая 1С все на юзерах и разработчиках тестировать будете? пойдете по нехорошему пути 1С? или как лидеры отрасли - типа как гугл и прочие - вознаграждение за ошибки найденные? если деньгами трудно - ничего, я, например, на билет от москвы до бреста в купейном соглашусь ;-)

:) У нас есть отговорка - open-source. Но давайте флуд лучше в другое теме :)
390 _DAle_
 
09.10.19
15:23
(378) Да, я, видимо, не учел, что синтаксические ошибки туда могут и не попасть. Но ведь хотя бы красным в самом исходнике должно было пометить: https://imgur.com/a/2bfi4H1 ?
391 Ещё1
 
09.10.19
15:24
(381) Задумка понятна, но видимо не до конца отполировано.
Смотрите на примере, я стою на ячейке Имя игрока, и хочу ввести туда "Иванов" из списка. Начинаю набирать:
- "и" - всплывает список для выборки
- "в" - над списком всплывает окошко Filter Игрок = Value
- "анов" - и ничего не происходит. Почему? Потому что во всплывшем списке 1-м столбцом идёт ID записи, а имя - только 2-м. Платформа автоматически начинает поиск по ID.

OK закрываю окошко фильтра, сдвигаюсь в столбец Имя игрока, начинаю набирать "иванов" Enter --> пусто. Почему? Потому что автоматически условия фильтра стоит "=", а не "Start with" или лучше "Contains".
392 НиколаевГ
 
09.10.19
15:34
(391) Во блин ты в бетатестеры записался :))
393 Ещё1
 
09.10.19
15:41
(379) > В Администрирование -> Доступ -> Пользователи есть Размер шрифта, % Можно его задать.

Ага, спасибо. У меня английский язык, поэтому Administration - System - Security - Users, таблица Custom user. Тоже есть момент. Я поставил себе 300%, сохранил, перезапустил программу. Буквы огромные, пошёл туда же уменьшать до приемлемых. А в окошке редактирования Custom user левая панель не скруллится. Табом видно что идёт переход по полям, но на экране не видно строки Font Size. Хорошо заметил в этом окошке справа вверху кнопку развернуть, после этого строка Font Size выехала наполовину из-под нижней грани окна программы...
394 pechkin
 
09.10.19
15:46
А как авто тестирование происходит?
395 pechkin
 
09.10.19
15:46
юниты там, бдд и тд итп
396 Ещё1
 
09.10.19
15:53
(382) > Ну тут философский вопрос. Случайную ошибку там не так просто допустить. Но если вы подменяете диалог (а это часто бывает), просто не добавляйте туда эти кнопки.

Нет, диалог выбора не подменял, это всё тестирую на Хоккейном турнире. Т.е. все эти кнопки по умолчанию.

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

Я чего так придираюсь к лишним нажатиям кнопок, к откатам работы и повторному вводу. Это всё время, которое складывается в человеко-часы.
415 Ещё1
 
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 'Игрок должен быть указан';
416 Ещё1
 
10.10.19
01:12
(415) Сам спросил - сам ответил: для контроля заполнения поля CONSTRAINT не обязателен. Достаточно добавить атрибут NONULL в его определение.
417 Bro
 
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 строго вертикальная архитектура.
418 Ещё1
 
10.10.19
09:58
(417) Ну собственно я про сахар и спрашивал: как меньшим кодом сделать контроль заполненности поля. "NONULL" - куда уж меньше. У вас кстати не все разработчики конфигураций про NONULL знают, если пишут такую проверку в CONSTRAINT. Добавьте в методические рекомендации.
419 Bro
 
10.10.19
10:09
(418) Там просто часто нужна более сложная проверка. Или есть именно CONSTRAINT a IS AND NOT f(a), покажите, глянем коммит, лишим премии :)
420 Ещё1
 
10.10.19
10:22
(419) Не, я сдавать не буду. Чтоб потом мне икалось?
А можете в 2 словах объяснить, зачем вообще эта отдельная проверка на тип?
CONSTRAINT Goal goal IS Goal AND NOT player(goal)
Если бы написать
CONSTRAINT NOT player(Goal goal)
сразу понятно, какое свойство какого класса не должно быть NULL.
Но так не проходит.
421 Bro
 
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.
422 Ещё1
 
10.10.19
11:50
(421) Понимаю, что не всё просто. Немного поучаствовал в написании транспайлера Delphi - JavaScript.
423 Злопчинский
 
10.10.19
12:32
(422) ну и как в связи с кучей тонкостей оцениваешь порог входа в 1С и в фузину?
424 Bro
 
10.10.19
12:44
(423) У вас очень странный вопрос. Тут нужно сравнивать для выполнения одной и той же задачи. Потому как самый низкий порог входа будет в голый Pascal, но это ни о чем не говорит.
425 Ещё1
 
10.10.19
13:02
(423) Если взять непрофессионала и научить его подправить отчёт или форму счёт-фактуры, то разницы нет. Если же речь за программистов, научиться серьёзным доработкам готовых решений или написания с нуля... Раньше я бы сказал конечно 1С проще, визуальное программирование и готовые конфигурации рулят. Но сейчас всё настолько усложнилось, что уже не уверен.

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

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

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

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

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

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

Подобный подход (с использованием самого текста в качестве идентификатора) есть в QT, у них там все серьезно: и контексты есть, и Qt Linguist. Но для нас это была не настолько важная задача, чтобы реализовывать такой комбайн. Да и выглядеть это все будет так себе, у нас же не с++ все-таки.
449 _DAle_
 
10.10.19
22:33
(448) Если файлы из jar-ки, то возможно ctrl+b не сработает, но это баг, он будет исправлен.
450 _DAle_
 
10.10.19
22:44
(446) Хотел еще сказать, что теоретически мы сможем с помощью IDE отображать литерал на выбранном где-нибудь в настройках языке без всяких нажатий клавиш, но тут нужно и над UX думать, и над тем, как именно это реализовывать. Думаю, что это самая приоритетная задача данный момент.
451 _DAle_
 
10.10.19
22:45
(450) Эх, почему же редактирования сообщений здесь нет.. Имелось ввиду: "Думаю, что это не самая приоритетная задача в данный момент"
452 Ещё1
 
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?
453 _DAle_
 
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. Часто разработчику, когда он разбирается, нужно найти свойство/действие/форму, которые он наблюдает визуально на формах, в коде. И на форме он увидит заголовок на том языке, на котором захочет, а затем сможет перейти на место в коде (в хинтах будет указано как минимум место объявления, а для свойств и действий и само объявление).
454 CrushBy
 
10.10.19
23:07
(452) https://habr.com/ru/company/lsfusion/blog/465573/
Вот тут описаны ряды кейсов как по коду читается логика.
455 Ещё1
 
10.10.19
23:15
(453) Там на сайте PHP Manual у них всё. В поиск можно забить любое ключевое слово языка, либо библиотечную функцию - и откроется страничка с описанием. Но это наверное идеал, к которому всем нужно стремиться.

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

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

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

Ну и вопрос привычки, людям привыкших работать с кодом (Delphi, SAP, Axapta, Foxpro, Basic) и т.п. подход lsFusion привычнее, а значит удобнее.
465 Bro
 
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 Администрирование, там конечно далеко не все из того что есть в платформе, но достаточно много.
466 Flyd-s
 
11.10.19
12:22
(465), это в прикладном решении всё или платформе, где документация по платформе/решению?

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

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

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

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

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

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

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

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

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

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

В любом случае очевидного решения тут нет, поэтому мы пока использовали общепринятое. В принципе так как у большинства приложений задач интернационализации нет то и проблема не настолько критичная. Но да в будущем надо будет что-то придумать.
477 Ещё1
 
11.10.19
15:19
(476) > в разных модулях одни и те же строки
Будут разные строки, что делать. Ну либо описать строковую константу в общем модуле и использовать её где нужно.
478 Flyd-s
 
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 объект снимается с регистрации в плане обмена. Это тоже берет на себя БСП.
479 Ещё1
 
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).
480 Ещё1
 
11.10.19
23:09
Объясните, чем отличаются lsfusion-server-2.0-sources.jar от lsfusion-server-2.0.jar ?
Предположу, что один нужен для отладки, а 2-й для развёртывания. Но где какой?
481 Ещё1
 
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?
482 Bro
 
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%, но при этом создаст еще один уровень абстракции, который придется учить, и тем самым увеличит порог вхождения.
483 Bro
 
12.10.19
11:24
(479) Мы тут не при чем. Это к IDEA: Project->Settings в поиске набираете File Encodings и там UTF-8 ставите.
(480) -sources это просто исходники. Нужны чисто для отладки в IDEA (соответственно если нет необходимости идти внутрь платформы, то не нужны)
(481) Если явно не задать таблицу, она сама создаться с именем _auto_chat. Их часто явно создают. Для чего, сложно сказать, вообще как я понимаю так, чтобы таблица без префикса была.
484 Ещё1
 
12.10.19
11:55
(482) Сайт documentation.lsfusion.org всё?
https://lsfusion.org пока работает.
485 Flyd-s
 
12.10.19
12:01
(482),
2. Если в обмене участвуют 30 объектов - нужно создавать 30 форм, нужно ли их генерировать в двух базах сразу, нужно ли описывать соответствие полей, ключевых полей кодом?

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

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

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

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

@defineMyConstraint(field1);
@defineMyConstraint(field2);
@defineMyConstraint(field3);
493 Bro
 
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), но логика значений по умолчанию обычно более гибкая (чем проверка на заполненность). Хотя если честно не помню почему не сделали (хотя тут пару часов работы).
494 CrushBy
 
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));
}
То есть при изменении склада для заказа проставлять поле из заказа. Ну и вообще так любое выражение можно использовать.
495 Asmody
 
12.10.19
13:20
(493) какой-нибудь DEFAULT (TODAY()) вдоль и поперёк же!
496 Asmody
 
12.10.19
13:27
(493) "Список / массив это частный случай функции (свойства) от числа"
Интересная точка зрения. Но это не то, что я имел в виду.
Мне нужен список значений.
Я хочу туда натыкать объектов, показать пользователю, построить фильтр типа "реквизит в списке" и т.д.
497 Dzenn
 
12.10.19
16:11
(5) Дата локал лонг лонг лонг - звучит как рэп ;-)
498 Михаил Иванович
 
12.10.19
16:16
(486) Хорошо, пусть будет РИБ. Как у вас дела с РИБом? С настройкой обмена с ним?
499 CrushBy
 
12.10.19
16:32
(495) Тут просто особо других случаев для значения по умолчания (кроме подставления текущей даты) особо и не придумывается. А делать под очень частный случай целое ключевое слово - спорное решение. Тем более можно легко создать метакод под это. Но в целом может и сделаем.

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

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

Но в целом статический объект по поведению ничем не отличается от объекта, добавленого пользователем вручную. Логически список значений - это набор объектов одного класса.
500 CrushBy
 
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 и магазинов тоже нет :)

Если будет такая потребность, то возможно сделаем какой-то универсальный механизм.
501 НиколаевГ
 
12.10.19
16:46
(498) При наличии кассового фронта РИБ не актуален, если хотя-бы 3G есть.
502 Bro
 
12.10.19
17:07
(499) Он не это видимо имел ввиду.

Если надо набрать куда-то объекты, делаете
selected = DATA LOCAL BOOLEAN (Sku); // если постоянно хранить выборку то не LOCAL

дальше selected заполняется или программно
selected(Sku s) <- TRUE WHERE f(s);
или пользователем
FORM
   OBJECTS s=Sku
   PROPERTIES (s) selected
;

Ну и используете где надо:

FOR selected(Sku s) DO ...
или
FILTERS selected(sku(invoiceDetail))
503 Bro
 
12.10.19
17:08
(497) А кстати хорошая идея :). Сейчас распознавание речи на очень высоком уровне, и если его прикрутить к IDEA, тогда на аргумент "без кода" можно отвечать "не касаясь компьютера".
504 Flyd-s
 
12.10.19
17:11
(486), как будет выглядеть эта форма с сотнями атрибутов? РИБ в случае фузины, наверное, не самый актуальный сценарий. Более вероятные - с бухгалтерией, с системами бюджетирования, с сайтами + обмены с ЕГАИС и ОФД из коробки
505 Bro
 
12.10.19
17:21
(504) Вы можете эту форму разбивать на разные блоки EXTEND FORM (и так скорее всего и будет, так как все разбито на модули как правило). А с появлением:
https://github.com/lsfusion/platform/issues/68
еще и повторно использовать без необходимости использования метакодов.
506 tndr2
 
12.10.19
17:22
(502) А как в этих конструкциях накладывать фильтры в пользовательском режиме?
Ну например в 1С ссылочные типы позволяют вытащить любую информацию, и практически как угодно ее сгруппировать, часто это необходимо для получения оперативной информации для принятия решений?
Что нужно сделать пользователю, или как технический специалист сможет помочь ему, когда возникает необходимость?
507 tndr2
 
12.10.19
17:26
Бизнес требует всевозможной аналитики, 1С прямыми руками это позволяет сделать с помощью СКД (например) легко и непринужденно..
Как с этим в Фузине?
508 ДенисЧ
 
12.10.19
17:27
(507) Давно уже ответили. Покупай BI за бешеные деньги, экспортируй туда и (даст бог) через час ты получишь отчёт по движениям документа, который ты только что провёл...
509 Bro
 
12.10.19
17:37
(506) >А как в этих конструкциях накладывать фильтры в пользовательском режиме?
>Ну например в 1С ссылочные типы позволяют вытащить любую информацию, и практически как угодно ее >сгруппировать, часто это необходимо для получения оперативной информации для принятия решений?

Если говорить про включение / выключение фильтров то про это отвечено в (7).

Сами фильтры могут быть с любым выражением

FILTERS (GROUP SUM quantity(InvoiceDetail id) * smt(stock(document(id))) IF document(id)) + 12 > 5

Про SQL думать не надо платформа сама все сгенерит и оптимизирует

(507) (508) BI подключается как на существующие таблицы в SQL, так и в отдельных BI базах.

В принципе туда можно выгрузить плоский dataset
EXPORT f(g(a), h(a)), x(a) * 15 ... и потом крутить его в BI скока хочешь. Есть конечно еще вариант выгрузить структуру БД в BI (благодаря прозрачной материализации можно даже сложные показатели также скармливать туда), но это будет нагружать оперативную базу, так что лучше все же BI держать отдельно.

BI на рынке огромное количество от 3 долларов за пользователя до бесконечности. Вообще конечно надо будет embed'ить какой-нибудь open-source BI tool, но в отличии от всего остального, с нормальной лицензией мы пока не нашли (но это пока).
510 Bro
 
12.10.19
17:38
(508) Актуальность можно держать как стопроцентную (что обычно нафиг надо) при работе с SQL, так и в течении часа скажем.
511 tndr2
 
12.10.19
17:41
(509) То есть все-таки есть UI который дает пользователю выполнить некий код, который даст ему необходимую информацию?
512 tndr2
 
12.10.19
17:43
Но выходит, что пользователь должен иметь навыки программирования?
513 Bro
 
12.10.19
17:47
(511) Если говорить про пользователя есть опциональные фильтры (задающиеся программистом, но выбираемые пользователем) и пользовательские по существующим колонкам. Формально есть еще интерпретатор, где можно любые формы делать, но для пользователя он слишком сложен.

Формально можно было бы сделать что-то среднее, например возможность создавать колонку и писать туда выражение (кстати это очень несложно делается). То есть что-то типа bank(stock(d)). Но скорее всего пользователи все равно такой фигней заниматься не будут. Будет ли это программированием - сложно сказать? Формулы в Excel это программирование?
514 Asmody
 
12.10.19
17:49
(502) Т.е. я должен предусмотреть в архитектуре каждого класса реквизит selected, на предмет того, а вдруг мне понадобится список объектов? А если, не дай бог, понадобится 2 списка, то надо selexted1 и selected2?
515 Asmody
 
12.10.19
17:50
Как это в таком продвинутом языке нет элементарных конструкций для построения структур данных?
516 Bro
 
12.10.19
17:54
(514) не совсем понял. selected это и есть объявление массива по сути (selected его имя). Если вам понадобится два массива, вам понадобится два имени, как и везде.

Но можете у себя в каком нибудь utils модуле создать selected = DATA LOCAL BOOLEAN (Object); и использовать его везде где вздумается.

Ну и еще раз все коллекции это частные случаи функций.
517 tndr2
 
12.10.19
18:01
(513) Пользователи всякой фигней занимаются, и более того, местами возникают мысли, глядя на настройку в СКД; как ты вообще до этого додумался)
Но вопрос не в этом, 1С с помощью различных инструментов, при условии относительно грамотно поставленного учета, может получить при необходимости, любые оперативные данные.

Теперь допустим, вместо 1с, в контору внедрили фузину, как руководители бизнеса смогут получать необходимую информацию, с уч етом хронологии событий, и тп.
Есть в фузине подсистема, которая предполагает вывод аналитической информации для владельцев бизнеса?
518 tndr2
 
12.10.19
18:04
Или же под фузиной мы понимаем франч?
Где дескать ребятки приедут, будут год гавнокодить, контра будет платить бабки, в результате чот работает, чот нет, ну и само по себе такое...
519 PR
 
12.10.19
18:08
(516) Я кажется понял, как продать Газпрому ассемблер
520 Михаил Иванович
 
12.10.19
18:08
Странная фузина, себестоимости нет, обменов нет, отчетов нет... а чего есть тогда? Игрушка для овнокодеров?
521 Bro
 
12.10.19
18:08
(517) Смотрите если речь идет о отчетности (то есть грубо говоря конкретные показатели / срезы, используемые как KPI). То тут формы являются отчетами. Создаете форму, накидываете туда объекты, свойства, фильтры, настраиваете дизайн:

https://documentation.lsfusion.org/pages/viewpage.action?pageId=46367627

Делаете PRINT в любой формат. Запихиваете в планировщик и т.п. PROFIT

Если о творческом процессе "поиграть с данными"- плоский срез, наверх BI.

(518) Причем тут франч? Фузина - платформа. Чьими силами осуществляются доработки - организационный вопрос, хоть своими, хоть на фрилансе. За счет очень высокой декларативности ошибку совершить гораздо сложнее (так что чот работает, чот нет, куда менее вероятно). Впрочем за холиваром в соседнюю тему.
522 PR
 
12.10.19
18:09
(520) Да это все пишется за полдня, строчек пятнадцать кода
523 Михаил Иванович
 
12.10.19
18:09
(520) А, да она же еще и с ЕГАИС и маркировками не работает...
524 Bro
 
12.10.19
18:10
(523) Здесь платформа обсуждается. Обсуждения ERP в отдельной теме (могу создать). Ну или в соседней теме для флуда.
525 PR
 
12.10.19
18:10
(521) Так интересно наблюдать, как вы с Крашем морозитесь от вопроса про отчеты :))
526 Михаил Иванович
 
12.10.19
18:11
(524) Нет у вас ERP, успокойтесь уже. А отчеты и обмены, это платформа.
527 PR
 
12.10.19
18:11
(524) О, да, больше веток про Фузину, зафузиньте всю первую страницу форума
528 Михаил Иванович
 
12.10.19
18:12
(521) Вы понимаете, что это жесть? Я про отчетность на формах.
529 PR
 
12.10.19
18:12
(524) Дело в том, что механизм построения отчетов серьезные системы предлагают на уровне платформы
Вопрос же не про ТОРГ-12 или 2-НДФЛ, вопрос именно про _механизм_ построения отчетов
530 Михаил Иванович
 
12.10.19
18:12
(527) Больше веток плохих и разных ))
531 Михаил Иванович
 
12.10.19
18:13
(529) Они путают отчеты с печатными формами, вот и все.
532 Asmody
 
12.10.19
18:18
(516) Вот и я не понял, зачем чтобы сделать список объектов курочить структуру объекта?
А если это не мой объект, если это объект из модуля, который соседний отдел пишет? Мне им тикет написать "добавьте рквизитик, мне очень список нужен"?

А как тогда реализовать список значений разных типов?
А что-то типа словаря (или, если угодно, "карты", которая map)?
533 PR
 
12.10.19
18:18
(531) Нет, просто у них все через формы
Отчеты через формы, JSON через форму, видимо даже создания массивов через форму
Конкретные вопросы по lsFusion
534 Bro
 
12.10.19
18:19
(531) Это вы путаете. Во фьюжн формы универсальный механизм, он может отображать как первичные, так и вычисляемые данные. И используется и для классических форм и для отчетов.

То что вы говорите про "игру с группировками" - это во всем мире аналитика. И для нее используются BI инструменты (которые под это и заточены).
535 Михаил Иванович
 
12.10.19
18:21
(534) Т.е. отчетов нет, идите в BI...
536 Bro
 
12.10.19
18:22
(532) Во фьюжн нет инкапсуляции в классическом виде.

Вы можете добавлять реквизиты любым чужим объектам. Структура объекта это весьма эфимерная штука (то есть в IDEA вы ее видите, но это просто сборка всех существующих свойств)

Разных типов можете BOOLEAN (Object) сделать, я уже писал. Хотя их со строками не смешаешь, надо преобразование типов делать (но зато так SQL более человеческий получается и не гробит его оптимизиации).
537 Bro
 
12.10.19
18:23
(535) Дайте определение отчета пожалуйста. И желательно в соседней ветке (если оно не достаточно четкое).
538 tndr2
 
12.10.19
18:23
(521)
2. Верно - платформа.
Некая сущность, которая дает тру-программистам изучить новую технологию. Это прям круто!
Но, бизнес - это такая штука, в которой технология инструмента не важна. Вернее важна, но с точки зрения получения аналитики, желательно прям вот оперативно.
Решения принимаются на основании полученной (из учетной системы) информации.
Эта информация с использованием СКД получается практически моментально, разрезы  (для выяснения) любые сылочные типы.

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

Большая часть аналитики даже для пустомели из отдела продаж доступна и очевидна.

Какая в фузине система аналитики?
539 Михаил Иванович
 
12.10.19
18:24
(537) Не уходите от ответа.
540 Михаил Иванович
 
12.10.19
18:25
(538) Они посылают в BI.
541 PR
 
12.10.19
18:28
(536) Опачки. Как это нет инкапсуляции? То есть у вас не полноценное ООП? Царь не настоящий?
542 Asmody
 
12.10.19
18:28
(536) Ох, ребята, вот это вы подставились! Сегодня один добавит selected, завтра второй, третий забудет и поставил DATA и все улетит в базу... Чудесная система.
543 Asmody
 
12.10.19
18:29
(541) Рома, тут похлеще преступление: у них любой может вскользь структуру менять! Зашибись, чо.
544 Bro
 
12.10.19
18:32
(538) Как раз наоборот. Текущие разработчики наоборот не тру программисты, они ничего не знают про массивы, SQL, клиент сервер и т.п.

С помощью BI она тоже получается практически моментально и т.п. И там интерфейсы куда более интуитивно понятные, смотри bi.lsfusion.ru.
(540) Так вы не сказали что такое отчеты. Как я могу сказать есть ли они в lsFusion?
(541) ООП - это три вещи наследование, полиморфизм и инкапсуляция. Последняя на мой взгляд несет больше вреда чем пользы. Наследование и полиморфизм - это основная часть ООП. Хотя я как раз нигде не говорил, что lsFusion - это ООП.
(542) Что улетит в базу? Создастся колонка? Ну создастся и создастся. И что значит вскользь? Разработчик сам решает нужно ему чтобы показатель был глобальный или локальный. Или по вашему лучше было наоборот сделать все локальным по умолчанию?
545 HeKrendel
 
12.10.19
18:34
А нафига 2 ветки на форуме про платформу иСфужен?
546 Bro
 
12.10.19
18:35
(545) Предполагалось, что в одной срач, нужно /не нужно, лучше / не лучше. А в этой конкретные вопросы как какие-то вещи делаются в lsFusion. Прочитайте шапки веток.
547 tndr2
 
12.10.19
18:36
(544) 1. так это еще хуже)
Давайте так, по вашему что важнее для бизнеса? Технология или целесообразность использования технологии?
548 Asmody
 
12.10.19
18:37
(544) Вы действительно  не видите проблему? Я написал selected, у меня чудно все работает. Завтра автор объекта добавил туда поле selected для своих нужд. Совсем другое, другого типа. Что будет?
549 Bro
 
12.10.19
18:39
(548) Если они в разном namespace (по умолчанию) ничего не будет. Будет два свойства с одинаковым коротким и разными полными именами.

Но вообще такая проблема в любой библиотеке есть (при наследовании например, или при расширениях в 1С).
550 Asmody
 
12.10.19
18:40
(544) Складская ведомость - это отчёт. Прайс-лист - это отчёт. Печатная форма приходки со всеми доп.расходами - это отчёт. История и структура подчиненности документов - это точе отчёт
551 tndr2
 
12.10.19
18:41
(544) Откуда у вас как разработчиков, такое пренебрежительное отношение к пользователю?
Почему вы решаете, что ему необходимо сделать?
Это в корне не верно.
552 Asmody
 
12.10.19
18:41
(549) В 1С не надо уродовать структуру чтобы получить список объектов.
553 Bro
 
12.10.19
18:46
(550) Ну такие вещи отлично делаются формами и оператором PRINT.
(551) Вы точно правильную ссылку на ответ поставили?
(552) Еще раз структура объекта в lsFusion штука очень странная. Как минимум потому что у свойств может быть много параметров. В какого параметра структуру оно должно показать? И там есть фильтр на LOCAL.

И главное преимущество такого подхода в очень крутой модульности.
554 PR
 
12.10.19
18:47
(543) Ну так, чего ждать от людей, которые рекламируют свою поделку обсиранием успешного продукта, умудряясь в процессе сравнения максимально передернуть критерии сравнения
555 PR
 
12.10.19
18:50
(544) Отчеты в учетных системах — абсолютно недвусмысленный и прекрасно сто миллионов раз описанный термин
То, что у вас в конторе не знают его значения, полностью характеризует вас как разработчиков бизнес-системы
556 PR
 
12.10.19
18:51
(545) Фузиновцы считают, что одна ветка серьезная (эта), а вторая на поржать
557 Bro
 
12.10.19
18:52
(555) Ну как-то мы автоматизировали уже 50к рабочих мест. Но раз он описанный, поделитесь ссылкой. Но в любом случае про печатные формы и BI (а именно так работают во всем мире) я уже сто раз написал.
558 HeKrendel
 
12.10.19
18:53
(557) Уже 50к? в прошлый раз было 3,5к
559 tndr2
 
12.10.19
18:53
"IT для бизнеса, а не бизнес для IT"
Супер важная вещь)
560 tndr2
 
12.10.19
18:55
(557) Как у вас обстоят дела с траспортными накладными, маршрутными листами и так далее, все что связано с логистическими формальностями?
561 HeKrendel
 
12.10.19
18:56
(560) Никак, у них нет себеса даже товаров
562 Bro
 
12.10.19
18:56
(552) Ну и asmody вы же понимаете что в lsFusion структура объекта зависит от модуля на котором вы стоите.
(558) Я сейчас не про одновременных говорю. И 3.5к не было, там всегда счет на десятки шел. 3.5к у нас в одной сети почти столько пользователей.
(559) "Лучше быть здоровым и богатым, чем бедным и больным". Давайте пожалуйста в соседнюю тему за этим. (560) Это вопрос не к платформе. В ERP там что-то есть, но это не моя область знаний. И опять-таки в соседнюю тему.
563 Bro
 
12.10.19
18:57
(561) В соседней теме себес (в частности в рознице) уже сто раз обсудили. Добро пожаловать в соседнюю тему.
564 PR
 
12.10.19
18:59
(557) Как у вас поиграться с информацией о взаиморасчетах с контрагентами?
А потом принести глвбуху распечатанную на папирусе формата А4 инфу с нужными отборами, сортировками, группировками и шрифтовым и цветовым оформлениями
565 Bro
 
12.10.19
19:03
(564) Смотрите, если речь идет о конкретных процессах, то и формы обычно конкретные. И если бухгалтеру нужна какая-то инфа пусть зайдет в систему и посмотрит.

С отборами и сортировками в принципе играться можно открыв форму в интерактивном представлении расставив отборы, сортировки и потом распечатав ее. Но это все равно странный кейс.
566 tndr2
 
12.10.19
19:06
Нет - это не странный кейс!
Это вполне себе нормальный случай.
Пользователь должен иметь возможность интерактивной настройки отчета.
Это блять его работа!!!!
567 Ещё1
 
12.10.19
19:11
(502) selected = DATA LOCAL BOOLEAN (Sku); // если постоянно хранить выборку то не LOCAL
Интересно, если кто-то во время разработки добавит свойство в класс (поле в таблицу):
selected = DATA BOOLEAN (Sku);
а потом поймёт, что оно не надо, либо переименует свойство. Останется ли это поле в таблице БД, либо при следующем запуске сервера приложений будет проанализирован код приложения, и лишние столбцы удаляться?
568 PR
 
12.10.19
19:11
(565) Формирование пользователем отчета с предварительной его настройкой — странный кейс?
Я не могу столько смеяться, если не врут, что минута смеха продлевает жизнь на пять минут, то я так с вами никогда не сдохну
569 Bro
 
12.10.19
19:12
(566) А когда ему нужно будет чуть более сложный показатель туда вытащить?
(568) Еще раз так во всем мире работают.
(567) Удалит естественно. Точнее переименует, а потом уже отдельной процедурой удалится (хотя можно сделать и чтобы сразу удаляло)
570 tndr2
 
12.10.19
19:13
Что предлагает фузина для получения оперативных отчетов по взаиморасчетам, продажам, для контроля отгрузок и тому подобное?
Ничего!
Верно.
Джентельмены оправдаются словом - "платформа" )
Дескать мы вам механизм дали, а вы уж тут сами....
В бизнесе это не работает)
571 Михаил Иванович
 
12.10.19
19:14
(565) Пользователь покупает учетную систему, что бы в любой момент быстро и в том красивом!!! виде как ему хочется, увидеть результаты деятельности компании. Он для этого систему и покупал. А не эти ваши ужасные формы из прошлого века, это дичь и маразм, это не уважение к пользователю - кормить его таким интерфейсом. И пользователю пофиг, что у вас под капотом.
572 tndr2
 
12.10.19
19:14
(569) 1. Перепишем запрос, и дадим пользователю нужную информацию. Это не сложно)
573 Михаил Иванович
 
12.10.19
19:15
(569) Да плевать, что так работают. Давайте не будем на это ровняться.
574 Bro
 
12.10.19
19:17
(570) Сто тысяч раз повторяли:
https://documentation.lsfusion.org/pages/viewpage.action?pageId=46367627
Если вам нравится одно и тоже сто раз повторять - в соседнюю ветку.
(571) Это все красивые лозунги. И печатными формами можно любой дизайн задать.
(572) В lsFusion любая форма тоже делается очень несложно.

Это последние неконкретные вопросы, на которые я ответил в этой ветке.
575 Михаил Иванович
 
12.10.19
19:17
(573) *равняться
576 Ещё1
 
12.10.19
19:19
(565) В 1С отчёты интерактивные. Причём интерактивность не только в том, что пользователь может выбрать показатели (из заранее подготовленного программистом списка), группировки по горизонтали и вертикали (тоже из заранее подготовленного списка), навесить произвольные фильтры на любое свойство. Есть ещё 1 убийственная вещь - можно щёлкнуть по любой цифре в отчёте, и раскрыть эту цифру по любому показателю. К примеру, сделали отчёт по продажам по клиентам за год. Вас заинтересовали продажи определённого клиента - щёлкаем по цифре напротив клиента, и раскрываем её по номенклатуре, или по месяцам, или ещё по чём захочется.
577 Михаил Иванович
 
12.10.19
19:19
(574) Это не лозунги мля. Это жизнь, а вы в облаках витаете.
За такие отчеты, что вы там рисуете, вас линчевать нужно.
578 Михаил Иванович
 
12.10.19
19:20
(576) Зачем ты им это рассказал, они теперь плакать будут.
579 Михаил Иванович
 
12.10.19
19:20
(574) "Это последние неконкретные вопросы, на которые я ответил в этой ветке." а в другой ветке вы на вопросы не отвечаете, они для вас не удобные)))
580 tndr2
 
12.10.19
19:21
(574)
>>Это все красивые лозунги. И печатными формами можно любой дизайн задать.

Серьезно?
То есть ты серъезно думаешь, что важно то как задать дизайн?

Блять, чувак, в каком ты мире живешь?
581 Bro
 
12.10.19
19:24
(576) BI делает тоже самое. В этом его смысл.
582 PR
 
12.10.19
19:25
(569) >>А когда ему нужно будет чуть более сложный показатель туда вытащить?
Ну так программист добавит в отчет этот показатель, потом пользователь его поиспользует
У вас в Фузине пользователь сам что ли показатели добавляет?
PS: не рассказывайте ему, что в СКД можно пользовательские поля добавлять, вдруг с человеком плохо будет
583 Bro
 
12.10.19
19:26
584 d4rkmesa
 
12.10.19
19:26
(0) Сможете написать "Торговлю и Склад", что на 1С 7.7, на своей платформе? Там всего тыщ 100 строк на языке 1С плюс макеты с формами. Примерно человеко-год, если работать в темпе вальса. Куча людей еще пользуется ТиС 9 и не хотят на УТ11, функционала хватает.
585 Михаил Иванович
 
12.10.19
19:27
(584) Хороший вопрос))
586 Михаил Иванович
 
12.10.19
19:28
(583) Ты сам то смотрел на этот кошмар неудобоваримый с ошибками?
587 PR
 
12.10.19
19:29
(569) >>Еще раз так во всем мире работают.
Интересно, тебя хоть кто-нибудь всерьез воспринимает
У людей есть только платформа и одно сомнительное решение на ней, но они рассказывают про весь мир
И это при том, что в самой замшелой учетной системе (в том числе буржуйской) есть отчеты
588 PR
 
12.10.19
19:30
(573) Да не ведись на эти странные залепухи, конечно же все везде используют отчеты
589 Bro
 
12.10.19
19:33
(584) Собственно сейчас в этом и дилемма. Либо делать сложное многофункциональное решение в погоне за крупными клиентами, либо наоборот максимально простое за мелкими (ну или как полуфабрикат для средних).

Конечно есть еще вариант за счет очень крутой модульности попытаться усидеть на двух стульях, но это конечно очень крутой challenge. В любом случае решение будем принимать после того как сделаем англоязычную версию, переведем часть статей и получим фидбек на hacker news, reddit, medium'ах и т.п.
590 Ещё1
 
12.10.19
19:33
(583) Просто в 1С это всё прямо в программе. Ну, ладно, что-то теряем, что-то находим, идеала нет. Буду дальше разбираться с кодом платформы...
591 tndr2
 
12.10.19
19:33
(581) Брателло, представь себе такую ситуацию; сидишь ты себе говнокодишь на этой своей фузине, чот там по проекту нужно фичу запилить, и тут вдруг те звонят и грят, дескать "нужно мне информацию получить, в разрезе поставщиков, покупателей, за последние 24 часа"....
Фузиновец, наверное бросится писать адский код, а одинэсник сваяет внешнюю обработку по регистру остатков, выгрузит в эксельку,  и руководятел будет доволен)
592 PR
 
12.10.19
19:37
(583) И как я могу свернуть все по поставщикам в http://bi.lsfusion.ru/pivot/d/f02db7a865bf209714/Оборачиваемость?
А распечатать на принтер как?
593 tndr2
 
12.10.19
19:41
(589) >>Конечно есть еще вариант за счет очень крутой модульности попытаться усидеть на двух стульях, но это конечно очень крутой challenge. В любом случае решение будем принимать после того как сделаем англоязычную версию, переведем часть статей и получим фидбек на hacker news, reddit, medium'ах и т.п.

А с чего вы решили, что вы там вообще нужны?
крупные европейские призводства ужи имеют системы автоматизации, мелкий бизнес и без вас проживет..
594 Flyd-s
 
12.10.19
19:41
(583), накидал группировок в отчеты, даже не могу свернуть группы
595 Ещё1
 
12.10.19
19:42
(592) Удалить Бренд из "Show"?
Печатать - я нашёл Download - XLSX, и дальше в Excel.
596 PR
 
12.10.19
19:43
(594) Да вообще туповатый отчет, я бы его и отчетом не назвал
Плюсиков нет, ширины колонок и высоты строк нет, редактирования нет, сортировки нет, печатной формы! нет
А что есть-то?
597 PR
 
12.10.19
19:46
(595) Что значит удалить? Мне свернуть надо. Как в, мать его, голимом, на каждом рабочем месте уже сто лет стоящем, Экселе.
Печать через XLSX я конечно увидел, но это, знаете, можно сразу идти накуй, еще до демонстрации пользователям
598 Ещё1
 
12.10.19
19:46
(593) Даже крупные западные производители ещё не всегда полностью автоматизированы. Процесс доработки их систем я наблюдаю воочию (наши партнёры). А некоторые автоматизированы во времена царя Гороха, и наверное не против были бы уйти от Кобола. Так что не так всё плохо.
599 PR
 
12.10.19
19:48
(598) А зачем тогда обсирать прекрасную 1С, у которой все хорошо, раз плохо у систем, на которых сидят западные производители?
600 Ещё1
 
12.10.19
19:50
(597) Да, заметил, при экспорте в Excel структура теряется. Придётся там ещё делать сводную таблицу на основе выгруженной.
Ну, печатать на принтер не так и часто надо. Для кого? У всех сейчас компьютеры, телефоны, email для передачи вместо голубиной почты... У меня и принтера нет на рабочем столе, хотя 1С, отчёты и Excel постоянно в работе.
601 tndr2
 
12.10.19
19:51
(598)  Дело в том, что видимо нет необходимости.
А если появявится, то может и 1С влезет)
602 tndr2
 
12.10.19
19:56
(608) В России слишком много бюрократии, следовательно нужны бумажки.
У фузиноидов бумажек нет, они технлогию впаривают, а мы одинесники больше как-то к бизнесу привлечены.
603 PR
 
12.10.19
20:02
(600) Капец. Рукалицо
604 CrushBy
 
12.10.19
20:02
(600) Там, кстати, в JasperReports есть возможность делать "группировки" ячеек, чтобы оставалась структура. Но это не очень тривиально делается. Тут вообще, важно понимать, что мы просто даем DataSource JasperReports, а там уже можно делать все то, что умеет JasperReports.
605 tndr2
 
12.10.19
20:07
А чорт, значит сижу я такой и в голове у меня, как бы отчетность то для конторы выпилить..
И такой думаю, а чоб мне JasperReports то не посмотреть.
Финдир я или тупица.
Но с друой стороны есть у нас в конторе 1с, давай-ка я отчеты посмотрю,  пойму как дальше действовать...
606 tndr2
 
12.10.19
20:13
(604) Кому нужны ваши дегенеративные представления о том как должно быть?
Вы должны понимать, что в умелых руках, 1с СКД полностью закрывает всю аналитику для бизнеса.
607 Михаил Иванович
 
12.10.19
20:26
Они там в соседней ветке жгут )))
608 tndr2
 
12.10.19
20:30
очень много дерьма генерится на предмет написания кода на русском языке.
Тогда почему для англоязычных кодеров нет столько гавна?
if else - отвратитительно же выглядит?
Английские названия переменных, что это за глупость?
609 Ещё1
 
12.10.19
20:31
(604) Но вот в этой демке http://bi.lsfusion.ru/pivot кто-то же настраивал предварительно все эти отчёты и группировки? Или это Джаспер прямо из исходных данных выцепил?
Они всё же могли бы добавить группировки и сворачивание/разворачивание групп кнопкой [+] прямо в табличный вид. B соответственно сохранять при экспорте в Excel. Ведь эта информация есть (видно по отступам слева у подгрупп).
610 tndr2
 
12.10.19
20:35
if else   - это крутые операторы условий, а
Если Тогда - уже становятся не очень...
611 tndr2
 
12.10.19
20:38
Американские и английские программисты нормально живут с этими своими while, if, else , а отечественные почеиу-то должны испытывать испанский стыд.
612 tndr2
 
12.10.19
20:39
Бред собачий
613 Ещё1
 
12.10.19
20:41
(602) Так я ж не про печатные формы, ТТН всякие и проч., без печати которых пока никуда. Я про бизнес-аналитику, которая рисуется в bi.lsfusion.ru и отчётах с графиками и диаграммами. Но всё, в этой теме уже офтоп, лучше в соседнюю, где сравнение с 1С.
614 Ещё1
 
12.10.19
21:52
До меня только сейчас дошло: сайт https://documentation.lsfusion.org работает на Фузине? Т.е. HTML-страницы строятся на лету, и поиск в базе работает через приложение?
Если да, все ли технологии для создания такого сайта включены в платформу бесплатно, или там закрытые модули есть?
615 Bro
 
12.10.19
22:05
(614) Нет. Это confluence. На фузине вот эта штука работает https://lsfusion.org/try (все кроме отображения)
616 Asmody
 
12.10.19
22:29
(562) [структура объекта зависит от модуля на котором вы стоите.] - нет, как раз вот этого я не понимаю.
Это хуже "обезьяньих заплаток" в ruby.
617 Bro
 
12.10.19
22:39
(616) смотрите, вы просто во главу ставите класс (а точнее объект), а не функцию (свойство). То есть вы в данном случае зациклены на инкапсуляции, а как раз ее в lsFusion по сути нет (на самом деле и в других языках она во многом суррогатное понятие, но это не так очевидно в них). Соответственно если забыть про инкапсуляцию и перевернуть логику, все станет на свои места.

То есть по сути забыть про ООП, как смесь гамбургера и колы а оставить от него только наследование и полиморфизм.
618 Asmody
 
12.10.19
22:50
(617) Нет, я зациклен на консистентности в первую очередь. А объект или функция - это лишь способ реализации. Если ваша функция заточена на одно поведение объекта, а по факту вы получаете другое (а вы позволяе и даже мотивируете делать так), то о какой консистентности может идти речь? А консистентность в случае бизнес-систем синоним надежности и предсказуемости.
619 Лефмихалыч
 
naïve
12.10.19
23:21
(617) функции сами по себе в отрыве от того, что они обрабатывают (объектов) никому не нужны. А из (536) следует, что программист, осуществляющий поддержку и развитие готового решения, танцует на минном поле. Вносить изменения в архитектуру можно только, зная наизусть все функции, которые используют изменяемый объект. Иначе есть шанс поломать функционирование того, о чем ты представления не имеешь.
620 Лефмихалыч
 
naïve
12.10.19
23:25
альфа и омега любого сопровождения в том, что, если я добавляю что-то, то поломаться может только то, что я же сам вокруг этого и добавил. А тут - добавил и сиди жди. То ли эбанёт, то ли нет. И ты не знаешь, где и когда. И когда оно эбанёт, ты не будешь даже знать, из-за чего это оно - вендор нарукожопил или ты.

Система, чо...
621 Злопчинский
 
12.10.19
23:36
(566) у них работа пользователя заключается в постоянном вводе по строке и суммировании по колонке. Обычный режим для конторы, которая не знает что завтра будет.
622 Злопчинский
 
12.10.19
23:42
(584) не смогут. у них ресурса на это нет.
и нет вообще понимания как построить коробочный продукт.
ребята тупо работают по частным проектам.
ни один такой частный проект в другой частный проект полностью не мигрирует.
для каждого нового проекта на ядро навешивается набор подходящего из прошлых проектов.
поэтому каждый проект уникален. и живет только если сопровождается вендором.
если вендором не сопровождается - то так и остается в замороженном состоянии.
вот и вся ниша фузины пока.
623 Ещё1
 
13.10.19
00:04
(619) Программисты 1С всё время вносят изменения и доработки в типовые конфигурации. Только они меняют прямо в модулях поставщика. А в lsFusion можно сделать свою доработку в виде отдельного модуля. При этом она может быть достаточно глубокой, менять формы и структуры данных, поведение и проч. Представляете, насколько проще будет поддерживать и обновлять такие конфигурации?
Я там выше где-то выкладывал свою доработку в их приложение "Турнирная таблица". https://documentation.lsfusion.org/pages/viewpage.action?pageId=2228240 Вся доработка выполнена в виде отдельного модуля lsFusion.
624 Asmody
 
13.10.19
00:06
(620) Молодец! Сказал человечьими словами.
Стоит добавить, что при отсутствии каких-либо тестов, эбанёт обязательно в самый неожиданный момент.
625 Asmody
 
13.10.19
00:11
(623) У программистов 1С типовые по-умолчанию "под замком". Чтобы вскрыть замок - лишний повод еще раз подумать.
У программистов 1С есть внешние отчёты и обработки, а также расширения.
Программистов 1С не вынуждают корячить структуру объектов для реализации типовых коллекций.
626 _DAle_
 
13.10.19
03:17
(618) Давайте разбираться, вы уже посмотрели, что такое в lsfusion пространства имен и как происходит поиск элементов? Давайте разберем конкретный пример: где, что, в каком модуле объявляется...

Если я правильно понял, о чем идет речь.. В каком-то не нашем модуле (назовем его Base) объявлен класс A. Мы в своем модуле (назовем его My) объявляем selected[A] используем его, затем в модуль Base добавляется свой selected[A]. Ситуация теперь такая:

1. Если пространства имен модулей Base и My не совпадают, то проблемы никакой нет, в вашем коде по прежнему будет использоваться ваш selected[A], потому что он будет приоритетней.

2. Если оба модуля Base и My находятся в одном пространстве имен, то будет конфликт, у вас будет два одинаковых свойства в одном пространстве имен, что запрещено. И тут встает вопрос, почему у вас совпадают пространства имен, ведь они и сделаны для того, чтобы разделять свое от чужого. Одно пространство имен должно быть либо у модулей, относящихся к какой-то одной библиотеке, либо хотя бы к набору модулей, написанной некой командой, внутри которой и нужно будет разрулить эту неоднозначность.
627 CrushBy
 
13.10.19
08:31
(619) [Вносить изменения в архитектуру можно только, зная наизусть все функции, которые используют изменяемый объект]
Утверждение настолько же глупое, как если в любом языке программирования сказать : "изменения в любой интерфейс можно вносить, только зная все классы, которые его реализуют и используют"
628 Bro
 
13.10.19
09:17
(619) Добавление нового DATA свойства НИКАК не влияет на весь предыдущий функционал и ничего сломать не может по определению. И в том же SQL никакой инкапсуляции нет.

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

При этом даже при проблемах в зависимых модулях и IDEA и сервер на старте сразу даст ошибку (сравните с изменением имени реквизита в 1С).
629 Bro
 
13.10.19
09:18
(625) про "тупиковые" модули, я уже сказал.
630 Bro
 
13.10.19
09:20
(622) Не надо преувеличивать возможности платформы. Мы бы убились реализовывать проекты не имея базовых модулей.
631 Ещё1
 
13.10.19
10:38
(625) Да, типовые под замком, и мы знаем почему. Потому что этот замок закрывает дорогу в ад из спагетти-образного Basic-подобного кода, со вставками в него многостраничных вложенных 1С-SQL запросов, вписанных в код в виде строк "..." + "..." +... Который легко случайно сломать, если ты не разработчик этой конфигурации.

Даже добавив 1 реквизит в документ, придётся влезть в кучу механизмов и модулей конфигурации, дописать/подправить процедуры контроля заполнения реквизитов документа, проведения/отпроведения, контроля прав доступа и проч., поменять где нужно код 1С-SQL, и потом всё это отладить на разных исходных данных. И конечно, разработчики 1С сами это прекрасно знают и понимают, но уже ничего не могут сделать. Если они сейчас уберут Basic-подобный язык и заменят его новым, с полноценным ООП, с замыканиями, с полноценной работой с параллельными потоками исполнения, с автоматическим разруливанием исполнения на клиенте/сервере приложений/сервере БД, то весь опыт, километры написанных модулей, все книжки и методические рекомендации - в 1 день превратятся в тыкву. Поэтому они такие же заложники этой платформы, как и сторонние 1С-программисты.
632 Лефмихалыч
 
naïve
13.10.19
10:59
хотя, в общем-то, конечно, когда речь об персистентных объектах, добавить что-то такое, что потом добавит сам вендор, можно на любой платформе. Тут - окай - вопрос снят.

Но вот это вот отсутствие элементарных конструкций и необходимость их городить руками, причем через СУБД, - это жопа. Не трагедия, конечно, и в последующих версиях можно добавить (в 1С же когда-то не было соответствия, например), но то, что предлагается в (502) ля реализации элементарного списка, - это костыли, палки и верёвки.
633 Bro
 
13.10.19
11:07
(632) Еще раз список (то есть new A[]) это:
= DATA LOCAL A (INTEGER). Но зато вы его персистентным можете сделать убрав LOCAL. Или превратить в соответствие, заменив на
= DATA A (B).
А можно еще параметр добавить
= DATA A (B,C). Представляете как вам придется извратиться чтобы реализовать такую конструкцию.

Ну и композиции с массивами, как делать будете: g(f(a)). Где f - это массив. Или на форму вытянуть и т.п.
634 Bro
 
13.10.19
11:08
(633) Кстати можно еще так делать

run() {
    LOCAL f = A (INTEGER); // по сути синтаксический сахар для DATA LOCAL
    f(1) <- 5;
    f(2) <- 7;
    FOR f(i) DO
      MESSAGE i;
}
635 Лефмихалыч
 
naïve
13.10.19
11:09
(633) потянуло плесенью и тленом из ораклинного подвала :)
меня в эту религию не завлечь. Все, что ты показываешь, ужасно на столько, что у меня от этого сыпь между пальцами. Хуже только абак этот усосаный из сапа.
636 Лефмихалыч
 
naïve
13.10.19
11:10
дикая помесь оракла и виндовых, сука, батников. За что вы так людей ненавидите?
637 Bro
 
13.10.19
11:15
(636) Вы просто попробуйте тоже самое на 1С сделать. Кровь из глаз пойдет. Собственно гляньте типовые и все станет на свои места. Но опять все в срач скатывается, давайте в соседнюю тему. Заодно объясните там зачем СКД нужен. Вы похоже в теме.
638 Лефмихалыч
 
naïve
13.10.19
12:14
(637) да пожалуйста:


Список = Новый СписокЗначений;
Список.Добавить(5);
Список.Добавить(7);
Для каждого Элемент из Список Цикл
   Сообщить(Элемент.Значение);
КонецЦикла


всё. Где кровь из глаз?
639 Asmody
 
13.10.19
12:15
(633) Это все иероглифы.
Давайте конкретнее.
Нужно показать выбор клиентов, предварительно ограниченных по условию "не в группе из списка", где список групп предзаполнен программно, но может быть расширен пользователем (группы, заданные программно, убрать из списка нельзя).
640 Лефмихалыч
 
naïve
13.10.19
12:16
(637) все, как я уже отмечал, скатывается туда, с чего вы же и начали, какие тут могут быть еще вопросы
641 Asmody
 
13.10.19
12:17
(639)+ подразумевается, что справочник клиентов иерархический с неограниченным уровнем иерархии, и условие "не в группе" означает "не в иерархии"
642 Asmody
 
13.10.19
12:18
(637) А ты с 1С не сравнивай. Этим в соседней ветке занимаются.
643 Лефмихалыч
 
naïve
13.10.19
12:20
(637) СКД нужен для того, чтобы отчеты делать декларативным образом и делать их так, чтобы к их деланью не возвращаться всякий раз, когда пользюкам еще одна колоночка затребуется. Чтобы всеми списками в программе пользюки могли сами управлять, как им хочется. Чтобы задачи (639) решались  в десять строк на клиенте, а не в 100500 строк везде плюс пару столбцов в БД.
Тупее вопроса, чем "зачем СКД" придумать нельзя.
644 Bro
 
13.10.19
12:21
(638) ok (хотя я не про этот случай говорил), а сделайте теперь его персистент. Или сделайте f = DATA A (B,C)
И f(1,2) <- 3. И ничего что у вас список нетипизированный. И чем это отличается от run что я кинул.
645 Bro
 
13.10.19
12:26
(643) возвращаться придется как только понадобится что то сложнее примитивного взять значение по ссылке. Или пользователи join ы со срезом последних сами будут добавлять. И опять таки в печатную форму это нафиг надо, а для аналитики неудобно (641) как только у компа буду напишу
646 Лефмихалыч
 
naïve
13.10.19
13:04
(645) это бла-бла всё. Покажи руками, как надо вот это делать (639) (641)
647 Лефмихалыч
 
naïve
13.10.19
13:05
(644) от твоих иеромантических заклинаний это отличается хотя бы тем, что кому угодно понятно, что делает этот код. Даже не программисту. Например.
648 Bro
 
13.10.19
13:09
(647) код который я кидал тоже понятен. Но вы самый примитивный случай взяли. А теперь давайте (644) с двумя параметрами. И дадим его не программисту. Или даже программисту не знакомому с 1с и фьюжен.
649 Лефмихалыч
 
naïve
13.10.19
13:11
(648) > Или сделайте f = DATA A (B,C) И f(1,2) <- 3

я вот эту всю тарабарщину не разумею, переведи на русский эту хуету для начала
650 Flyd-s
 
13.10.19
13:19
У вас в типовом решении всюду переменные A B C или это только для мисты лень нормальные имена придумывать?
651 Bro
 
13.10.19
13:20
Двумерный массив, где ключи не числа а любые объекты. Ну или соответствие с двумя параметрами.

Например
in = DATA BOOLEAN (Sku, Stock);
in(skuById(15), stockById(10)) <- TRUE; включит в ассортимент магазина с id 10, sku с id 15.
652 НиколаевГ
 
13.10.19
13:51
(650) Максимальный уровень абстракции же...
653 Лефмихалыч
 
naïve
13.10.19
13:53
(651) ЯННП, но очень интересно. продолжай
654 Asmody
 
13.10.19
13:55
(651) Последние скобки у вас, насколько я понимаю, описывают принадлежность реквизита классу. В данном случае - реквизит принадлежит декартову произведению классов?
655 НиколаевГ
 
13.10.19
13:58
(651) Так ты корову не продашь...
656 Asmody
 
13.10.19
13:58
(654)+ причём, оператор DATA говорит, что значения будут храниться в БД. И, если я еще не забыл реляционную алгебру, это требует как минимум одной дополнительной таблицы. Т.е. для создания массива мы в лёгкую меняем структуру БД?
657 Bro
 
13.10.19
14:20
(654) Описывает параметры и их классы этого реквизита. Но вообще лучше на реквизиты смотреть как на функции, или колонки в таблице, где параметры являются ее ключами.

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

(656) Нет, оно может (и будет по умолчанию) колонкой существующей таблицы. Но опять таки если вы сделаете глобальное свойство. DATA LOCAL никак на структуру таблиц влиять не будет.
658 Злопчинский
 
13.10.19
14:21
(630) наличие базовых модулей никак не связано с наличием коробочного решения. я об этом и говорю.
659 Злопчинский
 
13.10.19
14:26
фузиновцы на все что не могуть сходу ответить - пропускают.. (639) так и задинамили
660 Лефмихалыч
 
naïve
13.10.19
14:35
(657) лучше на реквизиты смотреть, как на колонки в таблице... не слишком ли это низкоуровнево в наш бурный двадцать первый век? Убожество...

Смотрю время от времени на своих ораклистов и у меня кровь из глаз и ушей, когда они, проектируя архитектуру под бизнес-задачу, оперируют ссаными isn'ами в грёбаных табличках, а реальные бизнес-сущности и их связи с этим всем говнищем низкоуровневым в головах держат и изо всех сил стараются их не расплескать. В фузине, очевидно, та же история?
661 Bro
 
13.10.19
14:37
(639) Я не скажу так ли понял задачу. Но попробуем. Делаем группу клиентов
CLASS ClientGroup;
@defineHierarchy(clientGroup, ClientGroup);

Этот метакод создаст свойства в частности
parent = DATA ClientGroup (ClientGroup);
// количество путей от child к parent, что одновременно является признаком достижимости
level (ClientGroup child, ClientGroup parent) = RECURSION 1l IF child IS ClientGroup AND parent == child
                 STEP 2l IF parent == parent($parent) MATERIALIZED;

Кстати заодно материализует, что будет работать гораздо быстрее чем в 1С.

Дальше вы делаете:
selected = DATA LOCAL BOOLEAN (ClientGroup);

Потом заполняете как хотите
selected(ClientGroup cl) <- TRUE WHERE name(c) LIKE '%ff%';
ну или просто можете не DATA создавать selected(ClientGroup cl) = name(c) LIKE '%ff%';

можете дополнительно сделать
userSelected = DATA LOCAL BOOLEAN (ClientGroup);
И дать заполнить пользователю (ну или не на отдельной, а на той же форме)
FORM select
   OBJECTS cg = ClientGroup
   PROPERTIES (cg) name, userSelected
;
SHOW select;

Дальше делаете скажем
allSelected(ClientGroup cg) = selected(cg) OR userSelected(cg)
group = DATA ClientGroup (Client);

FORM filteredClients
   OBJECTS c = Client
   PROPERTIES (c) name
   FILTERS NOT (GROUP MAX level(group(c), allSelected(ClientGroup cg))); // если группа входит хоть в одну из отмеченных
;
DIALOG filteredClients OBJECTS c INPUT DO
    MESSAGE 'selected client' + name(c);
662 Bro
 
13.10.19
14:38
(660) Это просто для аналогии (хотя куда логичнее их как функции представлять). Как раз в lsFusion о таблицах ничего не надо знать.

Как и о всяких ЛЕВЫХ СОЕДИНЕНИЯХ, ПРАВЫХ, ОБЪЕДИНЕНИЯХ и т.п. Но ничего пишут как-то на том же 1С.
663 Лефмихалыч
 
naïve
13.10.19
14:41
(662) >Как и о всяких ЛЕВЫХ СОЕДИНЕНИЯХ, ПРАВЫХ, ОБЪЕДИНЕНИЯХ и т.п.
мы это проходили с семеркой. Херово получалось. Мы повзрослели.
664 Asmody
 
13.10.19
14:42
(657) [Нет, оно может (и будет по умолчанию) колонкой существующей таблицы] - опа-опа-опа! Декартово произведение таблиц одной колонкой в одной из них? Это новое слово в математике?
665 Лефмихалыч
 
naïve
13.10.19
14:43
(661) то есть для решения этой __интерфейсной__ задачи нам надо менять архитектуру. Что и требовалось доказать.
666 Bro
 
13.10.19
14:43
(663) Ну или просто платформа криво сделано была. В lsFusion все отлично получается, но опять таки давайте в соседнюю ветку.
667 Bro
 
13.10.19
14:47
(664) Если вы создаете свойство (Sku, Stock) оно пойдет в таблицу с ключами таких классов. Вы возможно забываете что DATA по умолчанию NULL и не требует создания записей.

Но если вы сделаете in(Sku sk, Stock st) = sk IS Sku AND st IS Stock MATERIALIZED. То да, там будет декартово произведение и будет обновляться платформой при добавлении / удалении Sku и Stock. ну или in(Sku sk, Stock st) <- TRUE WHERE sk IS Sku AND st IS Stock;

(665) Нет никакую архитектуру менять не надо. Никакая колонка нигде не создастся если вы об этом.
668 Asmody
 
13.10.19
14:47
(661) И чтоб сделать то же самое с товарами, мне надо провернуть вот это все со справочником Товары?
Это же "прекрасно"!
669 Asmody
 
13.10.19
14:50
(667) Но мы же "смотрим на реквизиты не как на колонки". Оторвемся от физической реализации. Вы для решения _частных_ задач заставляете менять структуру объекта. Пусть бы даже на логическом уровне.
670 Bro
 
13.10.19
14:51
(668) Что именно провернуть? Справочник и иерархия это две строки кода (причем которая будет куда эффективнее чем в 1С работать)

Ну и третья отметка. Ну или можете selected = DATA LOCAL BOOLEAN (Object); создать в базовом модуле и не создавать его. То же самое с userSelected.

Я если честно вообще не понимаю о чем речь. свойство level это по сути В ИЕРАРХИИ только в куда более общем случае.
671 Лефмихалыч
 
naïve
13.10.19
14:51
конкретный вопрос: нач0рта было придумывать свой инвалидский вот этот тарабарский язык? Почему не использовать было джаву или питон хотя бы?
Какие именно соображения под этим решением были?
672 CrushBy
 
13.10.19
14:52
(668)  Не путайте. Обычно все эти свойства с иерархиями уже построены и их просто нужно повторно использовать.

(669) Добавление локального свойства никаким образом структуру объекта не меняет.

(671) Может и SQL не нужен - лучше бы использовали Java или Python ? Такая логика ?
673 Bro
 
13.10.19
14:53
(669) Уточните что вы имеете ввиду под структурой объекта. Еще раз есть свойства, есть объекты. Структура это производное понятие - все свойства которым объект подходит по классам хоть к одному параметру.
(671) Ну и как на java выглядел бы синтаксис форм? Ну или рекурсий? Язык идеологически гораздо декларативнее и java и python.
674 НиколаевГ
 
13.10.19
15:00
(673) Порог входа одна неделя, говорите? Хм....
675 Asmody
 
13.10.19
15:03
(672) (673) Вы между собой договоритесь тогда что вы считаете объектом и что определяет его структуру.
676 Bro
 
13.10.19
15:05
(675) Я не знаю что он имеет ввиду. Как и вы. Структура объекта в lsFusion это вкладка Structure в IDEA слева снизу и это именно то, что я написал в своем ответе.
(674) Тут как раз ирония, что людям с нуля гораздо проще понять lsFusion, чем людям которые привыкли к каким то готовым шаблонам и пытаются натянуть их на все подряд. Хотя опять-таки я видел людей, которые за полдня разбирались.
677 Лефмихалыч
 
naïve
13.10.19
15:06
(672) (673) то есть причина - чтобы на клиенте и сервере синтаксис был единым, я правильно вас понял?
678 Bro
 
13.10.19
15:06
* Речь шла про структуру объекта, а не сам объект. С самими объектами особых разногласий нет, как я понимаю.
680 Лефмихалыч
 
naïve
13.10.19
15:07
есть структура объекта и есть _сам_ объект. Хмм... все просто, да.
681 Bro
 
13.10.19
15:08
(677) Да нет, просто у нас язык очень декларативный и language-based (как SAP, SQL, и частично Axapta). Натянуть его на java это все равно что ежа с ужом скрещивать.
682 НиколаевГ
 
13.10.19
15:08
(676) Вы не в состоянии объяснить свои концепции даже программистам, а не ИТ-шники не понимают концепций, они становятся обезьянками-кодерами, каковые вам, видимо, и нужны, чтобы самим с концептуальными вещами в облаках парить...
683 Bro
 
13.10.19
15:09
(680) Нет никакой структуры объекта, точнее есть, но это маленькая вкладка в IDEA (ну и в completion учавствует). В данном случае ее Asmody притащил и поставил на первое место зачем-то.
684 Лефмихалыч
 
naïve
13.10.19
15:10
реквизиты - это функции, но они как колонки в таблице... но это просто пример и на самом деле ничего в БД не хранится.

Мне кажется или кто-то скрывает от санитаров, что уже неделю таблетки под подушку ныкает?
685 Лефмихалыч
 
naïve
13.10.19
15:11
(683) ну, да, вот я именно об этом, ага
686 Bro
 
13.10.19
15:11
(682) Нет просто ИТ-шники привыкли тянуть свои порой очень не совершенные абстракции вместе с собой. Вон в соседней ветке все СКД тянут, хотя ни в одной другой технологии таких вещей нет.
687 Лефмихалыч
 
naïve
13.10.19
15:12
(686) по этому - накуй абстрации, будем манипулячить табличками, которые не таблички, а как функции, но при этом то жранятся, то нет, но вообще-то все просто и платформа сауыршэнна. Да, все понятно. Предельно.
688 Bro
 
13.10.19
15:12
(684) Я просто пытался хоть какие-то похожие абстракции привести для примера. И таблица с ключами логически по сути и есть функция. Но еще лучше просто забыть про все что знал до, это будет только мешать.
689 Bro
 
13.10.19
15:13
(688) Поэтому порог входа как не парадоксально для людей с улице иногда ниже, чем для людей с ИТ-бэкграундом. Как иногда дом проще построить с нуля, чем перестраивать существующий.
690 Лефмихалыч
 
naïve
13.10.19
15:16
я когда-то видел одно уёбище на дельфях, у которого все все НСИ в одной табличке хранились, а все атрибуты в одном текстовом поле, где был некий адский аналог json'а. В результате там аспирин мог купить Иванова Ивана и расплатиться организациями. Тамошние клешнеруки тоже упирали на то, что "это у вас подходы не подходы, абстракции не абстракции и вообще вы все закостеневшие, а у нас инновационный подход и всё удобно".
Поделие почило в бозе довольно быстро
691 Лефмихалыч
 
naïve
13.10.19
15:18
(688) и для вас не очевидно, что причина в том, что вы изобрели велосипед заново?
692 Asmody
 
13.10.19
15:18
(683) да мне плевать, что у вас в IDE. Если вы вводите в язык понятие "объект", то у вас автоматически появляется его структура. Иначе абстракция не имеет смысла. И то, как вы предлагаете обращаться со структурой объектов – это в других местах называется "monkey patch", я уже говорил. Хорошо это, или плохо - скорее плохо. Но, например, создатели рельсов так не считают.
693 Лефмихалыч
 
naïve
13.10.19
15:19
+(692) но тока и где щас эти рельсы
694 Asmody
 
13.10.19
15:21
(688) Вы же понимаете, что любая чистая функция может быть задана в табличной форме?
695 Bro
 
13.10.19
15:25
(691) Так а предыдущий велосипед как назывался?
(692) >то у вас автоматически появляется его структура
Что такое структура?
Monkey patch - это перегрузка реализации ЕМНИП. Как раз в lsFusion ее в неявном виде нет. Или вы про что-то другое? (694) можно уточнить что именно вы имеете ввиду под табличной формой?
696 Asmody
 
13.10.19
15:34
(695) Я размышляю, на какой курс университета вас отправить с такими вопросами.
697 Asmody
 
13.10.19
15:38
Хотя, таблицы Брадиса ещё в школе используют. Так что, в школу.
698 НиколаевГ
 
13.10.19
15:48
(686) Попробуйте объяснить последовательно, не перескакивая с одного на другое, не употребляя общие термины в своей интерпретации. Повторяйте до тех пор, пока мы не скажем - всё понятно. Если не сможете - перспектив особых у вас нет...
699 НиколаевГ
 
13.10.19
15:50
(698) А, да, сначала друг другу пообъясняйте, а то вы сами одно и то-же разными терминами называете.
700 Bro
 
13.10.19
15:52
(697) У меня очень хороший математический бэкграунд, но я все равно не понял ваше замечание "что любая чистая функция может быть задана в табличной форме?" и причем тут таблицы брадиса?
(698) SQL я вам тем более так не объясню. Я видел миллионы планов, но не в состоянии понять что будет если сделать left join таблицы и не указать там все ключи. Но как то вас SQL заставили учить.

В любом случае, тут пока идет терминологический философский спор. Если кто-то здесь что-то не может понять, то только потому что не хочет.
701 НиколаевГ
 
13.10.19
15:58
(700) SQL мне не надо объяснять, я этого не просил. Объясните хотя-бы свои базовые термины и концепции, чтобы людям не пришлось за вас неправильно додумывать.
702 Bro
 
13.10.19
15:59
703 Злопчинский
 
13.10.19
16:03
обычно новые концепции обьясняют через старые.
было бы хорошо весь этот тарабарский язык и парадигму обьяснить отталкиваясь от чего-то привычного..
.
а то меня от одних фраз где упоминается "форма" начинает адски плющить.
я не понимаю что за форма имеется в виду. визуальная форма? форма как описание обьекта, то есть по сути сам обьект? что-то иное?.
.
для меня в парадигме бизнс-программирование - форма есть визуальное отображение некой сущности, причем сущность и форма вообщем никак между собой не связаны. сущность может существовать и оперировать этой сущностью можно и без формы-визуального представления.
.
здесь же мне нихера непонятно.
704 НиколаевГ
 
13.10.19
16:04
(702) 1С-ники, как известно, тупые и жадные. Если они видят что-то сложное и непонятное, и при этом не видят, как на этом заработать денег - им становится грустно. В общем, эти статьи далеко не для разжевывания тупым и жадным. Вот Асмоди все их прочитал, а всё равно большую часть ваших интерпретаций терминов не понимает. А Асмоди не тупой, если что :))
705 Злопчинский
 
13.10.19
16:05
(702) а можно вот это все - где-то всетаки на фузиновском сайте публиковать, а то вы бы еще на порнхаб закинули бы.
706 Лефмихалыч
 
naïve
13.10.19
16:14
(703) +100500 я тоже не понимаю почти ничего в этом копрокоде, да и пояснения их сами по себе нуждаются в пояснениях каждый раз.
707 kyvv
 
13.10.19
16:20
(702) Даешь 1СФузю  на русском!
708 kyvv
 
13.10.19
16:22
(707) И без ООП!
709 Злопчинский
 
13.10.19
16:26
"Первичное свойство"
quantity = DATA INTEGER (Item);

- хранится в базе, тип "целое"
что такое quantity и что такое item - нихрена непонятно.
одно из них некий идентификатор, по которому можно определить это свойство в базе. какое из них какое? другое что обозначает?
710 Злопчинский
 
13.10.19
16:29
При использовании оператора первичного свойства необходимо задать, какие классы создаваемое свойство принимает на вход (о самих классах также чуть позже), и какой класс значения это свойство может возвращать.

эээ?

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

судя по схеме - понятие "класс" использует понятие "свойство" (?).
.
каким образом тогда свойсвто определяется через класс? что такое класс как основа использования в "свойсто"...?

нихера не понял.
коктейл рекурсивный?
711 Bro
 
13.10.19
16:35
(710) Там про класс есть уточнение в самом разделе про классы. Класс логически не больше чем ограничение. И все свойства можно от Object делать. Но тут да была проблема курица яйцо
712 PR
 
13.10.19
16:39
Так интересно читать этот крутящийся миксер с рваными кусками смысла :))
713 PR
 
13.10.19
16:42
Более тупых и упоротых, одновременно как кот Шрёдингера убийц и не убийц 1С (по их собственному утверждению) я еще не встречал
714 НиколаевГ
 
13.10.19
16:46
(711)Ы... Вас же здесь никто не понимает, совсем никто :((
715 Flyd-s
 
13.10.19
16:51
(711), читаю объяснения и становится с каждым разом только менее понятно. «Класс - это ограничение», - в голове возникает конструкция if else
716 ДенисЧ
 
13.10.19
16:58
(712) Где ты тут смысл нашёл?
717 PR
 
13.10.19
16:58
(714) Да почему?
Я отдаленно многое понимаю, все-таки специальность "Информационные системы в экономике" была в ВУЗе
Asmody тот же понимает
Обычно вся эта хрень про ООП, абстракции, нормализацию таблиц, дрочка на увеличение скорости на миллисекунды и пр. заканчивается сразу же после окончания теоретического обучения, то есть после школы и (у кого был) ВУЗа
Я не говорю про трушных чисто кодеров, которые потом со всем этим (тоже, конечно же, видоизмененным, но все же) живут всю жизнь, им можно и нужно
Я не могу поверить, что фузиновцы уже 10 лет мнут свой пластилин
Такое ощущение, что они пару месяцев назад закончили школу и теперь им в ВУЗе наконец-то начали рассказывать интересные вещи, они быстренько накидали несколько таблиц, назвали это решением, и сразу же побежали убивать 1С со своими теоретическими знаниями
В 2000-м я наверное даже с интересом бы все это читал, думая, не стоит ли поставить на Фузину, а не на 1С
А сейчас ничего кроме удивления и раздражения такая упоротость у меня не вызывает
718 ДенисЧ
 
13.10.19
17:00
Короче я понял.
Это очень концептуальная вещь. Не только лишь всякий может её понять.

https://cdn-tn.fishki.net/26/upload/post/2019/10/13/3112837/607a74f291fc8f3234766520186a0b8e.jpg
719 PR
 
13.10.19
17:01
(715) Класс — это некоторая схема данных, если тебе так будет понятнее
В 1С есть таблицы базы данных tt1, tt2, tt3, а есть класс "Справочники", есть Объект "Контрагенты", они сразу же определяют свойства и метожы
Это ООП
Я конечно очень передернул и мегаупростил, но что бы хоть как-то было понятно человеку, не знающему про ООП
720 НиколаевГ
 
13.10.19
17:04
(717) Если понимаешь, тогда объясни что такое Объект и Свойство у фузиновцев.
721 CrushBy
 
13.10.19
17:04
Класс - это класс. Свойство - это функция. Изучите основы программирования, что ли, если не понимаете.
722 PR
 
13.10.19
17:04
(718) Не позорь одинесников, а то так тебя послушать, у нас все домохозяйки с 9 классами, методом тыка освоившие 1С
723 PR
 
13.10.19
17:05
(721) Заипись. Класс — это класс. Пять с плюсом. Садись.
724 PR
 
13.10.19
17:06
(720) То же самое, что и в классическом ООП
Тебе найти ссылку на ООП для чайников?
Там не так сложно, как могло бы показаться
725 НиколаевГ
 
13.10.19
17:06
(721) А вот братишка твой говорит, что класс это "логически не больше чем ограничение". Как, блин, вас с такими объяснениями понимать?
726 PR
 
13.10.19
17:07
(720) Ну например вот очень упрощенно https://codengineering.ru/post/21
727 ДенисЧ
 
13.10.19
17:07
(722) Я не знаком с вашими домохозяйками.
728 НиколаевГ
 
13.10.19
17:08
(724) Не угадал ты ни разу. Вот что такое свойство у фузины "Свойство – это абстракция, которая принимает на вход один или несколько объектов в качестве параметров и возвращает некоторый объект в качестве результата."
729 CrushBy
 
13.10.19
17:09
(725) С философской точки зрения - это в некотором смысле верно. Если задуматься вообще о понятии класса, интерфейсов и прочего.
730 PR
 
13.10.19
17:09
(725) Класс — это ограничение работы с данными
Его свойства и методы касаются четко определенных вещей
Методы класса "Справочники" не позволят обратиться к документу, например
731 CrushBy
 
13.10.19
17:10
(728) Ровно такой же смысл, как и любой функции в обычном языке программирования (в том же 1С).
732 PR
 
13.10.19
17:11
(728) Я не говорю про кашу в голове Бро
Я тебе говорю так, чтобы было понятно
733 НиколаевГ
 
13.10.19
17:11
(731) Почему, тогда вы его "свойство" назвали, надмозги?
734 НиколаевГ
 
13.10.19
17:12
(732) А я говорю про то, как их понять. Иначе всё это не имеет никакого смысла.
735 PR
 
13.10.19
17:12
(733) Потому что функция, а не процедура
И потому что это не константа все-таки, а вариативное значение
736 НиколаевГ
 
13.10.19
17:13
(729) Нахрен ваша философия не сдалась, мы тут практики, это на хабре можете с тамошними обитателями друг друга философией дрочить.
737 PR
 
13.10.19
17:13
(734) Зачем их понимать?
Если хочешь изучить ООП, загугли и изучи
Пока мне все происходящее напоминает анекдот про Василия Ивановича, Петьку, пластилин и говно
738 НиколаевГ
 
13.10.19
17:14
(735) Ты, блин, о чем, любая процедура сводится к функции.
739 PR
 
13.10.19
17:15
+(737) Мне в универе было интересно, что такое ООП, я не бросался изучать бизнес-решения, а почитал классические академические книжки
740 НиколаевГ
 
13.10.19
17:16
(737) Ну вот хочу я их понять, а они не хотят, чтобы я их понял. Такая вот петрушка.
741 PR
 
13.10.19
17:16
(738) И что?
Функция — это вопрос о чем-то, например Метаданные.Справочники.Количество()
Процедура — это приказ что-то сделать, например Сообщить("Вася")
742 НиколаевГ
 
13.10.19
17:16
(739) Так у фузины не ООП, ты о чём вообще?
743 PR
 
13.10.19
17:17
(740) А, ну тогда да, продолжай изучать сорта говна дальше :))
744 PR
 
13.10.19
17:18
(742) Ты и я про то :))
745 НиколаевГ
 
13.10.19
17:18
(741) Оно и видно, что "информационные системы в экономике".
746 PR
 
13.10.19
17:19
(745) Ну так экономфак, куле :))
747 НиколаевГ
 
13.10.19
17:19
(744) Нет, я про ООП ничего тут не писал, совсем ничего.
748 НиколаевГ
 
13.10.19
17:22
(746) Ну ладно, а вот это объясни: "Свойство не имеет последействия, и, по сути, является чистой функцией, однако, в отличие от последней, может не только вычислять значения, но и хранить их"
749 PR
 
13.10.19
17:23
(748) Да куй его знает, видимо что-то то ли про кеш то ли про заполнение каких-то полей в базе данных
750 Кац
 
13.10.19
17:24
Попробовал сейчас внедрить фузину и завоевать рынок во всей саратовской области, но сука не смог.
А где в ней торг-12 то хоть распечатать? и счет фактуру?
751 PR
 
13.10.19
17:24
(750) Так надо написать
Там строчек пять кода
752 Кац
 
13.10.19
17:25
бляяяя....
753 Bro
 
13.10.19
17:25
(749) PR, а вы сообразительнее многих тут оказывается. Отвернешься и засрали ветку. Что такое свойство в других языках знаете? Здесь тоже самое.
754 НиколаевГ
 
13.10.19
17:26
(749) Оть имянно... А для тех, кто это понимает - фузина нахрен не впёрлась, они и так свои 4-5 тысяч баксов в месяц имеют.
755 НиколаевГ
 
13.10.19
17:28
(753) Ога... Чьи слова "Собственно, само название “свойство” позаимствовано из других современных языков программирования, где оно используется приблизительно для тех же целей, но при этом гвоздями прибито к инкапсуляции и, соответственно, поддерживается только для функций с одним параметром. Ну и в пользу использования именно этого термина сыграло то, что это само слово “свойство” короче, чем «чистая функция», плюс не имеет ненужных ассоциаций."
756 PR
 
13.10.19
17:34
(753) Ой, спасибо за комплимент :))
Но до фузиновцев мне далеко
Я и не отворачивался, а камаз за камазом с говном все летят мимо, разбрызгивая зловонную жидкость на все окружающее
Про свойство я объяснил своими словами, чтобы хотя бы было хоть что-то, а не Крашевское "класс — это класс"
757 Bro
 
13.10.19
17:37
(756) Не про функции все правильно. Я про то почему свойство, а не функция или чистая функция. А разница что в свойство можно писать (setter есть). А в классическую функцию - нет.
758 Bro
 
13.10.19
17:37
(757) И это не мы сам термин свойство придумали.
759 НиколаевГ
 
13.10.19
17:41
(757) Так это значит, что "свойство" в вашем понимании это не то, что "свойство" в понимании ООП, например. И, поэтому задавать определение своего свойства надо через определение свойства в ООП, и отличие вашего "свойства" от свойства в ООП, чтобы другим было понятно, что же в имеете в виду на самом деле.
760 PR
 
13.10.19
17:43
(757) Да проблема не в том, что вы придумали какую-то непонятную зверушку, в которой непонятно, что есть, а чего нет
Проблема в том, что вообще в принципе непонятна цель написания вами даже первой статьи, не говоря об остальных
Я пока понял так, что интереса к вашей говноподелке нет от слова совсем, а хочется
Поэтому Моська нашла Слона, нажралась побольше подгнивших овощей и начала поносить, как в последний раз
761 НиколаевГ
 
13.10.19
17:44
(760) Как это непонятно? Почесать ЧСВ - бесценно, уж тебе ли не знать...
762 PR
 
13.10.19
17:46
(761) Да на любое подобие Моего склада на php одинесники возбудились бы куда больше
763 Михаил Иванович
 
13.10.19
17:47
(760) Самое смешное, что пройдет два три месяца и про фузину не вспомнит ни кто, может кроме двух трех гикнутых)) А сколько сейчас льется ммм.. фекалий
764 Bro
 
13.10.19
17:51
(760) Интереса как раз более чем достаточно (для россии само собой). Но вы же понимаете, начинать экспансию с самого гнилого рынка это идиотизм. Ни одна технология в мире еще не стартовала с России (сами понимаете по чему). Тем более с мисты :) Но миста реально дала хорошее понимание чужих и своих слабых мест.

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

Начинать борьбу с 1С, это все равно что Теслу начинать продавать где-нибудь в Сибири. Цель другая была, если вы этого еще не поняли.
765 PR
 
13.10.19
17:54
(764) Ой, вот мне так кажется, нужно показать Волшебник слова про гнилой рынок, может у него хоть спадет с глаз эта странная пелена и он забанит вас к ебеням :))
766 Михаил Иванович
 
13.10.19
17:54
(764) Смешно читать, обос-сь и теперь суетятся.
767 Bro
 
13.10.19
17:59
(765) А вы скажете что российский это передовой рынок и все инновации начинаются с него? Come on. Гнилой вы же понимаете что в контексте использовано. В смысле что самый консервативный и скептически настроенный ко всему новому.
768 PR
 
13.10.19
18:00
(767) Ты не переживай, я все услышал, что было нужно, теперь посмотрим, услышит ли Волшебник
769 PR
 
13.10.19
18:01
(767) Я даже не буду с тобой спорить по поводу "самый консервативный и скептически настроенный ко всему новому"
Зачем спорить с упоротым
770 НиколаевГ
 
13.10.19
18:14
(765) Так он, если верить фузиновцам, денег за это с них взял. Так-то, если это правда - то Волшебник гений :))
771 PR
 
13.10.19
18:21
(770) Разве взял? Где про это говорилось?
772 НиколаевГ
 
13.10.19
18:33
773 НиколаевГ
 
13.10.19
18:33
(764) А виноград-то зелен, да?
774 НиколаевГ
 
13.10.19
18:46
Но вернемся к конкретным вопросам. Вот я, тупой и жадный 1С-ник, прошу вас объяснить, что такое "свойство" в вашей парадигме. Исходите из того, что я не знаю, что такое "свойство" в других ЯП.
Почему спрашиваю - я жадный, и увидел деньги, которые могу заработать посредством вашей платформы. Но для этого мне надо суметь объяснить вашу парадигму ИТ-директору компании из топ-250 форбс в России, с "белой" выручкой 50 млрд. руб в год.
775 Bro
 
13.10.19
18:54
(774) Это функция с возможностью записи (для некоторых ее типов).
776 НиколаевГ
 
13.10.19
18:59
(775) То есть, вы хотите, чтобы я никому не рассказывал о вашей платформе? Ну что-же, это ваш выбор.
777 PR
 
13.10.19
18:59
(772) Тю
778 Злопчинский
 
13.10.19
20:14
(775) запси чего? куда? каких типов? при чем здесь типы у функции?
779 Лефмихалыч
 
naïve
13.10.19
20:44
(778) не тупи! функция - это же свойство. И вот это свойство с функцией записывания. Для некоторых ее типов. Все же понятно тебе объяснили.
780 Лефмихалыч
 
naïve
13.10.19
20:45
и тут у ней унутре неонка зарделась
781 Asmody
 
13.10.19
20:46
(774) Я попробую доступно объяснить про свойства. Но сначала положим, что "объект" - это некий ящик (в зависимости от того, знаем мы его "структуру" или нет). В ящие есть много отверстий с названиями над ними. Мы можем сунуть руку в отверстие с названием "фрукт" и достать  из ящика яблоко (значение свойства). Как мы "сунули руку" - через "точку" (Ящик.фрукт) или в функциональной записи (фрукт(ящик)) - это детали реализации. (В ином мире ящику надо письмо со словом "фрукт" послать чтобы он яблоко вернул. Это если следовать классике ООП) Не суть. В некоторые отверстия надо сначала что-то засунуть, чтобы обратно что-то получить - это будут уже "методы". А в некоторых вам просто откусят руку, потому что там void или null или, что хуже всего, необработанное исключение.

Так вот. Совокупность "отверстий" в ящике (это, если угодно, будет называться "интерфейс") определяет суть объекта для внешнего мира. Мы можем считать ящики с одинаковым набором отверстий "похожими" (или принадлежащему одному классу). В том смысле, что если где-то нам смог пригодиться один ящик, то возможно и пригодится похожий ящик.
782 Asmody
 
13.10.19
20:48
Другое дело, что фузина для установку выбранных ящиков в ряд на полку, требует просверлить в каждом по отверстию и написать над ним "ящик стоит на полке"
783 Asmody
 
13.10.19
20:50
Причем, я даже понимаю эту концепцию. В рамках их декларативно-функционального подхода. Но блин, списки есть даже в Haskell'е.
784 Лефмихалыч
 
naïve
13.10.19
20:52
(782) при этом, в зависимости от диметра сверла, это могут быть какие-то умозрительные отверстия, которые вроде как шкуру ящиков не портят, хотя и являются персистентными. Но это не точно - тут туману дохрена...
785 Bro
 
13.10.19
21:12
(781) Я вот честно не понял аналогию с отверстиями. Как мне кажется, с ящиком у вас опять получается инкапсуляция. И объект стал субьектом.

Все же проще идти от обратного. Свойство - это ящик с n дырками на вход и одной на выход. И в некоторых ящиках дырка на выход работает еще и на вход (возвращая на выход, то что ей дали на вход).

И Haskell все же сильно отличается от lsFusion. У него нету операции, а дай мне все объекты ящика, которые на выход дают не NULL.
786 Asmody
 
13.10.19
21:17
(785) Ящик - это тоже абстракция. Как материализация объекта. На самом деле, "ящик" это тоже "отверстие"-функция от Мира.
787 Лефмихалыч
 
naïve
13.10.19
21:19
хорош абстрагировать на людях
788 Asmody
 
13.10.19
21:19
В конце концов, у вас же есть какое-то подобие общих функций? Как вы туда и оттуда списки гоняете?
789 Asmody
 
13.10.19
21:21
(787) Я только начал, у меня ещё на два пальца абстракций в бокале
790 Лефмихалыч
 
naïve
13.10.19
21:21
(788) туда передают isn того, по чему оно там из БД список вычитает. Очевидно же.
791 ДенисЧ
 
13.10.19
21:30
Пропаганда абстракционизма в чате!!!
792 Ещё1
 
13.10.19
21:33
О, у вас тут теоретические дискуссии неслабые! Дайте добавлю своих 5 копеек (да я знаю, их никто не просил). Далее - насколько могу упрощённо теорию, опуская нюансы. И что я понял за пару дней по пару часов читая доки Фузины.

Класс в ООП - это тип данных. Они описывают некие данные, с которыми приходится иметь дело программисту. Класс может обладать разными атрибутами (также в разных системах могут называться полями, реквизитами), а также может включать методы для работы с этими атрибутами. lsFusion, как и 1С, оперирует как простыми классами (класс целых чисел INTEGER, класс строк STRING, класс дат DATE и т.п.), так и бизнес-ориентированными: класс справочника номенклатуры, класс документа реализации и т.п. Примеры атрибутов документа реализации в 1С: Номер, Дата, Пометка проведения, Организация, Склад и т.п. Т.е. атрибуты - это вложенные в наш класс объекты других классов.

Объект в ООП - это конкретный экземпляр определённого класса. Т.е. числа 10, 100, -1234.12, строки "привет", конкретная позиция номенклатуры 'Зубная паста "Наши зубы"', конкретный документ реализации №12345 от 13.10.2019 - это всё объекты.

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

Немного остановлюсь на инкапсуляции - это когда все атрибуты класса спрятаны внутри самого класса. А чтобы программисту работать с ними, снаружи класса видны его свойства. Некоторые свойства класса дают прямой доступ к его атрибутам, т.е. набирая свойство в тексте программы, можно читать и записывать значение определённого атрибута. Другие свойства более сложные: они получают на вход некоторый набор параметров (p1, p2, p3 или более), которые представляют собой другие объекты, анализируют атрибуты нашего объекта, и возвращают новый объект. Т.е. по сути свойства класса - есть функции, получающие в качестве параметров объект нашего класса (параметр p0), указанные в его описании параметры p1, p2,..., и возвращающие указанный в описании новый объект.

Это всё общая теория ООП, её можно найти в Вики, кому интересно, наверное не стоит углубляться здесь более.

Теперь ближе к теме и практике. Классы, объекты и их свойства - это то, чем оперирует программист lsFusion, и чем оперирует сервер приложений lsFusion (2-е звено 3-х звенной архитектуры приложения СУБД <-> Сервер приложений <-> Клиентское приложение). На 1-м, самом низком уровне СУБД, обычно классам соответствуют таблицы БД (но не всегда), а свойствам - столбцы в этих таблицах (но не всегда).

Про классы и объекты в lsFusion я написал вначале, и привёл примеры. Остановимся на свойствах. Разберём свойство приведённое в (709):
quantity = DATA INTEGER (Item);
quantity (количество) - это имя свойства. Какому классу принадлежит это свойство? Классу указанному справа в скобках - Item (элемент какого-то списка).
Это свойство не имеет параметров, а значит даёт прямой доступ к атрибуту класса Item. По сути оно и есть атрибут класса, и имеет тип INTEGER (целочисленное число).
Поскольку свойство описано как DATA - оно является первичным, а значит будет иметь отображение на уровне СУБД. Item будет соответствовать таблица БД, а quantity - поле в этой таблицы. Наверное, тут всё понятно.

Другой пример из (661):
selected = DATA LOCAL BOOLEAN (ClientGroup);
Здесь описано свойство selected (выбрано), и оно принадлежит классу ClientGroup. Оно имеет тип BOOLEAN (логический тип), т.е. определяет является ли некая группа клиентов выбранной или нет.
Оно также описано словом DATA, а значит будет отображаться в БД. Но поскольку указано DATA LOCAL, это свойство будет сохранятся только на время работы текущей сессии. Грубо, как только пользователь подтвердит внесённые им изменения в форме, или закроет приложение - эти данные будут удалены. Т.е. всё тоже, что в 1-м примере, только свойство хранится локально для пользователя программы, для текущей сессии.

Ещё пример:
in = DATA BOOLEAN (Sku, Stock);
Это тоже задание свойства in, которое имеет логический тип (BOOLEAN) и хранится в базе (DATA). Но в скобках указаны сразу 2 класса. Это свойство с параметрами. его можно рассматривать двояко:
- либо как свойство класса Sku (Номенклатура), имеющее параметр Stock (Склад)
- либо как свойство класса Stock (Склад), имеющее параметр Sku (Номенклатура)
Для компилятора всё едино, как вы его будете рассматривать. Это больше относится к бизнес-логике. Заметьте также, что вы можете описать его как
in = DATA BOOLEAN (Stock, Sku);
Разницы нет, от перестановки параметров суть не меняется. На уровне БД будут просто переставлены местами 2 столбца в таблице: Номенклатура и Склад.
Суть этого свойства: оно задаёт наличие/отсутствие товара Sku на складе Stock. Можете его рассматривать как таблицу, где по вертикали стоят склады, по горизонтали - товары, а в клеточках - крестики (или пустые клетки).
793 Bro
 
13.10.19
21:41
(792) Все что нужно осознать, это то что инкапсуляция в ООП это синтаксический сахар для первого параметра (превращение его в this, и необязательное его задание при внутренних вызовах, объявлениях), которая помимо этого нужна по большому счету только для реализации полиморфизма (одиночного). Соответственно если выкинуть ее из головы, дилемма какой параметр главный, а какой нет и зачем вообще их различать уйдет сама собой.
794 Ещё1
 
13.10.19
21:52
(793) Ну концепция ООП, в отличие от функционального программирования, всё же ближе людям и более понятна. Поэтому тем, кто кодит на 1С, Delphi, C# и проч. ООП-языках, я думаю, мостик между их пониманием и тем, что предлагает ФП, не помешает.
795 Ещё1
 
13.10.19
21:57
(793) Опять же, вы оперируете в документации и коде понятиями класс, свойство. А это понятия из области ООП, где свойство - это свойство именно класса. И когда вас спрашивают "почему это "свойство"? Свойство чего?" В терминах ФП невозможно ответить.
796 НиколаевГ
 
13.10.19
21:58
(792) То есть, если я захочу ещё кроме склада и товара вести остатки по организациям, у меня будет две различных таблицы в БД?
797 Asmody
 
13.10.19
22:07
Я всё-таки хочу вернуться к началу проблемы:
допустим, в своём модуле я сделал локальное свойство selected. Затем автор класса (может я сам) сделал свойство selected в описании класса другого типа и с другим смыслом. Теперь я хочу использовать этот selected "от автора" наравне со своим. Как?
798 НиколаевГ
 
13.10.19
22:09
(796) И, опять же, если я захочу остаток по товару без учета склада, я смогу вызвать in(Sku)?
799 Ещё1
 
13.10.19
22:22
(797) Путём указания конкретного имени пространства имён свойства selected.
https://documentation.lsfusion.org/pages/viewpage.action?pageId=60555394
Т.е. добавляем к имени Namespace.selected
Если в другом модуле не указано пространство имён, используем имя самого модуля:
MuduleName.selected
(Я могу быть неточен, фузиновцы надеюсь тогда подправят).
800 Лефмихалыч
 
naïve
13.10.19
22:23
(793) > и зачем вообще их различать уйдет сама собой

Божья искра ебанула прямо в мозг и причинила последствия... Вы в уме вообще?
их различать хотя бы затем, что первый этот, "посахаренный" в вашей терминологии, параметр - это и есть тот именно самый ОБЪЕКТ, НАД КОТОРЫМ выполняется действия, для которых нужны все остальные параметры.
801 _DAle_
 
13.10.19
22:25
(479)  Попробуйте включить в настроках проекта: Settings | Preferences | Editor | File Encodings | Transparent native-to-ascii conversion.
802 Лефмихалыч
 
naïve
13.10.19
22:25
(797) судя по (799), пользуясь метафорой дырявых ящиков, дырку не в ящике сверлить надо, а в полке. И не в той, на которой ящики стоят, а в какой-то второй и там над дырочкой бирочка, по которой ты потом найдешь ящик, которому дырка принадлежит.
803 Ещё1
 
13.10.19
22:27
(796) Нет, у вас в приложении будет одно свойство Остатки с тремя параметрами: Организация, Склад, Товар. Типа такого:
quantity = DATA NUMERIC[10,3] (Organization, Stock, Sku);
804 НиколаевГ
 
13.10.19
22:32
(803) В приложении понятно, я про БД вообще-то спрашивал. Получается, я должен объявить столько различных свойств, сколько комбинаций параметров, по которым я хочу получить остатки?
805 Лефмихалыч
 
naïve
13.10.19
22:35
Ёооолкин дрын!!! Так эти свойства - это свойства ПРИЛОЖЕНИЯ, а не каких-то объектов?! Так это вот оно почему «структура зависит от того, на чём ты стоишь»! Потому, что структура есть только у одного объекта - у приложения (ну, конфигурации в наших терминах).
Так штоле?

КиануРивз.жпг
806 НиколаевГ
 
13.10.19
22:38
(805) Ну я же говорю, не умеют фузиновцы нормально объяснять. Или не хотят, так как им только хайп нужен, а не продвижение своей платформы...
807 НиколаевГ
 
13.10.19
22:41
(805) Приложение состоит из модулей, то есть свойства модуля, получается?
808 Лефмихалыч
 
naïve
13.10.19
22:41
Это чо, это я угадал что ли?! Я вообще-то хотел ядовито пошутить, доведя сарказм до экстремума...
Нет, правда что ли? Я это не пошутил, а угадал?
809 Ещё1
 
13.10.19
22:43
(798) > если я захочу остаток по товару без учета склада, я смогу вызвать in(Sku)?
Если вы зададите остаток как
quantity = DATA NUMERIC[10,3] (Organization, Stock, Sku);
то для получения всех остатков по всем организациям и складам для конкретного товара надо использовать такое свойство:
quantitySku(Sku sku) = GROUP SUM quantity(Organization o, Stock s, sku);
(возможно я не прав, тогда пусть меня подправят).
810 H A D G E H O G s
 
13.10.19
22:44
(808) Я правильно понимаю, что ты - сам ты, возишься с этой бабуйней в вечер воскресенья?
811 Лефмихалыч
 
naïve
13.10.19
22:44
У этого состояния сознания, в котором такое выдумывают, должен быть отдельный номер в МКБ


Серьезно. Не здоровая петрушка какая-то
812 Ещё1
 
13.10.19
22:46
(809) Да, и учитывая, что в языке можно писать свойства с одинаковыми названиями, но разными параметрами, его можно записать как просто quantity:
quantity(Sku sku) = GROUP SUM quantity(Organization o, Stock s, sku);
813 Лефмихалыч
 
naïve
13.10.19
22:47
(810) я тут только в теоретических основах разобраться пытаюсь. Руками это трогать за живое меня, естественно, ничего не заставит.



Я скорее руки отгрызу себе накуй
814 НиколаевГ
 
13.10.19
22:48
(809) А это достаточно забавно. Жаль, сами фузиновцы свои преимущества не в состоянии объяснить :(
815 H A D G E H O G s
 
13.10.19
22:50
Всем, убившим невозвратные часы своей жизни, посвящается
The most loneliest day of your life

https://youtu.be/IvoqxErkpgM
816 H A D G E H O G s
 
13.10.19
22:52
(813) А я вот сейчас буду катать с женой Starcraft2.
817 Ещё1
 
13.10.19
22:52
(801) Бинго!
818 НиколаевГ
 
13.10.19
22:52
(815) Мы просто пытаемся постичь дзен...
819 Лефмихалыч
 
naïve
13.10.19
22:55
(816) и в чем принципиальная разница?
820 Ещё1
 
13.10.19
23:00
(804) Если задать остатки через свойство как в (803), у вас в БД будет лежать 1 таблица с тремя ключевыми полями, и одним полем типа NUMERIC[10,3]. А способов доступа к данным в lsFusion - вагон и тележка. Я их сам ещё все не знаю. Один из способов я показал в (812)
821 _DAle_
 
13.10.19
23:07
(797) Я опять не совсем понял, что имеется ввиду (первое мое предположение, видимо, оказалось неверным).

Давайте начнем с того, что если у нас есть два свойства
selected = DATA BOOLEAN (Item)
selected = DATA BOOLEAN (Sku)
То это два разных свойства. Представим ситуацию, что это у нас единственные selected в проекте, они объявлены в одном пространстве имен, и классы Item и Sku никак друг с другом не связаны с помощью наследования.

Теперь, если мы обращаемся в некотором коде к selected(object), то произойдет следующее:
1. Если object является объектом класса Item (это в частности означает, что object может быть объектом класса, который унаследован от Item), то будет выбрано первое свойство
2. Если object является объектом класса Sku, то - второе.
3. Если object является и объектом класса Item, и объектом класса Sku (такое может быть при множественном наследовании), будет ошибка, чтобы ее обойти можно будет указать явно класс при вызове: selected[Item](object).
4. Если объект не является ни объектом класса Item, ни объктом класса Sku, то вызываемое свойство будет не найдено.
822 _DAle_
 
13.10.19
23:17
(792) Все вроде бы круто, кроме одного но: все-таки у нас свойства не принадлежат классам. Принадлежность свойств классам - это и есть инкапсуляция в одном из своих определений (объединение данных и методов работы с ними). В нашей модели есть существенное отличие от классического ООП -
инкапсуляции у нас нет, поэтому свойства вроде quantity(Document, Store, Sku) не принадлежат в lsfusion никакому классу. Такой подход позволяет, например, реализовывать множественный полиморфизм (multiple dispatch) - это то, что в языках вроде Java реализуется для полиморфизма по двум параметрам (double dispatch) с помощью паттерна проектирования Visitor, а для трех и более вообще будет все печально. Но я предлагаю не лезть пока в такие дебри, а просто обратить внимание на тот факт, что в lsfusion все-таки свойства первичны, а классы вторичны, хоть это и, возможно, непросто понять.
823 Лефмихалыч
 
naïve
13.10.19
23:20
Эти ваши хвалёные свойства- это тупо глобальные переменные. Отсюда и все ваши победные реляции на тему производительности. Смешно.
824 _DAle_
 
13.10.19
23:22
(805) Приложение собирается из модулей. Внутри каждого модуля видны только те элементы, которые находятся во всех зависимых модулях. То есть тех, которые перечислены в блоке REQUIRE, и далее рекурсивно. То есть, если вы создали новый модуль, в нем свойство selected, модуль зависит только от модуля System, и второй новый модуль, зависящий только от System, то в этом втором модуле в ыникак не будете видеть свойство selected из первого.
825 Лефмихалыч
 
naïve
13.10.19
23:24
(824) да. Это все уже не интересно. Удачи вам.
826 _DAle_
 
13.10.19
23:24
(807) Да, в принципе, свойства модуля. Видимость их будет зависеть от того, виден ли модуль по зависимостям из места вызова. Ну и поверх модулей еще есть логика пространств имен.
827 НиколаевГ
 
13.10.19
23:25
(822) О, у вас, вроде, получается объяснять. Может, вам лучше статьи писать о парадигме, а не Bro, он вообще не клиенториентированный какой-то.
828 Asmody
 
13.10.19
23:34
(811) Не, ну это все очень круто как дипломная или даже кандидатская работа. "Только в жизни нашей все иначе..."
829 _DAle_
 
13.10.19
23:35
(823) Они может и глобальные в плане видимости из модуля, который подключает модуль с местом объявления, но они принадлежат какому-то пространству имен, которые служат для разрешения конфликтов по именам идля локализации.

>Отсюда и все ваши победные реляции на тему производительности. Смешно.

Да нет, это вообще никак не связано. Язык - это всего лишь описание логики, код на языке один раз интерпретируется на старте аппликейшен сервера и в общем-то все, больше никогда к исходным файлам сервер не обращается.
830 Asmody
 
13.10.19
23:38
(821) опять не то.
Я в своем модуле написал
selected = DATA LOCAL BOOLEAN (Item);
Реализовал какую-то логику.

Потом автор объекта через месяц в модуле объекта написал:
selected = DATA DATE (Item);

Что будет с логикой в моём модуле?
831 Ещё1
 
13.10.19
23:39
(822) > свойства вроде quantity(Document, Store, Sku) не принадлежат в lsfusion никакому классу.
Тогда у людей снова возникает естественный вопрос: но это же свойство, и оно обязано чему-то принадлежать.
https://ru.wikipedia.org/wiki/Свойство_(значения)
Тогда предлагаю вам такое объяснение, тоже в духе ООП: свойство quantity в нашем примере является свойством суперпозиции классов Document, Store и Sku. Т.е. это не свойство каждого конкретного класса, а некоего не заданного явно суперкласса, который объединяет всех их вместе.
832 Asmody
 
13.10.19
23:42
(831) Это функция на декартовом произведении множеств Document, Store и Sku
833 НиколаевГ
 
13.10.19
23:43
(831) Плохое объяснение. Вы этим поднимаете уровень абстракции сверх необходимого.
834 Ещё1
 
13.10.19
23:47
(832) Да, это в духе ФП. Тогда почему вы их назвали свойствами, а не функциями?
(833) Вполне нормальное объяснение. Есть классы Организация, Склад и Товар. У каждого из них по отдельности нет свойства Количество в бизнес-логике нашего приложения. Но если мы объединяем их вместе, у их объединения появляются новые свойства, и в частности свойство "количество товара на складе указанной организации".
835 _DAle_
 
13.10.19
23:48
(830) Ок. Тогда я все уже описал в своем самом первом ответе (626). Вы видите какое-то несоотвествие ответа с вопросом?
836 НиколаевГ
 
13.10.19
23:51
(834) Так нет же никакого суперкласса, есть функция модуля с параметрами-классами, и кое-что ещё. Вот теперь осталось выяснить, что скрывается за "кое-что",
837 _DAle_
 
13.10.19
23:54
(831) На мой взгляд то, что вы называете свойством, вообще говоря, далеко не везде называется свойством, в каком-то языке - это поле (field), в каком-то дата-член (data member в с++). Ну и почему свойство не может быть свойством пары, тройки, сотни классов? Мы просто не придумали лучший термин.
838 _DAle_
 
13.10.19
23:57
(834) Почему не назвали функциями? Уже не помню, может завтра вспомним :)
839 НиколаевГ
 
14.10.19
00:00
(837) Вы придумали - так теперь объясните нам, непонятливым, что же это такое на самом деле.
840 _DAle_
 
14.10.19
00:11
(839) Если своими словами и на пальцах, то это просто именованные функции, как в математике. Которые описываются с помощью операторов, только кроме обычных арифметических операторов (+, -, /, *), логических (AND, OR, NOT), сравнения (==, !=, <, >, >=, <=) есть еще операторы, близкие к операторам из языков программирования и SQL (IF ... THEN ... ELSE, WHILE ... DO, DATA, GROUP, RECURSION и т.д., и т.п.).
Если же проводить какую-то аналогию с ООП-языками программирования, то это термин объединяющий свойства и методы класса, но только те методы, которые не изменяют состояние системы, а занимаются чистым вычислением (получением из объектов, переданных в качестве параметров, некоторого значения).
841 Ещё1
 
14.10.19
00:12
(837) > почему свойство не может быть свойством пары, тройки, сотни классов?
Действительно, почему? Именно это я и предложил в (831)
Если не нравится термин "незаданный явно суперкласс", можете назвать их набором классов. Т.е. получится свойство принадлежит набору классов, указанных в его определении.
842 Ещё1
 
14.10.19
00:14
(841) В духе ООП доступ к свойству такого набора через "." был бы такого вида:
(Organization, Store, Sku).quantity
843 НиколаевГ
 
14.10.19
00:16
(840) Так, через свойства мы конкретные объекты классов, переданных в качестве параметров, изменить не можем?
844 _DAle_
 
14.10.19
00:20
(842) Да, это упорядоченный набор классов получается. В принципе, мы обсуждали внутри (да и вроде уже и на хабре, и на мисте) возможность добавления такого синтаксиса через точку. Но он конфликтует с существующим синтаксисом и, лично мое мнение, эта штука не так важна сейчас, чтобы либо как-то умудряться подружить такой синтаксис с пространствами имен, либо еще и менять потом синтаксис обращения с помощью пространства имен и терять обратную совместимость.
845 _DAle_
 
14.10.19
00:23
(843) Да, свойства вообще ничего менять не могут. За логику изменений отвечают у нас действия. Они из себя представляют вполне привычные императивные куски кода, с последовательностью выполнения. Именно они похожи на функции из языков программирования.
846 _DAle_
 
14.10.19
00:25
(845) Поправочка: ...из императивных языков программирования.
847 Ещё1
 
14.10.19
00:30
(844) OK, пришли к согласию. Да, кто-то из ваших писал здесь, что запись через точку рассматривается. И да, получается конфликт с записью пространства имён. В духе ФП пространство имён должно было записываться не через точку, а как-то так: MyClass(Namespace), что эквивалентно в ООП: Namespace.MyClass.

(843) Объяснение с позиции ООП:  Используя действия, в lsFusion можно менять значение свойства класса либо набора классов, указанного в определении этого свойства.
848 _DAle_
 
14.10.19
00:31
(845) Кстати в этом и заключается опасность использования термина "функция" вместо нашего "свойство". Все же функция воспринимается большинством, как какаято последовательность действий, в результате которых, возвращается какое-то значение. Нам бы тогда следовало использовать термин "чистая функция" или что-то подобное.
849 _DAle_
 
14.10.19
00:35
(847) Да можно проще. Позаимствовать синтаксис, например, из с++ namespace::name или что-то подобное, но опять же - это нарушение обратной совместимости. Да и просто иметь два разных синтаксиса обращения к свойствам.. ну, как по мне - это довольно кривое решение. Мне лично оно не нравится, я буду против, хотя это вряд ли что-то изменит.
850 Ещё1
 
14.10.19
00:54
(849) Ну да, тут плюсы и минусы. Два варианта синтаксиса в 1 языке - однозначно минус. А если их начнут ещё смешивать в одном модуле...
С другой стороны, ООП привычно очень многим, и записывая "MyClass." можно тут же получить список свойств класса.
Вобщем, совсем неоднозначно.
851 _DAle_
 
14.10.19
00:57
(850) Тут еще беда в том, что их точно начнут смешивать и не просто в одном модуле, а в одной строке. Ведь foo(a + 5) все равно будут писать в нынешнем синтаксисе.
852 Bro
 
14.10.19
08:37
(800) OK, убить двух человек: kill(Person a, Person b) объект НАД КОТОРЫМ выполняется действие это a или b?
(805) Свойство модуля тогда уж. Также как и грубо говоря в 1С процедура это процедура модуля менеджера объекта.
(828) "Не в нашей, а в вашей". А вообще Asmody, мы на этом деньги зарабатываем. Вы знаете сколько блог на хабре стоит для 20 сотрудников например? Или перевод нэйтивами?
(838) Потому что функция подразумевает вычисление. Также как и остальные языки использовали другой термин (Метод, Поле) -> Свойство (метод и поле объединили в свойство)
(842) Ну нет, в духе ООП назначили бы главную жену, скажем Organization и было бы Organization.quantity(Stock, Sku).
853 НиколаевГ
 
14.10.19
08:48
(852) Вот только более-менее проясняется - опять ты всё путаешь. Что, quantity(Sku sku) = GROUP SUM quantity(Organization o, Stock s, sku) разве не подразумевает вычисление?
854 Bro
 
14.10.19
08:52
(853) Свойство в других языках тоже подразумевает ИЛИ вычисление ИЛИ чтение поля. Здесь тоже. То что вы написали - вычисление. Но если бы quantity = DATA LONG (Sku) то было бы чтение. Но важно, что тот кто использует quantity этого не знает. Он обращается к свойству.
855 Bro
 
14.10.19
08:55
(852) *тьфу - любимую жену, совсем начал классику забывать :(
856 Asmody
 
14.10.19
09:02
(852) На мисте дешевле? Ну вот и пользуйтесь
857 Bro
 
14.10.19
09:06
(856) у мисты другая функция. Это максимально токсичное сообщество, которое дает почувствовать каждую царапину которая есть на теле. Идеальный метод диагностики.
858 Провинциальный 1сник
 
14.10.19
09:10
А кстати, в фузионе есть такой замечательный числовой тип данных, как в 1с - числа практически неограниченной длины и точности с нефиксированной разрядностью?
859 ДенисЧ
 
14.10.19
09:11
(858) "числа практически неограниченной длины "
Это в какой 1с числа неограниченной длины?
860 Михаил Иванович
 
14.10.19
09:14
(859) 9.2.385
861 Провинциальный 1сник
 
14.10.19
09:15
(859) Я про числовые переменные, не про хранение в базе
862 НиколаевГ
 
14.10.19
09:16
(854) Ваши объяснения, что такое свойство:
     Свойство - это функция
     Но это не функция
     Но иногда функция
Спасибо за доходчивые объяснения :))
863 Bro
 
14.10.19
09:16
(858) Можно в принципе добавить NUMERIC (по аналогии со STRING как мы безразмерный добавили), это в общем то пару строк, но там проблемы с СУБД отличными от PostgreSQL будут:

NUMERIC
without any precision or scale creates a column in which numeric values of any precision and scale can be stored, up to the implementation limit on precision. A column of this kind will not coerce input values to any particular scale, whereas numeric columns with a declared scale will coerce input values to that scale. (The SQL standard requires a default scale of 0, i.e., coercion to integer precision. We find this a bit useless. If you're concerned about portability, always specify the precision and scale explicitly.)

Но помечу сейчас, если что сделаем просто очень большой NUMERIC
864 Bro
 
14.10.19
09:18
(862) В статье все объяснено достаточно формально. Потом я уточнил, что это чистая функция с возможностью записи значений. Но тут все равно чудес не будет понятие новое, поэтому проще по примерам понимать. Вон Еще1 понял сам без дополнительных объяснений (не помню чтобы у него вопросы по этому поводу были). Да и мы когда обучаем людей с этим не сталкиваемся.
865 Bro
 
14.10.19
09:24
(850) Вот тут сложно сказать. Я когда писал статью, писал что смешанный синтаксис:
f(A a, B b, C c) = GROUP SUM g(X x) IF h(x) = c BY a(x), b(x)
это треш и не надо его использовать. А потом подсел и сам начал его использовать :) Так что может со "смешанным" синтаксисом все не так страшно будет :)
866 НиколаевГ
 
14.10.19
09:25
(864) Ну, ваш коллега объясняет лучше, причем намного. А вы даже не пытаетесь посмотреть с точки зрения того, кому объясняете, упуская очевидные вам, но не очевидные другим, нюансы. В результате складывается впечатление какой-то малопонятной мешанины.
867 Провинциальный 1сник
 
14.10.19
09:26
(863) Вопрос не о размере хранения данных в базе, а об отсутствии потери точности при расчетах. То есть, чтобы точность результата всегда (в разумных пределах, конечно) была больше или равна точности операндов. Плавающие типы данных не подходят именно по этой причине, в них теряется точность априори, а для учетных систем это недопустимо.
868 ProgerVShapke
 
14.10.19
09:29
А что насчёт микросервисов? Их возможно делать?
869 Ещё1
 
14.10.19
09:31
(852) > убить двух человек: kill(Person a, Person b) объект НАД КОТОРЫМ выполняется действие это a или b?
Давайте различать действия (kill, обычно задаются глаголами) и свойства объектов/классов, о которых была речь выше. Свойства не производят действия над объектами.
870 Ещё1
 
14.10.19
09:36
(852) > Свойство модуля тогда уж. Также как и грубо говоря в 1С процедура это процедура модуля менеджера объекта.
Модуль - это просто кусок текста на lsFusion. Он не может обладать свойствами типа Количество, Выбранный из бизнес-области.
Процедура менеджера объекта в 1С - это метод этого объекта, не свойство.
871 Asmody
 
14.10.19
09:40
У меня тут такое приключилось.
Я набил какие-то данные, потом поменял структуру класса и у меня пропали все введенные ранее значения!
На месте ссылок стоит "Не определено".
Это, простите, как?
872 Bro
 
14.10.19
09:41
(867) Там проблема не столько в потери точности, а в том что double точку хранит в двоичной системе исчисления, а финансы и ввод данных пользователей в десятичной (так то в научных задачах double отлично подходит). Я понял вашу мысль, PostgreSQL поддерживает такой тип (Java работает с BigDecimal для всех Numeric так что ей фиолетово по определению), так что может сегодня и добавим его. Конечно что с MS SQL и Oracle непонятно что делать, но по изучаем еще вопрос.
(868) Вот тут я отвечал про это:
https://habr.com/ru/company/lsfusion/blog/465573/#comment_20592399
(869) Ну ок, возьмите sum, equals, better. Ну или тот же остаток, это свойство товара или склада.
(870) Я может что-то путаю, но мне казалось что отличие модуля объекта и модуля менеджера в том что в модуле объекта есть this, а в модуле менеджера this нет (то есть все процедуры static по сути).
(871) Что значит поменяли структуру класса? Переименовали?
873 Asmody
 
14.10.19
09:42
(872) Перенес описание в другой модуль
874 Ещё1
 
14.10.19
09:43
(852) > Потому что функция подразумевает вычисление. Также как и остальные языки использовали другой термин (Метод, Поле) -> Свойство (метод и поле объединили в свойство)
В ООП поле - это атрибут класса/объекта (в 1С это реквизиты классов/объектов).
Метод - это действие над объектом, инкапсулированное в него.
Свойство класса/объекта - это способ обращения к атрибутам класса для чтения и изменения. Т.е. через свойства можно менять атрибуты класса извне. Писал здесь (792).
875 Bro
 
14.10.19
09:46
(873) Тем самым вы namespace сменили (то есть имя свойства). Надо было или тот же namespace модулю делать, или миграцию добавлять (откуда платформе узнать, что вы не просто удалили один класс и добавили другой). Хотя да, я сейчас понял что при переименовании Rename(SHIFT+F6) мы автоматическую генерацию скрипта миграции поддержали, а при Move (F6) - пока нет. Сейчас помечу, сделаем.
876 Bro
 
14.10.19
09:49
(874) Метод не обязательно действие, это может быть и вычисление (то есть оно может не изменять состояние объекта). Хотя свойство в классических языках да подразумевает "чистоту", то есть только вычисление. Хотя непонятно как это все противоречит тому что я написал.
877 Asmody
 
14.10.19
09:52
(875) Так оно бы, может быть, где-то бы ругнулось?
878 Asmody
 
14.10.19
09:56
А то получается я легким рефакторингом похерил базу
879 Asmody
 
14.10.19
09:57
И как теперь вернуть нажитое непосильным трудом взад, не меняя модулей?
880 Ещё1
 
14.10.19
09:57
(852) > Ну нет, в духе ООП назначили бы главную жену, скажем Organization и было бы 1) Organization.quantity(Stock, Sku).
И это имело бы смысл. Так же как и 2) Stock.quantity(Organization, Sku) и 3) Sku.quantity(Organization, Stock).
А с точки зрения бизнеса формулировки звучали бы немного по разному.
1) quantity - свойство организации, задающее количество у неё некоего товара на некоем складе.
2) quantity - свойство склада, указывающее сколько некоего товара некоей организации на нём хранится.
3) quantity - свойство товара, задающее его количество для некоей организации и склада.
Хотя с точки зрения программы - это всё эквивалентно.
881 Bro
 
14.10.19
10:00
(877) В продакшне на такие вещи стоит защита. В разработке предполагается, что разработчик знает что делает.
(879) Там колонки не удаляются а переименовываются в _deleted_ можете вернуть назад код, зайти и переименовать колонки назад. Есть еще вариант из копии восстановить колонки (в администрировании есть). Но вообще это проблема серии ой я сделал DELETE FROM a; Как мне вернуть все назад.
882 Asmody
 
14.10.19
10:02
(881) DELETE FROM - это _сознательный_ способ выстрелить себе в ногу.
А потеря данных из-за переноса куска кода из одного файла в другой - это, извините, пиздец.
883 Bro
 
14.10.19
10:05
(880) Знаете у меня даже в java часто такая дилемма возникает. Куда положить метод и иногда бесит, что нужно выбирать, и для этого чуть ли не монетку бросать. Как раз бизнесу фиолетово кто там главный, ему важнее сам показатель.
(882) А вы его F6 или copy paste переносили?
884 Ещё1
 
14.10.19
10:06
(865) Возможно и не страшно. В других же языках как-то сочетают функциональныйи ООП стиль. Важно только так продумать синтаксис языка, чтобы не было неоднозначности при смешении стилей.
885 НиколаевГ
 
14.10.19
10:07
(881) Вы реально страшные люди... Работа без права на ошибку, блин.
886 Bro
 
14.10.19
10:08
(885) DELETE в SQL обладает еще более страшными последствиями. WHERE неправильно указал и пиздец. Но как то мир не остановился.
887 CrushBy
 
14.10.19
10:11
(885) With great power comes great responsibility.
888 _DAle_
 
14.10.19
10:12
(873) Дело в том, что при переносе в другой модуль у вас изменилось каноническое имя свойства, по которому оно идентифицируется. (Если бы вы прописали то же пространство имен, этого бы не произошло). В это каноническое имя входят: имя пространства имен, имя свойства, и сигнатура свойства, то есть список классов параметров. Подробнее: https://documentation.lsfusion.org/pages/viewpage.action?pageId=35521066#id-Именование-canonicalname
При переименовании DATA свойства, либо переносе его в другое пространство имен, необходимо описать это изменение в скрипте миграции. https://documentation.lsfusion.org/pages/viewpage.action?pageId=8945688
889 Ещё1
 
14.10.19
10:16
(870) Я может что-то путаю, но мне казалось что отличие модуля объекта и модуля менеджера в том что в модуле объекта есть this, а в модуле менеджера this нет (то есть все процедуры static по сути).
На самом деле неважно, в этой дискуссии важно, что эти процедуры не являются свойствами. Они могут быть методами соответствующих классов, или просто неклассовыми процедурами, но не свойствами этих классов.
890 НиколаевГ
 
14.10.19
10:18
(886) (887) А предупреждение выдать на уровне платформы - слабо?
891 Ещё1
 
14.10.19
10:20
(876) Вы ранее написали "метод и поле объединили в свойство". Это не совсем точная формулировка.
892 Ещё1
 
14.10.19
10:24
(878) Это недоделка конкретно этого рефакторинга. Изменения в коде программы не отражались в структуре БД. Я с этим тоже сталкивался уже, надеюсь допилят.
893 Bro
 
14.10.19
10:26
(892) Изменение в коде всегда отражаются в структуре БД. Вопрос соответствия кода до и кода после (то есть между запусками).
894 Ещё1
 
14.10.19
10:30
(883) В бизнесе как раз важно.
Смотрите, задача: принеси мне отчёт по наличию товара "Хлеб Бородинский" на наших складах.
Решение: вот вам 20 отчётов по всем нашим складам, в каждом из которых указано наличие "Хлеба Бородинского".
С точки зрения бизнеса это разные вещи? Разные. А с точки зрения программы разницы нет, те же показатели только чуть по-другому сгруппированы.
895 НиколаевГ
 
14.10.19
10:46
(891) Угу. В Фузине свойство - это глобальная функция, метод и поле одновременно. При этом свойство ничем  из этого не является.
896 Flyd-s
 
14.10.19
10:48
Теперь я понял почему они так носятся с переименованием классов в IDE, чуть не правильно код написал и база убилась
897 Bro
 
14.10.19
10:48
(895) Ну методы в фузине - это действия. То есть действия отвечают за изменения, свойства за чтения и вычисления.
898 orefkov
 
14.10.19
10:49
(822)
О каком множественном полиморфизме вы говорите в этом случае? У вас в рантайме по реальным типам параметров подбирается функция? Или таки при компиляции? Тогда это обычная перегрузка методов, которая много где есть, никакой революции.
899 Bro
 
14.10.19
10:52
(898) в рантайме по реальным типам:
https://habr.com/ru/company/lsfusion/blog/458376/#poly
Там правда для действий пример, но для свойств все аналогично
900 Bro
 
14.10.19
10:53
(899) Но и перегрузка функций тоже есть в lsFusion если вы об этом. Никаких СделатьЧтоТоДляСкладаТовараОрганизации не надо.
901 Ещё1
 
14.10.19
10:57
(893) Тогда нужны методические рекомендации, как делать рефакторинг поля, и при этом не терять данные в рабочей базе. Я так понимаю, у вас это уже реализовано через скрипты миграции, но это где-то в документации нужно отразить.
902 _DAle_
 
14.10.19
10:59
(898) Есть и multiple dispatch (runtime) с помощью механизма расширений (конкретно в этом случае ABSTRACT свойств и действий) https://documentation.lsfusion.org/pages/viewpage.action?pageId=1146897. И function overloading (compile-time).
903 Bro
 
14.10.19
11:00
(901) Вообще Rename(SHIFT+F6) все делает автоматически. Да про Move забыли. А copy paste я бы в принципе не рекомендовал переносить, так как ссылки могут битыми стать (а так IDE за этим следить).
904 orefkov
 
14.10.19
11:07
(899)
Спасибо, почитал, там как-то не очевидно описано. Описаны реализации функций для разных типов параметров (но это и обычной перегрузкой делается), но не приведен пример именно полиморфного вызова, когда я вызываю для двух абстрактных объектов Thing collide, и получаю вызов конкретной реализации для реальных типов параметров.
И реализация унутре выглядит как-то в духе семерочного 1С:

Если док.Вид() = "РасходнаяНакладная" Тогда
ИначеЕсли док.Вид() = "ПриходнаяНакладная" Тогда
КонецЕсли
905 Bro
 
14.10.19
11:40
(904) Технически да там создается CASE, но потом оптимизаторы / компиляторы очень много шаманят с этими свойствами переставляя, вырезая лишние IF'ы, потом при компиляции в SQL своя магия работает. В любом случае это все особенности реализации. Для разработчика lsFusion это не так принципиально (хотя и не сказать, что и не очевидно, для тех кто захочет все таки разобраться как это работает)
906 Asmody
 
14.10.19
11:44
Настрочил кучу кода, запустил сервер, получил простыню джавовского стек-трейса. Из адекватного там только "java.lang.AssertionError: TABLE WAS REMOVED BEFORE". И что мне теперь с этим делать?
907 Злопчинский
 
14.10.19
11:45
(906) не хотел жрать кактус? ну теперь ты понял, что придется жрать взамен - то на чем растут...
908 Asmody
 
14.10.19
11:46
Сообщение про удаление таблицы какбэ моногообещающее.
909 ДенисЧ
 
14.10.19
11:47
(906) Радоваться, что таблица таки существовала ))
910 Bro
 
14.10.19
11:49
(906) Джавовский стек-трейс это был такой баг в 2.0 (на всякий случай можете стектрейс на info@lsfusion.org кинуть). А вообще она же в лог пишет все изменения про таблицы (и добавления и удаления). Или нет?
911 Asmody
 
14.10.19
11:50
(910) Event log это вот это:
11:39    Build completed successfully in 689 ms
11:40    Build completed successfully in 531 ms
11:41    All files are up-to-date
11:49    Build completed successfully in 579 ms
???
912 Bro
 
14.10.19
11:55
(911) Это build лог проекта. Все что он делает это копирует lsf файлы из исходников в директорию запуска (при сборке при помощи IDEA это по умолчанию out/production) и компиляция туда же Java файлов проекта (которых у вас скорее всего нет). Я про лог запуска, там где Server is starting вначале и Server has successfully started в конце.
913 Asmody
 
14.10.19
12:03
Короче, я, кажется, понял.
Если в базе уже есть какие-то данные, но в результате изменений кода они не удовлетворяют какому-то новому CONSTRAINT, то сервер не запустится.


Консистентность, чо!
914 Bro
 
14.10.19
12:13
(913) Нет, сервер запустится. CONSTRAINT это событие
WHEN SET(f(a)) DO {
   MESSAGE
   CANCEL
}

То есть работает на новые изменения. В Администрирование -> Обслуживание (или как то так есть) проверить все ограничения / пересчитать все следствия для старых данных.
915 НиколаевГ
 
14.10.19
12:20
(906) Хм... порог входа без ИТ-бэкграунда неделя :))
916 Asmody
 
14.10.19
12:21
(914) ХЗ, у меня не запускалось, пока я не закоментировал CONSTRAINT
917 НиколаевГ
 
14.10.19
12:25
(916) Судя по всему, при изменении структуры БД CONSTRAINT таки срабатывает :))
918 Asmody
 
14.10.19
12:30
А ширина колонок в гриде как-то программно задается?
919 Bro
 
14.10.19
12:34
(918) CHARWIDTH для свойства емнип.
https://documentation.lsfusion.org/pages/viewpage.action?pageId=7798786
И в дизайне формы есть опция.
920 Злопчинский
 
14.10.19
12:40
(919) если в количестве символов - то при изменении масштаба в настройках ОС - смасштабируется нормально само?
921 la luna llena
 
14.10.19
12:43
кстати, с шириной колонок у вас проблемы, если длинные названия не влезают в поле, то никак это не изменить в пользовательском режиме
922 Bro
 
14.10.19
12:46
(920) Да в этом и смысл. Собственно есть настройка у пользователя % увеличения шрифта.
(921) Вообще по умолчанию колонки расширяемы. Другое дело, что у некоторых специально это ограничивают. Чтобы при расширении других колонок они не расширялись.
923 la luna llena
 
14.10.19
12:49
(922) я обратила внимание, что даже открывая стандартную форму с настройками по умолчанию, сделано так, что заголовок столбцов не влезает в отведенное ему место, смотрится неряшливо
924 Bro
 
14.10.19
12:57
(923) Там просто иногда заголовок шире данных. И тут конечно непонятно что делать, или буквами кодировать (что тоже будет непонятно) или еще что.
925 Asmody
 
14.10.19
15:53
Что-то я из ваших примеров так и не понял, как сделать выбор значения в поле с предустановленным отбором (у вас же крутые подборы!)

вот такой кусок https://gist.github.com/Asmody/e0207c14332b0abcf99839a712845a81

Хочу такой выбор item'ов:
Если type(doc) == DocType.PI Тогда
для выбора доступны только Item с type(item) == ItemType.goods
Если type(doc) == DocType.SI Тогда
для выбора доступны Item c type(item) == ItemType.goods или ItemType.product, такие что balance(item, stock) > 0, где stock из документа.

А последний CONSTRAINT должен учесть вариант наличия двух и более одинаковых item в строках
926 PR
 
14.10.19
16:03
Гляжу я на все это форменное ммм... пусть будет безобразие, Asmody уже втянулся, прочие уважаемые товарищи
У меня один вопрос. А напаркуа?
Как платформа, Фузина ясен пень настолько хуже и беднее 1С, что даже сами фузиновцы от безысходности сравнивают свою платформу с готовым решением от 1С, ДДСничая по поводу и без повода
Как решение, Фузина неинтересна просто потому, что хоть какого-то мало-мальски интересного решения нет
Возможность съэкономить на лицензиях 1С (потом, я так понял, потратившись на других вещах)? Не очень верится
Остается, просто от скуки, типа 1С приелась, из спортивного интереса?
Так мне и это было бы неинтересно. Мне еще на 1С столько интересного, на пять лет хватит точно
Так что же это, в чем причина?
927 Bro
 
14.10.19
16:03
(925) Вы в диалоге выбора товара хотите предустановленный отбор? Так просто в FILTERS напишите отбор.

Но я вообще не понимаю, что вы пытаетесь сделать. Если вы хотите чтобы именно по product остаток был больше 0 просто сделайте:

CONSTRAINT type(Item item) = ItemType.product AND balance(item, stock) < 0;
928 Bro
 
14.10.19
16:05
(926) 1С не умеет и половины того что умеет фузина. Вон мне про отрицительные остатки на приходе никто ничего не может написать. Не говоря уже о прозрачные материализации, ограничения, события, 21 проблема из статьи и остальные https://lsfusion.org/opportunities.
929 Asmody
 
14.10.19
16:07
(926) Хуяк, хуяк и в продакшен.
930 PR
 
14.10.19
16:07
(928) Я не тебя спрашивал, ты не относишься к уважаемым товарищам
931 Asmody
 
14.10.19
16:08
(927) Я хочу, чтобы в документах с типом si показались только товары и продукты с положительным остатком на складе из документа
932 PR
 
14.10.19
16:11
(929) Не не не, хуяк и в продакшн — это так в 1С можно
Фузину у народа даже поставить по-человечески не получилось, пришлось выдрачиваться с дистрибутивом
Не говоря уж про то, что чтобы даже что-то простенькое написать, сначала нужно общую концепцию понять и дохрена чего изучить
Тут явно что-то другое
933 PR
 
14.10.19
16:14
(928) Что за "отрицительные остатки на приходе"? Снова еще одна важнейшая проблема 21 века?
934 PR
 
14.10.19
16:20
Меня вот реально торкают вещи типа прикрутить к 1С Апач или Кролика, сделать мобильное приложение, разобраться с системой взаимодействия, еще полмиллиона интересных вещей
Из вещей, не связанных с 1С вообще, меня интересуют только задачи типа:
Миллиард копеечных бесплатных кроссплатформенных легких удобных симпатичных клиентов
Транспортная логистика
Бигдата
РАУЗ

Хотя нет, последнее уберите
935 shuhard
 
14.10.19
16:24
(930) +1
клиника, кодер с промытыми мозгами, не осознающий, что сделал ни кому не нужный инструмент
936 PR
 
14.10.19
16:30
(935) Да в том-то и дело, что будь сейчас спецов по Фузине столько же, сколько по 1С, и не представляй Фузину два куска говна, не умеющих продвигать свой продукт, а умеющих только обсирать чужой, и будь на Фузине хоть полтора готовых решения, то глядишь, ситуация могла бы сложиться совершенно по-другому
В конце концов простой гуглинг выдает практически ничего на поиск бесплатных открытых альтернатив 1С
Но история, как известно, не знает сослагательного наклонения

Так все же, что интересного в Фузине? Уважаемые коллеги, что вас манит в Фузине?
937 PR
 
14.10.19
16:32
(935) Это, кстати, не он сделал, у них там целая банда десять лет хуячила, теперь даже программистам не могут объяснить, что они вообще сделали
938 Лефмихалыч
 
naïve
14.10.19
16:37
(936) да прост...


скука, да
939 Ёпрст
 
14.10.19
16:37
940 PR
 
14.10.19
16:41
+(937) Еще и не сделали, кстати
Про интерфейс сказали, что говно, рожей кривили неделю, сейчас смотрю, косметику какую-то навели
Про не открытие документов из списка по энтеру сказали, что дико же, смотрю, сделали
Это даже не аналог 1С 7.7, это вообще что-то унылое на уровне аксесса из 2000-х
Какая-то продажа Борланд Паскаля
941 PR
 
14.10.19
16:43
Меня бы, кстати, да, самого бы торкнула возможность на простом бесплатном конструкторе накидать пусть сильно ограниченную по функционалу, но систему под ключ
Но тут же сначала надо изучить Франкенштейна, принять вся его ущербную сущность, и уже только после этого, проблевавшись и дважды помыв руки...
942 Лефмихалыч
 
naïve
14.10.19
16:47
(941) ... и дважды помыв руки, понять, что не так уж тебе и хотелось.
943 sqr4
 
14.10.19
16:48
(941) аяй Рома, срач в соседней ветке
944 PR
 
14.10.19
16:49
(942) Как в анекдоте, да, https://www.anekdot.ru/id/508976/
945 PR
 
14.10.19
16:51
(943) В смысле? В этой ветке же про Фузину? А про Фузину ничего кроме срача и не было никогда. Два брата-акробата изначально целенаправленно с таким настроем на Мисту и прилупили.
946 _DAle_
 
14.10.19
16:53
(945) В этой ветке люди задают вопросы по lsfusion, мы отвечаем, иногда даже конструктивное обсуждение получается. Есть просьба очередной срачик хотя бы в этой ветке не устраивать.
947 PR
 
14.10.19
16:57
(946) ok, исключительно из уважения к единственному обнаруженному адекватному представителю Фузины
948 _DAle_
 
14.10.19
17:08
(947) Спасибо за понимание
949 Asmody
 
14.10.19
17:09
(946) [мы отвечаем, иногда] - спорное утверждение
950 PR
 
14.10.19
17:10
(948) Это не понимание, понимания у меня не было, нет, думаю, что и не будет. Это уважение к адекватности конкретного человека.
951 НиколаевГ
 
14.10.19
17:34
А как на фузине сделать аналог периодического регистра сведений, чтобы срез последних самому не придумывать?
952 CrushBy
 
14.10.19
17:37
(951) https://documentation.lsfusion.org/pages/viewpage.action?pageId=46367505
Вот так. При желании можно в метакод это обернуть.
953 НиколаевГ
 
14.10.19
17:44
(952) То есть, нужно определить свойство для каждого набора измерений, по которым нужно получить срез последних. А дальше платформа всё сама сделает?
954 Asmody
 
14.10.19
17:47
Мои вопросы, видимо, слишком сложные.
А всё хвастались про "продвинутые" подборы!
955 Bro
 
14.10.19
17:49
(931) где показать? у вас в ссылке же ни одной формы нет... в форме документа? или чего?
956 Asmody
 
14.10.19
17:56
(955) С формой все очевидно: Doc на панели, DocLine в гриде.
Я хочу, чтобы при выборе item'ов в DocLine из списка были доступны не все товары, а только по указаным условиям.

А про CONSTRAINT это уже какбэ второе требование.
957 CrushBy
 
14.10.19
17:56
(953) Да, вроде того. Дальше просто обращаетесь к этому свойству также, как если бы оно было первичным и вводилось вручную. Ну и, конечно же, в него, как и в любое вычисляемое свойство, нельзя писать.
958 НиколаевГ
 
14.10.19
18:03
(957) А как определяется ключ уникальности записи регистра? И как измерения от реквизитов отделить?
959 CrushBy
 
14.10.19
18:03
(956) Схематично вот так можно сделать :
// объявляем форму по выбору товара
FORM selectItems 'Выбрать товар'
    OBJECTS s = Stock PANEL
    
    OBJECTS i = Item
    PROPERTIES READONLY name(i), currentBalance(i, s)
    FILTERS currentBalance(i, s)
;

// определяем действие по редактированию товара в документе
changeItem (DocLine l) {
    DIALOG selectItems OBJECTS s = stock(doc(l)),
                                   i = item(l) CHANGE;
}

// подменяем действие редактирования при добавлении свойства на форму
FORM document
....
    OBJECTS l = DocLine
    PROPERTIES nameItem(l) ON CHANGE changeItem(l)
;
960 Bro
 
14.10.19
18:04
Самый тупой вариант:
FORM dialogItems
    OBJECTS d=DocType, s=Stock, i=Item
    PROPERTIES (i) name
    FILTERS type(i) = ItemType.goods OR (d=DocType.SI AND type(i) = ItemType.products AND balance(i, s) > 0)
;

FORM doc
   OBJECTS d = Doc
   OBJECTS dl = DocLine
   FILTERS d = document(dl)
..

PROPERTIES nameItem(dl) ON CHANGE { DIALOG dialogItems OBJECTS d=type(d), s=stock(d), i=item(dl) CHANGE; }
;
961 Bro
 
14.10.19
18:06
(960) можно поиграться с CONSTRAINT CHECKED BY. Тогда платформа сама embed'ит фильтр в диалог, но то что вы хотите это не тот случай, потому как она тогда при изменении остатка будет на этот CONSTRAINT и старые документы проверять (то есть он для других случаев используется
https://documentation.lsfusion.org/pages/viewpage.action?pageId=46367200 вот тут 5-й пример)
962 НиколаевГ
 
14.10.19
18:07
(959) (960) Ахренеть у вас стандарты разработки, совершенно различный код для одного и того-же :))
963 CrushBy
 
14.10.19
18:08
(958) Рассматривайте регистр как своего рода интерфейс (в программном смысле). Соответственно, либо сам объект его реализует (тогда запись регистра = объект), либо он создает другой объект (агрегированный) и тот наследует регистр (тогда регистр = агрегированному объекту). Система сама следит за тем, чтобы агрегированный объект существовал и был единственным при заданных условиях.

Измерения от реквизитов никак не отличаются с точки зрения регистра. Неявно они отличаются в расчете значения. Все что в BY - это измерения, в выражении - реквизиты.
964 CrushBy
 
14.10.19
18:09
(962) Там как раз одно и то же практически. Просто Bro добавил в логику еще тип документа и действие по редактированию "заинлайнил" в объявление формы.
965 _DAle_
 
14.10.19
18:13
(962) На всякий случай.. Bro отвечал Asmody.
966 _DAle_
 
14.10.19
18:14
(965) А, это я не так понял, извиняюсь. Блин, как же хреново без редактирования сообщений :)
967 НиколаевГ
 
14.10.19
18:15
(963) Уникальность записи как определяется? Нужно самому прописывать набор полей, по которым должна быть уникальность? И останется ли идентификатор записи тем-же, если вставить запись с таким-же набором полей уникальности?
968 Bro
 
14.10.19
18:15
(964) ну я еще в двух разных местах разный стиль использовал: OBJECTS d=Doc, dl=DocLine  но быстро писал, я тут параллельно еще другими делами занимаюсь знаете ли.
969 НиколаевГ
 
14.10.19
18:18
(964) Так вы считаете, что стандарты написания кода не нужны? Получается, новички у вас усваивают тот стиль, который наставник практикует?
970 Flyd-s
 
14.10.19
18:42
Как у вас организованы поставки версий программы для клиентов и что нужно сделать клиенту, чтобы вести разработку своими силами и при этом получать обновления от вендора?
971 Ещё1
 
14.10.19
19:59
(960) > d=type(d)
Компилятор разрулит такое? То есть поймёт, где d - это Doc, а где d - это DocType?
972 Злопчинский
 
14.10.19
20:02
(779) ЯННП.
1. То что свойство - это функция - ну как бэ понятно. Функция что-то возвращает (примитивный тип или ссылочный тип или вообще возвращает список целый) - это и будет свойство. типа так?
2. "И вот это свойство с функцией записывания. Для некоторых ее типов" - для типов чего? для типов возвращаемого функцией свойства? Куда это возвращаемое свойство записывается? когда записывается? возвращаемое значение функции зависит от входных параметров - записывается при каждом "расчете" функции? или только для неповторяющихся комбинаций входных значений?
973 Лефмихалыч
 
naïve
14.10.19
20:03
ну, до чего ж мерзкая тарабарщина-то, а... прям вырви глаз
ключевые слова какие-то обгрызенные, от инвалидских обкусанных переменных только регистром отличаются... как это говно читать и сопровождать? ну, хрен с ним, у оракла есть максимальная длина имени большинства объектов, им надо экономить, по этому там так. Но вас-то что оправдывает? Или тоже 30 букв на литерал и крутись, как хочешь?
974 Злопчинский
 
14.10.19
20:05
(785) в итоге вся работа идет посредством оперирования свойствами?
975 Лефмихалыч
 
naïve
14.10.19
20:09
(974) и модулями. Вчера ж выяснили: объект там - это модуль, а все остальное - атрибуты модуля. Модуль обладает неким поведением, которое публикует посредством атрибутов, которые как колонки, но это функции, хотя их тоже нельзя так воспринимать. В результате, короче, ты, умело жонглируя модулями и осатанело дёргая их за титьки атрибутов, получаешь что тебе там надо.
976 Злопчинский
 
14.10.19
20:11
(792) "Поскольку свойство описано как DATA - оно является первичным, а значит будет иметь отображение на уровне СУБД. Item будет соответствовать таблица БД, а quantity - поле в этой таблицы. Наверное, тут всё понятно."
- нихрена непонятно. Откуда следует что item - соответсвует таблице БД? это где явно описано? или это следует из неявного чего-то типа "Поскольку свойство описано как DATA - оно является первичным, а значит будет иметь отображение на уровне СУБД."..?
977 Злопчинский
 
14.10.19
20:12
(975) а свойства здесь где?
978 Лефмихалыч
 
naïve
14.10.19
20:13
а, ну и к этой всей пшенице и ржи прилагаются еще, видимо, таблички в БД, которые, благодаря революционному механонизьму нэймспэйсов, соотносятся с модулями примерно как-то так же, как в томже оракле или постгресе - со схемами. Но это уже я просто догадываюсь - это не от них инфа.
979 Злопчинский
 
14.10.19
20:14
(792) "quantity = DATA INTEGER (Item);"
- можно сказать, что это "в структуре БД объявляется таблица item, состоящая из одного столбца с типом Integer?
980 Злопчинский
 
14.10.19
20:15
..эта таблица item - она когда создается? постоянно хранится в БД? доступна другим сеансам?
981 Злопчинский
 
14.10.19
20:19
(792) "и возвращающие указанный в описании новый объект." - ЯННП, в описании чего?
.
Типа
Чтото = F(p0,p1,p2..pN)
это "что-то" и будет "новым объектом"?
982 Злопчинский
 
14.10.19
20:21
кнопки (сохранить и пр) и значки (фильры и пр), которые внизу визуальных форм - их можно, не лазая внутрь платформы переопределить их местоположение на визуальной форме кодом на уровне прикладного решения?
983 Ещё1
 
14.10.19
20:22
(976) Да, свойства описанные оператором DATA так или иначе отображаются в БД. Чаще всего полем таблицы (по крайней мере я не видел других отображений, но чем чёрт не шутит). https://documentation.lsfusion.org/pages/viewpage.action?pageId=688168
Но на время начального написания программы я вообще не заморачиваюсь об отображении классов в базе. Это делает сама платформа. Потом уже, отлавливая узкие места и делая оптимизацию, это надо учитывать.
984 Ещё1
 
14.10.19
20:26
(979) Можно сказать, что в таблице Item точно будет столбец quantity. Какие ещё в ней будут столбцы можно сказать только после компиляции всей программы. Но лучше не опускаться на уровень БД (по крайней мере на начальном), а программировать в рамках понятий классов, объектов и свойств. Для этого и придуман язык lsFusion, что он максимально отстраняет программиста от непосредственной работы с таблицами, столбцами, индексами, запросами и т.п.
985 Злопчинский
 
14.10.19
20:27
(793) вот в этой фразе - дохрена незнакомых мне слов. можно как-то объяснять, исходя из того что пришел джуниор с улицы, не имеющйи ИТ-бэкграунда (хрен с ним, пусть даже имеющий, но про ООП только слова слыщал),..?
986 Ещё1
 
14.10.19
20:27
(984) Я уже прям как евангелист заговорил, хотя сам в фузине ещё плаваю как топор. :)
987 Злопчинский
 
14.10.19
20:28
(792) спсб за пояснения, внятнее стало. примерно так и понимал, но мутновато... сильно низкий у меня "порог входа".
988 Злопчинский
 
14.10.19
20:31
(983) свойство может быть "списком" (я полагаю что да)? то есть функция чтото там внутри себя крутит и выдает на выходе некий набор данных, например список из двух колонок с полями "товар" и "бренд"..? где товар и бренд - это для меня что: - ссылки на таблицы товаро и таблицу брендов? или просто наименования тавра и бренда? завитсит от того что я напишу внутри функции, которая это возвращает?
989 Ещё1
 
14.10.19
20:34
(980) Да, класс Item точно отобразиться в таблицу в базе, поскольку он имеет как минимум 1 свойство (quantity) объявленное как DATA. И она будет доступна всем. Заметьте, что мы не знаем точно, как будет названа эта таблица в базе, мы оперируем классами.
Было бы свойство DATA LOCAL - значение свойства было бы доступно только в текущей сессии пользователя. А в базе хранилось бы во временной таблице с неизвестным именем, доступной только текущему пользователю.
990 Злопчинский
 
14.10.19
20:34
(984) "Можно сказать, что в таблице Item точно будет столбец quantity. Какие ещё в ней будут столбцы можно сказать только после компиляции всей программы"
- то есть я, типа новый разраб, пришел на место старого. и чтобы понять структуры базы, прикладных обьектов - должен буду прошерстить вручную своим пока что незапятнанным умишщком - должен буду прошерстить ВЕСЬ код, чтобы понять как "список контрагентов" устроен и как он взаимодействует с другими обьектами базы/прикладного решаения?
991 Ещё1
 
14.10.19
20:37
(981) Свойство возвращает объект того типа, который был указан при его описании. Т.е. для quantity = DATA INTEGER (Item); типом возвращаемого значения будет INTEGER. А может быть любой класс, встроенный lsFusion или созданный в программе.
992 Ещё1
 
14.10.19
20:39
(982) Вот это ещё не разбирался, но вроде там есть какие-то методы компоновки объектов на форме, даже с визуальным отображением в IDEA (закладка Design прилеплена к правому краю окна IDEA).
993 Злопчинский
 
14.10.19
20:42
(989) "заметьте, что мы не знаем точно, как будет названа эта таблица в базе, мы оперируем классами."
- ну как бы понятно. типа как в 1С. класс "Документ" - а из скольки таблиц он на урровне БД будет состоять - мне как-то пока неважно.
.
но в 1С я вижу класс "Документ" и из "описания" самого класса в конфигураторе пронимаю из чего он состоит. А здесь, в фузине, как я пойму из чего состоит "документ"? вот я, разработчик новый, вроде разобрался в фузине в прикладном решении с "документ.заявкапокупателя". ага, норм. для реализации поставленной передо мной задачи мне нужен "атрибут" заявки покупателя такой как "номер заявки в терминах КИС покупателя". ага, "доопределяю" класс "документ.заявкапокупателя" таким атрибутом. Только оказываетяс что другой разработчик давным давно в каком-то модуле (я его просто не нашел среди обилия модулей/кода) уже определил точно такой же атрибут с такимже прикладным назначением. может такое быть? имхо может.

Это же трэш страшный будет..?

Где посмотреть !!"суммарное" полное!! описание класса "документ.заявкапокупателя" в прикладном решении..?
994 Злопчинский
 
14.10.19
20:44
попутно (я раньше упоминал). в свое время Кларион хорошо стартанул и была даже перспектива что будет ок. но сообщестов резко перестало развииваться и закапсулировалось как только Кларион перевел код на ООП-шаблоны ABC (насколько я помню).
995 Злопчинский
 
14.10.19
20:47
(991) "Свойство возвращает объект"
- это меня выламывает напрочь.
свойчство возвращает? как бы привык что возвраЩАЕТСЯ свойство (как значяение, или набор значений, или сложное состоавное чтото типа списка).
.
то есть следует пониматьчто "свойство" - это функция, которая что-товозвращает? или типа свойство это ящик с выходом, в котором чтото в заивисмости от того что на входе?
996 Ещё1
 
14.10.19
20:49
(988) Вот честно не знаю. Знаю точно, что возвращаемое значение свойства может быть любым классом, а значит иметь значение числа, строки, даты, Справочника товаров, Документа реализации и т.д. Может ли оно вернуть некий набор документов? Не могу сказать.
997 Злопчинский
 
14.10.19
20:52
(796) имхо это зависит от того как ты эту таблицу опишешь, можно таблицу (скю, товар) дополнить (скю, товар, организация) а можно новую таблицу типа (организация, ссылка на запись первой таблицы)
998 Злопчинский
 
14.10.19
20:53
(798) имхо, по идее - да. движок "свернет" склады. я бы если делала "фузябу" сделал бы так
999 Ещё1
 
14.10.19
20:55
(990) Не могу сказать. Возможно есть какой-то инструмент, чтобы после компиляции посмотреть все свойства указанного класса в сборе.
1000 CrushBy
 
14.10.19
20:58
(971) Там разный контекст по синтаксису. Слева от "=" d - это контекст формы, то есть она ищет среди объектов формы. Справа от "=" выражение, которое вычисляется во "внешнем" контексте, то есть откуда идет вызов.
1001 CrushBy
 
14.10.19
21:00
(970) Под это была целая статья. https://habr.com/ru/company/lsfusion/blog/461983/

Суть в том, что базовая версия в конечном итоге поставляется как один jar файл, в которым куча базовых модулей. Под клиента делаются свои модули, которые собираются, грубо говоря, в отдельный jar файл. Когда сервер стартует он собирает "общую" логику из обоих jar-файлов.
1002 CrushBy
 
14.10.19
21:06
(996) Нет, не может (точнее может через STRUCT, но это уже скорее костыль, чем нормальная практика использования). Тут важно понимать, что эти функции (свойства в терминологии lsFusion) - это не совсем обычные императивные функции в классических языках программирования. Они не выполняются (в их реализации нету последовательности выполнения). На основе определений этих функций просто "компилируются" соответствующие SQL запросы. Возвращение множества значений в данном случае равносильно либо заданию 2х функций (например, item(X) и stock(X), если нужно вернуть вроде парыm или in = BOOLEAN (X,Stock), если для X нужно задать множество складов Stock)
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.