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

Для сравнения и троллинга есть отдельная ветка : OFF: lsFusion vs 1C. Раунд 3
1 Злопчинский
 
14.10.19
21:19
к (848) из предыдущей ветки
(848) "Все же функция воспринимается большинством, как какаято последовательность действий, в результате которых, возвращается какое-то значение."
- ну так свойство (в ваших терминах) в результате это и есть значение какого-то типа? не?
то же свойство quantity - это значени етипа "список" (таблица) - колонка из таблицы БД
не?
2 Лефмихалыч
 
14.10.19
21:28
> Ещё1 991 - 14.10.19 - 20:37
> (981) Свойство возвращает объект того типа, который был указан при его описании.

https://www.meme-arsenal.com/memes/56873718e4fecd48f55b86d39d9a1f51.jpg
3 CrushBy
 
14.10.19
21:29
(1) Как человеку с достаточно глубоким математическим образованием, мне тяжело отвечать на такие вопросы, так как в математике я привык к точности определений.

Грубо говоря, функция - это отображение одного множества объектов на другое. Свойство, объявленное так : quantity = DATA INTEGER (DocLine)
это формально отображение множества строк документов на множество целых чисел :
quantity {DocLine} -> {INTEGER}
С точки зрения хранения в базе данных, то да : будет таблица DocLine, в которой будет поле quantity типа INTEGER

Например, для свойства myProp = DATA INTEGER(Item, Stock) будет таблица с каким-то названием (например, itemStock), в которой будет два ключевых поля item и stock, и поле типа INTEGER myProp. Если вместо INTEGER будет другой класс, то там будет поле со внутренним ИД объекта этого класса.
4 Злопчинский
 
14.10.19
21:32
(3) "Item, Stock" - как определяются, например?
5 CrushBy
 
14.10.19
21:32
(3) Фактически, обычная логика обычных реляционных баз данных так и транслируется в функциональную. Любое поле в таблице - это функция от объектов ключевых полей на соответствующее значение поля.
6 Злопчинский
 
14.10.19
21:33
предыдущая ветка, (984) "Можно сказать, что в таблице Item точно будет столбец quantity. Какие ещё в ней будут столбцы можно сказать только после компиляции всей программы"
- то есть я, типа новый разраб, пришел на место старого. и чтобы понять структуры базы, прикладных обьектов - должен буду прошерстить вручную своим пока что незапятнанным умишщком - должен буду прошерстить ВЕСЬ код, чтобы понять как "список контрагентов" устроен и как он взаимодействует с другими обьектами базы/прикладного решаения?
7 Ещё1
 
14.10.19
21:33
(1) Свойство quantity в примерах с прошлой ветки имеет тип (или класс) NUMERIC[10,3]. Т.е. число с 10 разрядами и 3 цифрами после запятой. Не список чисел или ещё чего-нибудь. Это однозначно следует из определения:
quantity = DATA NUMERIC[10,3] (Organization, Stock, Sku);
8 CrushBy
 
14.10.19
21:34
(4) В каком смысле ? Есть отдельный класс - Item (товар), есть отдельный класс - Stock (склад). И есть функция, которая для пары товара и склада возвращает значение. Например, пусть будет поле страховой запас. Оно не имеет смысла ни для товара, ни для склада по отдельности, а только для пары.
9 Злопчинский
 
14.10.19
21:34
предыдущая ветка (989) "заметьте, что мы не знаем точно, как будет названа эта таблица в базе, мы оперируем классами."
- ну как бы понятно. типа как в 1С. класс "Документ" - а из скольки таблиц он на урровне БД будет состоять - мне как-то пока неважно.
.
но в 1С я вижу класс "Документ" и из "описания" самого класса в конфигураторе пронимаю из чего он состоит. А здесь, в фузине, как я пойму из чего состоит "документ"? вот я, разработчик новый, вроде разобрался в фузине в прикладном решении с "документ.заявкапокупателя". ага, норм. для реализации поставленной передо мной задачи мне нужен "атрибут" заявки покупателя такой как "номер заявки в терминах КИС покупателя". ага, "доопределяю" класс "документ.заявкапокупателя" таким атрибутом. Только оказываетяс что другой разработчик давным давно в каком-то модуле (я его просто не нашел среди обилия модулей/кода) уже определил точно такой же атрибут с такимже прикладным назначением. может такое быть? имхо может.

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

Где посмотреть !!"суммарное" полное!! описание класса "документ.заявкапокупателя" в прикладном решении..?
10 Злопчинский
 
14.10.19
21:35
(8) в простом смысле. в самом тривиальном.
просто напишите как Итем и Сток определяются. вашим кодом.
11 CrushBy
 
14.10.19
21:37
(6) Обычно просто кейс не такой. Нет смысла понимать всю логику программы, чтобы просто понять. Как правило, задача стоит по-другому. Либо что-то изменить, либо понять как работает конкретная часть. Обычно, каждая из таких частей лежит в отдельных модулях и разбираться нужно именно в них. А не во всем большом полотне из сотен полей, каждое из которых служит своей цели.
12 Мэс33
 
14.10.19
21:37
IDE подскажет)
13 Злопчинский
 
14.10.19
21:40
(7) это понятно, если мы говорим о конкретных значениях организации, товара и склада.
как мне имея вот такое определение  свойства

quantity = DATA NUMERIC[10,3] (Organization, Stock, Sku);

получить список из квантити для конкретной организации, склада, и всех товаров?
14 CrushBy
 
14.10.19
21:40
(9) Да, может быть такое.
Обычно все-таки задача идет со стороны пользователя (как минимум, там есть описание в какие формы добавить). Вы заходите в эти формы и смотрите - есть там или нет. Дальше, наведя на объект, система показывает в каком модуле  оно объявлено :
https://habr.com/ru/company/lsfusion/blog/465573/
Вот тут раздел Навигация.

Если его на форме нет, то и в системе нет.
15 НиколаевГ
 
14.10.19
21:41
(8) Смысла оно может и не имеет, но, если я правильно понял, можно получить это значение для конкретного склада, применив агрегатную функцию для свойства с пустым объектом класса Item?
16 CrushBy
 
14.10.19
21:41
(10)
CLASS Item 'Товар';
CLASS Stock 'Склад';

quantity = DATA INTEGER (Item, Stock);
Вот так как-то.
17 Лефмихалыч
 
14.10.19
21:42
(13) тебе его надо вызвать с конкретными значениями аргументов
Количество = quantity(ТвояОрганизация, ТвойСклад, ТвойТовар)
ТвояОрганизация, ТвойСклад, ТвойТовар - этов сё переменные, в которых конкретные значения валяются
18 Злопчинский
 
14.10.19
21:43
(11) мну не интересно какой "обычно кейс". (соотнеся со срачем: в "1С такой кейс" - вам же это не нравится что в 1С "такой кtйс"? 1С плохая, несмотря на то что у нее "тfкой кейс)/

у менz задача реализовать бизнес-потребность. сделать сущность, отажающую номер заявки покупателя во внутренних терминах-идентифкаторах покупателя.
как мне узнать - имея открытй проект в среде разработки - есть такая сущность или нет?
19 Злопчинский
 
14.10.19
21:44
(16) CLASS Item 'Товар';
из чего этот класс состоит?
20 CrushBy
 
14.10.19
21:44
(15) Нет. Нельзя. Пустых объектов не существует. Если вы на вход дадите NULL, то всегда получите на выходе NULL. Есть инвариант определенности (так сделано потому, что иначе невозможно будет сделать логику компиляции на SQL). Да и что такое страховой запас просто для склада ?
21 Злопчинский
 
14.10.19
21:45
(17) мне не нужен конкретный. мне нужно количество по всем товарам
типа
Количество(Товар) = quantity(ТвояОрганизация, ТвойСклад)
.
?
22 Лефмихалыч
 
14.10.19
21:45
(20) дяденька, у тебя талант делать людям непонятно. Тебе бы монетизировать это.
23 Лефмихалыч
 
14.10.19
21:46
(21) яхз, наверное квантити_два определять с двумя параметрами
твоего вопроса как будто не видят...
24 НиколаевГ
 
14.10.19
21:47
(20) А как тогда? получать свойство для всех объектов класса Item, что-ли?
25 CrushBy
 
14.10.19
21:47
(13) Зависит от контекста. Если на форме, то вот так :
FORM test
OBJECTS o = Organization PANEL

OBJECTS st = Stock PANEL

OBJECTS i = Item
PROPERTIES name(i), quantity(o, st, i)
FILTERS quantitity(o, st, i)
;

Если в действии, то так :

runAction(Organization o, Stock st) {
    FOR quantity(o, st, Item i) DO {
        MESSAGE 'Кол-во по организации ' + name(o) + ' и складу ' + name(st) + ' и товару ' + name(i) + ' : ' + quantity(o, st, i);
    }
}
26 Лефмихалыч
 
14.10.19
21:49
quantity(o, st, Item i) яшсказал...
27 CrushBy
 
14.10.19
21:49
(21) Тогда товар должен быть справа, а не слева.

Вы для начала представьте, как это будете хранить в базе данных. А на самом деле, так и будет : как таблица с тремя ключами, то есть функция от 3х параметров.
28 Злопчинский
 
14.10.19
21:50
(14) "Обычно все-таки задача идет со стороны пользователя (как минимум, там есть описание в какие формы добавить)."
- это частный случай когда у пользователя есть условно бизнес-аналитик.
если таковго нет - приходит менеджер/логист, который даже в фузине не работает и говорит
"надо чтобы на всех этикетках которыми мы маркируем поставки, печатался идентификатор заявки, который нам дает покупатель. Все. он в глаза эту фузину не видел. он в ВМС какой-нить интегрируемой с фузиной работает. фузина скидывает в ВМС все данные.
Поэтому исходим из того, что пользовтаель не знает в какое место и в какую фому нужно это поставить. он знает бизнес-потребность. вне привязки к инструменту автоматизации.

"Вы заходите в эти формы и смотрите - есть там или нет. "
- в какие конкретно ЭТИ ФОРМЫ? как получить список "этих форм", которые надо обязательно отсмотреть, стелепатировать поток мыслей того кто раньше писал эти модули (ввиду отсутсивя спецификации разработок и требований к оформлению кода и отсутсвию комментариев)
.
?
29 Ещё1
 
14.10.19
21:51
(9) Тут просматривается два подхода к компоновке классов и методов работы с ними в 1С и lsFusion. На примере документа продажи.

В 1С: есть Документ продажи. В нём описаны все известные его атрибуты, формы для работы с ним, логика проведения/отпроведения, проверки атрибутов на точность заполнения, совместимость между собой, проверка прав пользователя на этот объект и проч. Практически всё в 1 месте. За исключением добавок, внесённых через расширения конфигурации (это свежая добавка в последних версиях 1С), внешние отчёты, внешние печатные формы, внешние обработки для этого документа.

В lsFusion: тоже есть Документ продажи, и в нём тоже заданы его базовые атрибуты, базовые формы и отчёты для работы, базовые проверки на заполнение и совместимость значений атрибутов. А дополнительная функциональность подключается к базовой через новые модули. Например, нужно добавить в программу партионный учёт товаров на складах. Создаётся новый модуль, и там для всех документов программы добавляются нужные свойства, прописывается логика партионного учёта, расширяются где надо формы и т.д. (Это не значит, что фузиновцы именно так и поступили в своей ERP, но общая схема доработки программы такая).
30 Лефмихалыч
 
14.10.19
21:51
(21) а, я понял. Это тебе не надо просто. Это у тебя адинэсная парадигма в голове, а в фузине так не делают. А вот как делают - яхз. Я сегодня догадывальник намозолил уже на работе и чот не догоняю промежду этих бурятских строк прочесть намёки
31 Злопчинский
 
14.10.19
21:52
(25) "OBJECTS i = Item"
что такое Item? где определяется?
32 Лефмихалыч
 
14.10.19
21:52
(28) тебе говорят: "у тебя задача говно, мы такие не решаем". Но может и правда у них это не решается потому, что где-то на старте все совсем по-другому. Только вот они объяснить не могут, к сожалению.
33 Злопчинский
 
14.10.19
21:54
(25) " Если на форме, "
- форма может быть без визуализации  - так?
- форма может быть откуда-то вызывана, внутри себя получить список Квантити(товар) и вернет наружу?
34 CrushBy
 
14.10.19
21:55
(24) К сожалению, не очень понял вопроса. Для какой конкретно задачи ?

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

Ну, как минимум, если вы вообще ничего не знаете о программе, то спросите у того, кто печатает заявки - какие кнопки он жмет, и начните раскручивать с этой стороны. Еще часто просто делаете CTRL+SHIFT+F и вбиваете там "этикетки" и дальше смотрите где они используются.
35 Злопчинский
 
14.10.19
21:56
придумайте какое-нить соглашение о терминахз, плиз
"на форме" - для меня и большинства 1сников, имхо, это визуальная форма, но я хз, может это у вас и без визуализации
"в форме" - для меня это в МОДУЛЕ формы, что в общем случае никак может быть не связано с визуальным отображением на форме и вообще необходимостью визуализации формы.
.
а то догадывайся (из контекста? контесть тоже бывает неясен), а догадки у всех разные могут быть
36 НиколаевГ
 
14.10.19
21:56
(25) Вот здесь: FOR quantity(o, st, Item i) - Item i обозначает все объекты класса Item?
37 CrushBy
 
14.10.19
21:58
(31) Item - это класс. Таким объявлением вы добавили на форму таблицу с динамическим списком, в которой в качестве записей будут объекты класса Item.
(33) Без визуализации форма может быть только для экспорта/импорта. Так что давайте для простоты всегда считать, что это визуальные форма.
38 НиколаевГ
 
14.10.19
21:58
(34) А пользователь может никаких кнопок и не нажимать, этикетки обычно печатаются программно :)
39 CrushBy
 
14.10.19
21:59
(36) Да. Значит для всех Item i, для которых определено (то есть не NULL) значение quantity(o, st, i).  То есть вы тем самым "расширяете контекст", а внутри DO уже можете обращаться к товару через переменную i.
40 CrushBy
 
14.10.19
22:01
(38) Ну я бы начал с поиска класса Этикетка (Label). А затем в IDE нажал бы ALT+F7 (поиск использований) и быстро бы нашел все места, где создаются объекты этого класса (типа : NEW l = Label). Собственно это и будут все места печати этикеток, скорее всего.
41 НиколаевГ
 
14.10.19
22:02
(39) Для агрегатных функций оно так-же работает?
42 Злопчинский
 
14.10.19
22:02
(34) ночь, блин. все спять. спросить не у кого.
надо сделать. туда куда это встает по бизнес-процессу. сделаю и утром покажу юзверю где это.
я - как разработчик определяю бизнес-процесс, его прохождение и прочее.
а не пользователи (они блин набизнесят так что мама не горюй). когда я не понимаю для чего это в какую точку бизнес-процесса воткунть, когда у меня сомнения - я ТОГДА ИДУ И ПЫТАЮ пользюков.
а не кидаюсь по перовму чиху пользюков лепить на какую-то непонятную для меня формочку непоянтн какое поле.
.
не уходите от ответа.
задача есть. из слов менеджера я сделал следующую постановку для себя
- в "документ.заявкапокупателя" поставить на визуальную форму реквизит "номерЗаявкиПокупателя". Данный реквизит должен быть виден во всех шапках этого документа где они - шапки этого документ есть на визуальных формах.
.
возвращаемся собственно к самому вопросу.
43 Ещё1
 
14.10.19
22:03
(18) Да, неплохо было бы получить как-то полный список пользовательских классов приложения. А для каждого класса - список его свойств, а также список свойств, где этот класс выступает в качестве параметра. Я нашёл только такое: в своём приложении в меню выбираем Administration - Metadata - Properties. Там есть таблица всех свойств классов, определённых в программе. Но без разбиения на классы, которым они принадлежат.
https://paste.pics/0bd9da02e3c9ca30c638271496e62dda
В демке ERP такого нет - там меню Administration отключено по понятным соображениям.
44 Злопчинский
 
14.10.19
22:03
(27) товар будет справа. потому что у меня ключевые поля (организация, склад). на выходе - на визуальной форме пусть для начала - список квантити по всем товарам.
45 Злопчинский
 
14.10.19
22:04
(44) тьфу, товар - будет слева, "справа" - ключевфые поля
46 Злопчинский
 
14.10.19
22:06
(29) ну вот мне и надо узнать - нет ли где в "дополнительных" модулях доопределения базового класса "документ" нужным мне реквизитом. чтобы не городить свой огород. если есть то что нужно.
47 Злопчинский
 
14.10.19
22:07
(37) класс Item как определен? код, для примера, в самом простом виде)
48 НиколаевГ
 
14.10.19
22:09
(47) Насколько я понял, класс определяется свойствами, которые могут принимать его в качестве параметра :))
49 Злопчинский
 
14.10.19
22:10
(37) "Без визуализации форма может быть только для экспорта/импорта."
..
эээ? я, что не могу написать где-то (глобальную) модуль (форму? функцию? действие? класс? свойство? хз что?), которая получает список нужных мне обьектов (например, все товары, для получаемых на входе Организации и Склада) и выдает на выход "потребителю" этот список?
.
или мне везде где нужен спсиок товаров по отбору (организация,склад) - все время рожать код какой-ито?
50 CrushBy
 
14.10.19
22:11
(41) Если вы подразумеваете под "агрегатными" функциями "вычисляемые" функции (то есть любые, кроме DATA), то да.
51 CrushBy
 
14.10.19
22:12
(43) Посмотрите в статье по IDE раздел Анализ (первая GIF'ка там) : https://habr.com/ru/company/lsfusion/blog/465573/
Это то, что надо ?
52 Злопчинский
 
14.10.19
22:13
(39) Item i
- i - экземпляр Item?
Item где-то "выше" описан как сущность (класс? свойство? хз что?) "Товар"..?
53 НиколаевГ
 
14.10.19
22:14
(50) А что ещё можно подразумевать под "агрегатными функциями"?
54 CrushBy
 
14.10.19
22:14
(48) Можно и так сказать :) Напомнило утиную типизацию (duck typing) : "Если это выглядит как утка, плавает как утка и крякает как утка, то это, вероятно, и есть утка."
55 Злопчинский
 
14.10.19
22:15
(40) мне чтобы печатать этикетки - надо сначала на уровне прикладного приложения определить "контейнер", где будет храниться номер этикетки тупо String(30) относящийся к "шапке" документ.ЗаявкаПокупателя
56 Злопчинский
 
14.10.19
22:16
как мне в приложении/среде разработки найти все "реквизиты", которые описывают сущность "документ.заявкаПокупателя"?
57 Злопчинский
 
14.10.19
22:19
(43) подожди, ты показываешь скриншот ПРИЛОЖЕНИЯ. я разраб. у меня приложения готвого нет. у меня код в среде разработки.
58 CrushBy
 
14.10.19
22:24
(55) Еще один кейс, который мы используем на практике :
Find symbol (CTRL+ALT+SHIFT+N) в IDEA. Как правило, есть naming policy. То есть такое свойство должно быть объявлено вроде как label = DATA Label (SaleOrder);
Соответственно просто набираете labOrd, и она находит все такие объявления.
59 Ещё1
 
14.10.19
22:28
(51) Там где автодополнение показывается? В идеале неплохо было бы что-то вроде меню Navigate - Class / Property / Form в IDEA. Меню-то есть, но оно пустое.
60 Злопчинский
 
14.10.19
22:32
(58) то бишь тупо контекстный поиск. и если я не угадал с символами для поиска то я захренячу еще одно поле (вдобавок к уже существующему с тем же целевым назначением).
.
нет кнопочки чтобы нажать
и получить некое дерево "определения" документ.ЗаявкаПокупателя - со всеми базовыми определениями, переопределениями и добавлениями на базовый класс пробежаться про нему и увидет что-то типа InputNumberFromClient - и уже дальше от него исследовать, а не от "Label" или "Lab" иди хз как там еще мог написать предыдущий ваятель?
61 Злопчинский
 
14.10.19
22:36
ладно, пока все на сегодня.
.
примерно так (имхо мнение)
в 1С - туева хуча общих/глобальных модулей/процедцур/фунгкций. не знаешь - будешь изобретать велосипед и множить лишние сущности ()
в фузина - туева хуча модулей, классов, свойств, определений/переопределений/добавок сверху. не будешь знать (инструмента удобного нет) - будешь хренячить лишнее/дублировать/изобретать велосипед
.
один хрен грабли, с разных боков.
принципиальнйо разницы нет.
62 Ещё1
 
14.10.19
22:38
(59) Хотя нет, надо начать набирать имя класса, и будет отыскивать его определения. Я ожидал, что оно сразу покажет весь список классов.
Но вот что-то подобное надо бы сделать для свойств и форм. Причём для свойств - желательно с фильтром по классу в параметрах.
63 Лефмихалыч
 
14.10.19
22:51
(48) «класс определяется свойствами, которые могут принимать его в качестве параметра»

класс определяется свойствами, которые могут принимать его... свойствами, которые принимать его... класс опредШТОТЫСЕЙЧАССКАЗАЛ?!
64 _DAle_
 
14.10.19
23:06
(59) Имелась ввиду вот эта гифка https://habrastorage.org/webt/gn/y8/lq/gny8lql1upiag0blpf_otxfyqjw.gif
65 Ещё1
 
14.10.19
23:18
(64) О, ну конечно оно, "Structure View", спасибо! Вот, здесь всё видно, какие свойства принадлежат выбранному классу, и где они определены. Это спрашивал выше Злопчинский (55).
66 Ещё1
 
14.10.19
23:21
Теперь понятно, как "навигировать" по незнакомому проекту. Выцепляем нужный класс по названию, через Navigate - Class отыскиваем его базовое определение. И потом можно искать все его свойства через Structure View.
67 _DAle_
 
14.10.19
23:31
(66) Я бы советовал прочитать эту статью по IDE полностью, там еще всякие крутые штуки есть вроде иерархии использования элемента и других фишек навигации.
68 Ещё1
 
14.10.19
23:39
(67) Да, наверное стоит. Просто очень много информации разной. Для меня это всё ново: IDEA, lsFusion, Java... А информация разбросана по документации, статьи на Хабре и ответы здесь, исходники ваших проектов...

Вам надо сообщать куда про исключения в IDE? Вот такое окно у меня показало:
IDE Fatal Errors
Exception in plugin lsFusion (1.0.179).
Stack trace:
java.lang.Throwable: window with id="Design" isn't registered
    at com.intellij.openapi.diagnostic.Logger.error(Logger.java:145)
    at com.intellij.openapi.wm.impl.ToolWindowManagerImpl.getRegisteredInfoOrLogError(ToolWindowManagerImpl.java:709)
    at com.intellij.openapi.wm.impl.ToolWindowManagerImpl.isToolWindowVisible(ToolWindowManagerImpl.java:1599)
    at com.intellij.openapi.wm.impl.ToolWindowImpl.isVisible(ToolWindowImpl.java:204)
    at com.lsfusion.design.DesignView$1.run(DesignView.java:103)
    at com.intellij.openapi.actionSystem.impl.ActionManagerImpl$MyTimer.runListenerAction(ActionManagerImpl.java:1492)
    at com.intellij.openapi.actionSystem.impl.ActionManagerImpl$MyTimer.notifyListeners(ActionManagerImpl.java:1481)
    at com.intellij.openapi.actionSystem.impl.ActionManagerImpl$MyTimer.actionPerformed(ActionManagerImpl.java:1471)
    at java.desktop/javax.swing.Timer.fireActionPerformed(Timer.java:317)
    at java.desktop/javax.swing.Timer$DoPostEvent.run(Timer.java:249)
    at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:313)
    at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:776)
    at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:727)
    at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
    at java.base/java.security.AccessController.doPrivileged(Native Method)
    at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
    at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:746)
    at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.java:824)
    at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:773)
    at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$8(IdeEventQueue.java:412)
    at com.intellij.openapi.progress.impl.CoreProgressManager.computePrioritized(CoreProgressManager.java:704)
    at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:411)
    at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
    at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
    at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
    at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
    at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
69 _DAle_
 
14.10.19
23:43
(31) Про Item уже ответили, я расскажу, что такое "i =". В данном случае - это всего лишь задание алиаса, альтернативного имени, чтобы потом не писать внутри объявления формы везде Item, а писать i. Примерно, как AS в SQL. Его можно не задавать, и в таких малюсеньких примерах, имхо, код будет только читабельней.
70 _DAle_
 
14.10.19
23:45
(68) Думаю, было бы круто заманить вас к нам в slack :) Да, сообщать надо, но я сейчас не готов сказать, это какая-то уже известная нам проблема или нет.
71 Ещё1
 
14.10.19
23:48
(69) Т.е. в строке
OBJECTS i = Item
i - это алиас имени класса, не переменная?
Я думал, у вас в коде классы везде с большой буквы, а переменные с маленькой.
72 Ещё1
 
14.10.19
23:51
(70) Пока других ошибок не видел, только эту. Может попозже в Slack, тут на Mista у людей примерно одинаковое знание платформы, как у меня. Обучаться вместе интересней.
73 _DAle_
 
14.10.19
23:54
(71) Хороший вопрос. В принципе, вы правы, в данном случае это i используется в качестве имени параметра. Просто если этот алиас не задать, то параметр будет равен имени класса. Ну и соответственно, для встроенных классов алиас придется задавать обязательно.
74 _DAle_
 
14.10.19
23:58
(73) Поправлюс: ...Просто, если этот алиас не задать, то имя параметра будет равно имени класса. Ну и для встроенных классов алиас приходится задавать обязательно, так как их имена - это ключевые слова.
75 _DAle_
 
15.10.19
00:00
(72) Ну в slack ведь вас никто заставлять говорить не будет, можно просто туда добавиться. Ну вот и stack trace'ы вот такие туда можно бросать, чтобы мы их не потеряли в массе сообщений.
76 Злопчинский
 
15.10.19
00:01
(66) а если класс сверху "переопределен" и сверху еще чем-то дополнен - в нафигации базового класса как-то будет видно?
77 Злопчинский
 
15.10.19
00:02
(69) ничего не увидел где про Итем ответили.
я понял что это класс (?) "Товары", но где он определяется/описывается и как?
78 Злопчинский
 
15.10.19
00:04
(72) Пока это еще не обучение, а вьезд в начала. Но уже с тестированием всех фигни что выплывает. Мистовцы тут наловили уже ошибок. а фузиновцы зажлобили вознаграждение.
79 _DAle_
 
15.10.19
00:09
(77) Там был ответ, что Item - это класс. Объявляется класс в lsfusion одной строкой.

CLASS Item;

Я так понимаю, что вы спрашиваете какие есть свойства/действия, которым на вход приходят объекты класса Item, да? Вообще определяться эти свойства и действия могут в любом модуле, который зависит от модуля в котором объявлен класс Item. Просмотреть можно, например, в том самом Structure View в IDE.
80 Ещё1
 
15.10.19
00:16
Я обратил внимание, в демке ERP часто используют для задания даты/времени (напр. документа) пару полей ввода дата и время вместо объединённого даты/времени. Такая ерунда была в 1С 7, и от неё отказались в 1С 8 из-за ненадобности и усложнения интерфейса и навигации по форме. я б вам рекомендовал рассмотреть тоже этот вариант, как в 1С 8.
81 _DAle_
 
15.10.19
00:17
(76) Да, если мы, наприимер, создадим новый модуль, в нем добавим зависимость на модуль с объявлением класса Item, и добавим новое свойство newProperty(Item i), то оно будет видно.
82 PR
 
15.10.19
00:25
_DAle_, а что такое ваш продукт вообще в принципе?

Как я все понимаю
Есть Оракл или Постгре — это СУБД
Есть JAVA — это язык программирования
Есть IDEA — это среда разработки проектов на JAVA
А что есть ваш продукт во всем этом?
Правильно ли, что (если мне не жалко времени изобрести велосипед с нуля) я могу написать в IDEA (да хоть в блокноте, не суть) JAVA-код, который будет работать с СУБД и это ничем не будет отличаться от вашего продукта?

Ну и, чтоб два раза не вставать, а то я не сильно силен в JAVA
Чем рисуется вся визуальная кухня, то есть GUI?
83 Ещё1
 
15.10.19
00:26
(80) В таблицах тоже самое, два столбца "Дата документа" и "Время документа". Сделайте 1 и назовите "Дата". Поймут даже секретарши, потому что в любом бизнес-документе есть как минимум 2 основных реквизита: его номер и его дата.
84 Ещё1
 
15.10.19
00:41
(82) Наверное все фузинцы ушли спасть. Могу ответить как я понимаю. А завтра уточнят.

1. Язык. Единый язык для написания логики программы и для работы с данными. В большинстве других бизнес-платформах есть отдельный язык написания логики (самобытный или один из известных С++/Java/Delphi/1С...), и отдельно язык для манипуляции данными (SQL, 1С-SQL, ...). Тут 2 в 1 - меньше учить.

2. Плагин для IDEA - помогающий писать код, поддерживающий рефакторинги, навигацию и т.д.

3. Сама платформа: уже готовое решение на Java, каркас 3-звенного приложения (БД - сервер приложений - клиентские приложения Windows/Web).

А также транспайлеры кода из lsFusion в SQL и Java, анализатор и оптимизатор SQL-запросов к базе, и другое что я забыл или не знаю.
85 PR
 
15.10.19
00:44
(84) Ну вот нахрена ты это написал?
Я же специально вопрос на Крашу, не Бро и не начинающим энтузиастам задал, а конкретно _DAle_
Как бы есть причины на то, я их уже озвучивал
86 PR
 
15.10.19
00:45
+(85) Я как бы никуда не тороплюсь, готов подождать, ничего страшного
87 Ещё1
 
15.10.19
00:48
(85) Подумалось, человек уйдёт спать без ответа, будет всю ночь мучатся... :)
Ладно, я тоже отключаюсь.
89 _DAle_
 
15.10.19
01:16
(82) Хм, я никогда не пробовал формулировать, что такое платформа, если честно. Я попробую, не уверен, что это будет сильно адекватно.
Платформа lsfusion - это совокупность нескольких программ (как минимум это сервер приложений (application server), desktop-клиент, web-клиент), позволяющих разрабатывать информационные системы. Сервер приложений в свою очередь предоставляет среду исполнения (execution environment) для программного кода, написанного на языке lsfusion. Если другими словами, то это 2 из 3 звеньев трехзвенки, в качестве недостающего сервера баз данных используются существующие РСУБД.

Сам код платформы написан в основном на java. Для написания кода на языке lsfusion платформа предоставляет плагин к Intellij IDEA.

>Правильно ли, что (если мне не жалко времени изобрести велосипед с нуля) я могу написать в IDEA (да хоть в блокноте, не суть) JAVA-код, который будет работать с СУБД и это ничем не будет отличаться от вашего продукта?

Хм, тут я немного не понял. Да, платформа написана на java, но главной штукой тут является базовыые концепции (свойства, действия, классы, ограничения, формы и т.п.), и язык lsfusion, который позволяет эти концепции удобно описывать.

>Чем рисуется вся визуальная кухня, то есть GUI?

desktop - Swing, web - GWT + есть возможность прикрутить React.
90 PR
 
15.10.19
01:17
(87) Раз уж ты зачем-то написал свой не на что не отвечающий пост, то я прокомментирую, может это поможет _DAle_ более точно понять мой вопрос

>>1. Язык. Единый язык для написания логики программы и для работы с данными. В большинстве других бизнес-платформах есть отдельный язык написания логики (самобытный или один из известных С++/Java/Delphi/1С...), и отдельно язык для манипуляции данными (SQL, 1С-SQL, ...). Тут 2 в 1 - меньше учить.
Если я все правильно помню, нет никакого языка, кроме JAVA, который поддерживается интерпретатором в лице JAVA-машины
Весь остальной язык — это различные модули, то есть переменные, функции, процедуры, классы, хренассы, все, что ты набарогозил и теперь подключаешь и используешь
Один из аналогов в 1С в чистом виде — БСП, которую можно использовать, а можно то же самое самому накидать
А вот аналог Сообщить в 1С ты не сделаешь, потому что нет у тебя никакой возможности сообщить что-то в окно сообщений, кроме как через Сообщить
Вот мне и интересно, есть ли в данном случае что-то такое же или весь продукт — это набор различных прикольных модулей?

>>2. Плагин для IDEA - помогающий писать код, поддерживающий рефакторинги, навигацию и т.д.
Что за плагин? И что, если я буду писать все это без этого плагина? Мне будет просто неудобнее и сложнее или я чего-то не смогу принципиально?

>>3. Сама платформа: уже готовое решение на Java, каркас 3-звенного приложения (БД - сервер приложений - клиентские приложения Windows/Web).
Прикольно, че.
— Что есть ваша платформа?
— Ну, во-первых, язык, во-вторых, плагин, а в-третьих, платформа!

>>А также транспайлеры кода из lsFusion в SQL и Java, анализатор и оптимизатор SQL-запросов к базе, и другое что я забыл или не знаю.
https://ru.wikipedia.org/wiki/Транспайлер всего-лишь делает работу без него менее удобной, но не невозможной.
Анализатор и оптимизатор SQL-запросов к базе то же самое.
Про другое да, очень емкое замечание. Приходный, расходный и другие кассовые ордера, которые я забыл или не знаю.
91 PR
 
15.10.19
01:29
(89) Я объясню, с какой целью задал вопрос
Вот, предположим, решил начинающий программист на что-то нацелиться, на 1С, JAVA, что-то еще, позволяющее организовать многопользовательскую работу с данными и визуальным интерфейсом

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

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

А чем выбор в пользу вашей платформы принципиально отличается от выбора в пользу JAVA?
Понятно, что и в случае с 1С можно написать свою "1С", точно такую же, но это скорее из теоретической области, придется писать с нуля просто все
В вашем же случае есть некоторая надстройка над JAVA и все, верно?
Насколько она велика?
Какова ее ценность самой по себе?
Что без нее теряет разработчик, сколько лет ему придется корпеть, чтобы сделать такое же?
Что она вообще в принципе из себя представляет, что это за набор библиотек, что мне, как разработчику, не придется писать на JAVA с нуля, когда я буду создавать свое конкретное решение с конкретными классами?
92 PR
 
15.10.19
01:41
(89) >>сервер приложений
ok, понятно, некий достаточно сложный, в то же время унифицированный, интеллектуальный продукт со своей логикой

>>desktop-клиент
Что он из себя представляет?
Многооконное приложение с главным меню?
Какая-то простая заготовка application, на которую нужно накручивать все остальное?
Что-то другое?

>>web-клиент
Веб-клиент разве не браузер?
Что в данном случае есть веб-клиент?

>>Сервер приложений в свою очередь предоставляет среду исполнения
Какой-то глобальный интерфейс, понятно, часть сервера приложений, иначе такой сервер приложений никому не был бы нужен.

>>Для написания кода на языке lsfusion платформа предоставляет плагин к Intellij IDEA.
Ну то есть это просто обертка, ok.
Или это серьезная такая обертище, замаешься сам писать?

>Хм, тут я немного не понял. Да, платформа написана на java, но главной штукой тут является базовыые концепции (свойства, действия, классы, ограничения, формы и т.п.), и язык lsfusion, который позволяет эти концепции удобно описывать.
Всякие базовые концепции — это набор библиотек и только, верно? При большом желании подключи я их в проекте без вашей платформы, они так же будут работать?
Про язык я написал выше, что это обертка.

>desktop - Swing, web - GWT + есть возможность прикрутить React.
Swing — это не html, это не для браузера?
GWT — это как раз и есть ваш вклад в веб-браузер или это поддерживается браузером из коробки, а у вас наработанный набор модулей под отрисовку с его помощью?
93 PR
 
15.10.19
01:46
+(92) Я к тому, что, если довести ситуацию до абсурда, я могу написать одну библиотеку с одной возможностью, обертку над JAVA, она будет выводить на экран заданный текст заданное количество раз
И назову это платформой X
Но ты же понимаешь, что моей платформой в этом случае будет пользоваться ровно ноль человек, потому что нахрен кому эта прослойка между программистом и JAVA нужна?
Вот я и пытаюсь понять, насколько у вас толстая и нужная прослойка?
94 _DAle_
 
15.10.19
01:53
(91) >А чем выбор в пользу вашей платформы принципиально отличается от выбора в пользу JAVA?

Более высоким уровнем абстракции и предметно-ориентированной направленностью. Смотрите, я может проведу сейчас не лучшую аналогию, но платформа 1С ведь написана на С++ (если я ничего не путаю). Вот этот вопрос - это примерно "Чем выбор в пользу платформы 1С принципиально отличается от выбора в пользу С++?"

>В вашем же случае есть некоторая надстройка над JAVA и все, верно?
Это не надстойка, это программный продукт, написанный на Java. Мы бы были надстройкой, если бы мы код на lsfusion транлировали бы в код на джава, который бы потом выполнялся. А это не так.

>Какова ее ценность самой по себе?
>Что без нее теряет разработчик, сколько лет ему придется корпеть, чтобы сделать такое же?

В платформе решено множество сложных технических задач, есть, например, оптимизирующий компилятор в SQL, который реализует некоторые вещи, которые не реализуют сами СУБД. Лет корпеть придется много. Вообще, это все есть в статьях и об этом лучше рассказывает Bro :)
95 _DAle_
 
15.10.19
02:20
(92) >Всякие базовые концепции — это набор библиотек и только, верно? При большом желании подключи я их в проекте без вашей платформы, они так же будут работать?

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

>>desktop-клиент
>Что он из себя представляет?

Эмм, Оконное приложение. Причем пользователю платформы ничего для этого делать не нужно, он описывает логику на языке lsfusion и получает на выходе сервер приложений с этой логикой, desktop-клиент и web-клиент (это приложение, выполняющееся в браузере и общающееся с application server'ом).

>>Для написания кода на языке lsfusion платформа предоставляет плагин к Intellij IDEA.
>Ну то есть это просто обертка, ok.
>Или это серьезная такая обертище, замаешься сам писать?

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

Swing и GWT - это GUI библиотеки, которые мы используем для создания пользовательского интерфейса. Swing - это не для браузера, это такая старенькая стандартная GUI java-библиотека, GWT - это библиотека от Google, позволяющая создавать javascript-фронтенд из Java.
96 PR
 
15.10.19
02:24
(94) >>Более высоким уровнем абстракции и предметно-ориентированной направленностью. Смотрите, я может проведу сейчас не лучшую аналогию, но платформа 1С ведь написана на С++ (если я ничего не путаю). Вот этот вопрос - это примерно "Чем выбор в пользу платформы 1С принципиально отличается от выбора в пользу С++?"
Все верно, только я же писал и про 1С и про свое приложение с одной функцией
Это две грани, от очень сложно написать такое же до делается за секунду

>>Это не надстойка, это программный продукт, написанный на Java. Мы бы были надстройкой, если бы мы код на lsfusion транлировали бы в код на джава, который бы потом выполнялся. А это не так.
Ага, вот пошло интересное, не зря я тебя пытал
А во что же летит дальше код на lsfusion?

>>В платформе решено множество сложных технических задач, есть, например, оптимизирующий компилятор в SQL, который реализует некоторые вещи, которые не реализуют сами СУБД. Лет корпеть придется много. Вообще, это все есть в статьях и об этом лучше рассказывает Bro :)
Оптимизирующий компилятор — это наверное прикольно, но все-таки не то, на самостоятельную платформу не тянет
А про Bro не думаю, что он рассказывает лучше
97 PR
 
15.10.19
02:27
(95)  >>На java их тоже можно было реализовать, только куда менее удобно, чем на специально сделанном для их выражения языке.
Так а этот специально сделанный для них язык куда в итоге все транслирует, в какой язык более низкого уровня? Или это вообще уже готовые dll и exe?

>>Эмм, Оконное приложение. Причем пользователю платформы ничего для этого делать не нужно, он описывает логику на языке lsfusion и получает на выходе сервер приложений с этой логикой, desktop-клиент и web-клиент (это приложение, выполняющееся в браузере и общающееся с application server'ом).
ok, понятно

>>Это средство разработки, облегчающее жизнь программисту: подсветка кода, автодополнение, навигация, рефакторинг, отладчик и многое другое. Плагин нужен именно для написания кода на lsfusion. Сам плагин довольно серьезный, функционала там достаточно много, вполне себе на уровне взрослых языков программирования, на мой взгляд.
ok, понятно

>>Swing и GWT - это GUI библиотеки, которые мы используем для создания пользовательского интерфейса. Swing - это не для браузера, это такая старенькая стандартная GUI java-библиотека, GWT - это библиотека от Google, позволяющая создавать javascript-фронтенд из Java.
ok, понятно
98 _DAle_
 
15.10.19
02:32
(96) >Это две грани, от очень сложно написать такое же до делается за секунду.

Я могу завтра посчитать, сколько строк кода на java в исходном коде платформы. Это не ахти какой показатель, я это не понимаю. Но все же.

>А во что же летит дальше код на lsfusion?

Так как все выполняется на jvm, то физически все сначала превращается в java-объекты, структуры данных.. Логически же логика вычислений в конечном итоге превращается в код на SQL.

>А про Bro не думаю, что он рассказывает лучше

Он по крайней мере это постоянно делает, а я нет.
99 PR
 
15.10.19
02:33
(98) >>Так как все выполняется на jvm, то физически все сначала превращается в java-объекты, структуры данных.. Логически же логика вычислений в конечном итоге превращается в код на SQL.
Ну то есть все-таки все в итоге транслируется в java-код? То есть все-таки обертище?
100 _DAle_
 
15.10.19
02:52
(99) Нет, это же получается не исходный код на java, а объекты в памяти. Мы не компилируем в java, а интерпретируем код на lsfusion и во время интерпретации создаем jvm объекты.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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


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

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

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

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

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

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

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

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

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

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

initialized = DATA BOOLEAN ();

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

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

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

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

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

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

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

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

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

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

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

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

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

class Item extends AbstractItem {
   String name;
}

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

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

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

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

Т.е. программист должен в первую очередь думать на уровне бизнес-классов, их свойств, событий и действий. Это уровень 2 в 3-звенном приложении (СУБД - сервер приложений - пользовательские программы). А как это всё будет отражено на уровне 1 и уровне 3 - решает платформа. Хотя при желании можно ей подсказать, какую конкретно таблицу в СУБД создать, как её назвать, как расположить элементы на форме для удобства пользователя.
212 _DAle_
 
23.10.19
14:43
(205) Я понимаю, что это не простое объяснение, но чтобы простыми словами рассказать, нужно много текста с примерами, а на это соответственно много времени.

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

(209) В целом, да.
213 НиколаевГ
 
23.10.19
14:50
(212) Хотите, чтобы вашу платформу использовали - придётся потратить время, тут ничего не поделать. Опять же, это время будет потрачено не просто на ответ на форуме, но и на получение в итоге качественной и непротиворечивой документации.
214 Ещё1
 
23.10.19
14:52
(207) :)
Главное, чтобы 1С их не купила и не сделала 2С, с лицензиями на каждого пользователя, сервер, базу данных, web-клиента, и на каждую отдельную конфигурацию.
215 _DAle_
 
23.10.19
14:53
(206) На мой взгляд, пока недостаточно опыта использования языка для более строгой стандартизации и рекомендаций. Сейчас основную массу кода на lsfusion пишет одна команда, у них есть выработанные внутри команды практики и стиль кодирования, но есть вещи, к которым они просто привыкли и не факт, что это нужно принимать в качестве стандарта. Хочется больше кода, написанного разными людьми с разным опытом, тогда можно делать выводы о преимуществах каких-то конкретных подходов и стилей.
216 HeKrendel
 
23.10.19
14:54
3 ветки
217 HeKrendel
 
23.10.19
14:54
Карл
218 Злопчинский
 
23.10.19
14:54
(214) вот это точно!
219 Конструктор1С
 
23.10.19
14:56
(211) с неменьшим успехом можно .NET Framework назвать бизнес-ориентированной платформой. Под неё тоже можно писать "бизнес-классы и их свойства". А уж крутяцких вещей, облегчающих жизнь разработчику, в .NET немеряно
220 НиколаевГ
 
23.10.19
14:57
(215) Замкнутый круг какой-то. Больше кода нет из-за необычной концепции и высокого порога вхождения, стандартов нет, так как нет кода. Вот я хотел бы реализовать на фузине небольшое, нужное на практике, приложение, но прогнозируемые временные затраты на получение минимально приемлемого результата удручают :((
221 НиколаевГ
 
23.10.19
14:59
(217) "Неладно что-то в датском королевстве"(с)
222 НиколаевГ
 
23.10.19
15:00
(219) Так да, это и есть бизнес-ориентированная платформа.
223 Конструктор1С
 
23.10.19
15:05
(222) не-а
224 _DAle_
 
23.10.19
15:09
(220) Ну, все же не такой уж и замкнутый. Мы выложили платформу в общий доступ и стали писать статьи максимум пару месяцев назад. Сейчас уже есть люди, которые пробуют платформу на практике, мы потихоньку получаем фидбэк. На его основании будем что-то улучшать, добавлять.
225 Bro
 
23.10.19
15:14
(220) Вы просто плохо представляете как 1с выглядит со стороны. Я когда первые материалы открыл первая реакция ЧТО ЭТО. Картинку со статьи видели? Порог вхождения у 1с очень высокий. Даже выше чем у условного .net, особенно если у человека до был хоть какой то опыт программирования.
226 Ник080808
 
23.10.19
15:17
(225) то что вы дупля в 1с не отбиваете мы по вашим глупым статьям  поняли. Вопрос в другом - нафига вы рассуждаете о том, в чем не понимаете?)
227 Ещё1
 
23.10.19
15:18
(219) Ну так и на платформе .NET такое есть. Введите в Гугл "ERP .NET Framework" и там в первых строках среди прочего будет https://mixerp.org - Free ASP.net Open Source ERP Software. Больше альтернатив - лучше.
228 Пузан
 
23.10.19
15:25
А как обстоят дела с разработкой печатных форм? Всякие там ТОРГ-12, СФ и прочие довольно сложные оп структуре формы? Есть какой то визуальный редактор?
229 Bro
 
23.10.19
15:27
(228) бесшовно jasperreports встроен. Но он чисто за дизайн печатной формы отвечает (за все остальное сама платформа). Естественно визуальный редактор есть, собственно это единственное место где в нем есть смысл.
230 Ещё1
 
23.10.19
15:30
(225) Могу подтвердить, что после 1С сразу пользовательский интерфейс показался каким-то совсем упрощённым, однотонным. Сейчас вот обновил модули lsFusion до последней версии 3 beta, поработал по пару часиков каждый день, и вроде уже начинает нравиться.

То есть внешний вид в 1С очень хорошо продуман, это да. Но к lsFusion тоже можно привыкнуть.
231 Bro
 
23.10.19
15:32
(226) ну не знаю половину говорят что все так и есть. Вот одно из последних мнений.

Я со всем согласен кроме части про блокировки и СКД.

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

У меня есть опыт работы с BI (особенно с MS BI) и могу сказать что пользователи вообще не могут работать с BI системами, они слишком сложны для них.
Если я им дашборды создам то да, они могут, где то могут поля перетянуть, но на этом все.

В то же время совсем нулевые девочки из ЗУП которые даже компьютер сами выключить не могут, активно используют отчеты на СКД (конечно обернутые в более дружественный интерфейс).
232 Ник080808
 
23.10.19
15:32
(225) ыыыыы глянул код добавленный на гите по заданию))) и ты будешь рассказывать о "ЧТО ЭТО"?))
233 Bro
 
23.10.19
15:34
(232) я к тому что 1с со стороны стороннего разработчика выглядит не менее дико чем lsFusion со стороны 1сца.
234 Ещё1
 
23.10.19
15:35
(225) В 1С немного другой подход. Там есть готовые конфигурации и пошаговые методические рекомендации. Сделано всё для того, чтобы "внедрятелю" не пришлось лезть внутрь исходных модулей платформы. И конечно, это сложно назвать программированием, это настройка. Написать пару внешних обработок с печатными формами - не в счёт.

А вот если конкретно заниматься программированием на 1С, изучить язык, изучить 1С-SQL, разобраться как всё там устроено, как работают разные механизмы - вот такого человека можно назвать 1С-программистом. И там порог вхождения заметно выше, чем для "внедрятеля".
235 Bro
 
23.10.19
15:36
(230) вот не знаю. Я смотрел ту же формы номенклатуры в УТ и не мог понять почему отбор запихнули хер знает куда, а создать заметку заслужило отдельную кнопку.
236 НиколаевГ
 
23.10.19
15:39
(225) Не надо мне тут про 1С втирать, я у вас про 1С в этой теме не спрашивал ничего, так как понимаю, что ничего нового вы про 1С мне рассказать не в состоянии. Отвечайте за свою платформу.
237 Ник080808
 
23.10.19
15:40
(231) кто говорит о чем говорят? такие же как и вы?) Ты понимаешь, что 1с программистами работают люди в большинстве своем не программисты по образованию? Вот лично я финансист по образованию. Я не увлекался программированием до того, как освоил 1с.  В кабинете из 6 разрабов, проги по образованию 2 человека. Собственно, что бы сделать небольше приложение на 1с - задание в духе зарубы с Ромой - начинающий человек абсолютно полный ноль в программировании сделает за пару недель не спеша. Поэтому, когда мне практикующий программист говорит что в 1с высокий порог вхождения, я понимаю что у этого программиста уровень ниже джуна)
238 Ник080808
 
23.10.19
15:41
(230) "пользовательский интерфейс показался каким-то совсем упрощённым, однотонным" - как красиво сказал "унылое г*но"! аплодирую стоя
239 Пузан
 
23.10.19
15:42
Зачем нужен абстрактный класс? Т.е. у него какая функция, кроме того чтобы другие классы от него наследовать? Т.е. просто некоторый группировочный класс. В примере определяется класс Document и все. Я бы понял, если бы в нем определили какие-то обязательные для всех наследников свойства и интерфейсы, которые наследник обязан реализовать. А так, не понимаю для чего он.
240 Ещё1
 
23.10.19
15:43
(235) Ну, есть нюансы, может кому-то надо. Просто со временем на лишнее не обращаешь внимания. Я ж говорю, дело привычки.
241 PR
 
23.10.19
15:49
(205) Да все просто
Это примерно как

Функция ПолучитьСуммуДокумента(Документ)
    
    Если ТипЗначения(Документ) = ОписаниеТипов("ДокументСсылка.РеестрТМЦНаСкладах") Тогда
        Возврат Документ.ТМЦ.Итог("ОценочнаяСтоимость");
    Иначе
        Возврат Документ.СуммаДокумента;
    КонецЕсли;
    
КонецФункции

То есть в зависимости от количества и типа параметров функции вызывается либо одна функция либо другая либо третья, а в принципе все можно решить через если
242 Smile 8D
 
23.10.19
15:49
(225) Пришел из php и спортивного программирования в 1С. Ничего особо дикого не увидел. Прошел 2 дистанционных курса по основным объектам и механизмам (заняло около 2х недель) и уже на 3ей неделе начал решать реальные задачи. Поначалу, конечно, понаступал на стандартные грабли, но влился довольно быстро. Менее чем через год спеца получил по платформе. И это было в то время, когда кроме официальных курсов и книжек ничего особо не было. Сейчас порог вхождения еще ниже.
Отдельная тема сложность современных конфигураций, там порог вхождения может быть чуть повыше, но если с логикой и алгоритмами дружишь (а у вас речь шла о программистах на других языках), то серьезных проблем быть не должно.
(231) Вы очень странно считаете половины. Я уже писал ранее, что вы выбираете отзывы на хабре, которые оставляют люди не осилившие базовые механизмы в 1С (судя по текстам). Как из этого можно составить сколько нибудь реальную картину, а особенно высчитывать проценты мне не понятно.
Краш меня вообще в ступор вводит своей логикой, которая ну никак не соответствует уровню адекватного программиста (когда он делал вывод о жителях России по тому что "если бы я жил в России, то хотел бы стать чиновником").
243 PR
 
23.10.19
15:52
(225) Ага, очень высокий, да, даже домохозяйки за вечер могут уже что-то наклепать
То ли дело у Фузины, где без поллитры даже не поймешь, про что вообще речь
И потом, ты не забывай, после этого порога перед программистом 1С целый волшебный мир возможностей
А перед разработчиком Фузины что, возможность использования платформы бесплатно?
244 PR
 
23.10.19
15:57
(233) Ты не путай дико и уепищно
Дико — это когда непривычно, все не так, все непонятно, везде все новое и порой неочевидное
А уепищно — это когда просто сразу видно, что унылое неудобное, малофункциональное говно с не юзерфрендли интерфейсом
245 _DAle_
 
23.10.19
15:59
(241) Если решать это через "Если", то при появлении какого-нибудь нового типа документа придется во всех этих блоках с Если добавлять еще одну ветку. А при полиморфизме это не нужно, вы просто объявляете новую реализацию для нового класса (в классическом ООП), а в lsfusion сверх этого можно добавить новую реализацию для нового набора классов.
246 Smile 8D
 
23.10.19
16:03
(245) Это был просто пример. В БСП все сделано универсальнее. Есть какие-то признаки, либо стандартные реквизиты, где указано по каким правилам считать СуммуДокумента.
Т.е. в общем виде принцип такой же - заранее потрать время на проектирование так, чтобы потом было проще расширять функциональность.
247 Пузан
 
23.10.19
16:04
(244) Я же правильно понимаю, что твое образование никак не связано с программированием ну или очень косвенно?
248 Ник080808
 
23.10.19
16:08
(245) поэтому и не делается это через если, а через универсальные функции и тебе не нужно добавлять ничего за пределами "класса"
249 _DAle_
 
23.10.19
16:08
(239) Обычно абстрактный класс Document нужен для того, чтобы можно было определить некоторую базовую логику, которая будет работать со всеми наследниками Document независимо от их реального класса. Например, объявить какие-то свойства, которые будут у всех документов вне зависимости от того, что это будут за документы. Ну, в общем, как и в любом другом языке программирования, где есть абстрактные классы.
250 Пузан
 
23.10.19
16:10
(249) В примерах у абстрактных классов вообще ничего нет, кроме объявления. В инструкции тоже. Т.е. не понятно для чего он нужен, кроме некоторой логической группировки.
251 Bro
 
23.10.19
16:11
(242) я считал мнение людей только которые постоянно пишут на 1с, как из поста который я кидал.
И он написал правильную мысль:

чуть позже отвечу подробнее


На мой взгляд не нужно отвечать.
Суть в том что у тех кто способен понять о чем вы пишите вопросов не возникает, может быть есть в каких то моментах иной взгляд, но в целом (особенно в части про СУБД) так все и есть.

А те кто начинают с этим спорить, не смогут вас понять все равно.

Так что флудить давайте лучше в отдельную ветку.
252 Пузан
 
23.10.19
16:12
(249) В других языках абстрактные таки имеют свойства и интерфейсы, которые потомки обязаны реализовать, таким образом как раз и задаются базовые свойства и методы. А тут чего то я не нашел про это не слово. Можно пример?
253 Smile 8D
 
23.10.19
16:17
(251) А как вы определяли, что они постоянно пишут на 1С?
Ну и, собственно, спорить я не собирался. Просто привел пример альтернативной точки зрения в надежде, что вы хоть попытаетесь абстрагироваться и рассуждать объективнее. Но пока вы упорно видите только то, что соответствует вашему поверхностному первоначальному мнению.
Очевидно, что есть люди, которым что-то не нравится и некоторые из них даже могут красиво формулировать свои мысли. Но это не более чем красота, потому что умом во фразе "кто спорит - тот дурак" (в оригинале "А те кто начинают с этим спорить, не смогут вас понять все равно") не пахнет. Умный человек способен абстрагироваться и понять точку зрения оппонента.
254 PR
 
23.10.19
16:20
(245) Во-первых, я не сказал, что это лучше, я просто объяснил суть на пальцах, то, про что ты в (212) написал, что это очень долго, сложно и муторно
Как видишь, можно и просто объяснить, за полминуты
Во-вторых, не придется, если не решать задачу втупую, а, например, заточить функцию не на тип тип документа, а на, к примеру, группу типов, а в новом типе документов сделать метод, возвращающий эту группу
255 Bro
 
23.10.19
16:23
256 Ник080808
 
23.10.19
16:23
(253) +100500(251) откуда ты знаешь что они постоянно пишут на 1с? даже если они пишут на 1с это не говорит о их правоте в отношении 1с))) тут выше товарищ твой писал что вы термины согласовать не можете, потому что каждый по своему понимает и каждому по своему привычно, так вас пять человек, а в 1с десятки тысяч с разных профессий и разным мировоззрением. Знаешь сколько на мисте нытиков бывших джавистов/сишарповцев было орущих что 1с говно потому что нет ооп и строгой типизации? просто их так учили, что ооп - это основа мира, строгая типизация это основа основ, они не могут кодить с динамической типизацией, потому что узкое мышление. они пять лет в универе осваивали ооп, а пришли в реальный мир и оказалось что пять лет они фигней маялись)
257 Ник080808
 
23.10.19
16:28
(255) этот же чувак в другой ветке бросает ссылку на вашу статью как пример того, что являет собой платформа)))))
258 НиколаевГ
 
23.10.19
16:31
(241) Ты мне тут 1С-ом не тычь :)). Я авторов услышать хочу, чтобы они так мне объяснили, чтобы потом это объяснение кому угодно понятно стало :))
259 Bro
 
23.10.19
16:33
(257) прикольно. Только я не понял в каком контексте он ссылку на эту статью кинул (то есть зачем)
260 Ник080808
 
23.10.19
16:34
(259) вот и я о том, что он о 1с знает столько же сколько и вы)
261 Smile 8D
 
23.10.19
16:35
(255) Не совсем понял для чего ссылка, но по комментариям видно, что человек крайне негативно относится к 1С (да и вообще ко многим вещам, судя по комментариям). Я могу только пожалеть его, если он считает 1С "ущербным" языком (прямая цитата) и продолжает с ним работать. Ушел бы давно уже в нормальные языки, не трепал себе нервы)
Ну а как программист вы должны владеть базовой логикой и понимать, что в ответ на мое "как вы определяете, что они постоянно пишут на 1С?" кидать частный пример нелогично. Частные примеры не являются доказательством общего случая. Думаю, что всем очевидно, что вы никак не можете определить по комментариям на Хабре уровень профессионализма в 1С, про это и была речь в моем комментарии.
262 НиколаевГ
 
23.10.19
16:36
(259) (261) Идите в срачеветку, не мешайте полиморфизм обсуждать.
263 _DAle_
 
23.10.19
16:36
(252) Да, сейчас попробую набросать пример. Предположим, что у нас есть абстрактный класс Document.

CLASS ABSTRACT Document;

Абстрактный класс от обычных классов отличает то, что нельзя создать объект этого класса. Более того, в lsfusion это единственное отличие между абстрактным и конкретным классом. Если говорить о практике применения то...

1. Например, у всех наших документов должен быть идентификатор. Создаем соответствующее свойство:

id(Document d) = DATA LONG (Document);

В это свойство аргументом можно будет передать любой из объектов классов-наследников Document. То есть у любого объекта-документа будет идентификатор.

2. Мы хотим создать свойство документа, которое будет по-разному определяться в классах-наследниках, но иметь единый синтаксис обращения к нему, при котором нужный метод будет выбираться в рантайме в зависимости от реального класса объекта (то есть тот самый subtype-полиморфизм). Пускай это будет некое имя документа. Можно создать абстрактное свойство:

name = ABSTRACT STRING (Document);

Затем в каком-нибудь другом модуле мы определяем класс приходного документа:

CLASS IncomeDocument : Document;
264 HeKrendel
 
23.10.19
16:37
(260) Ты  только что раскрыл порочный круг
265 Smile 8D
 
23.10.19
16:38
(262) Ну так человек первый начал в специализированной ветке делиться своими впечатлениями об 1С и вбрасывать "факты", которые очевидно противоречат логике. Или расчет и был на то, что он под защитой темы? :)
266 _DAle_
 
23.10.19
16:38
(263) Ну и как теперь отредактировать... Вот поэтому я и не хочу писать длинные ответы на мисте.
267 НиколаевГ
 
23.10.19
16:39
(265) Не надо уподобляться, будь выше этого.
268 НиколаевГ
 
23.10.19
16:40
(266) А и не надо, делай ответы на своём сайте, а сюда ссылку кидай :)
269 HeKrendel
 
23.10.19
16:40
(263) И чем вы отличаетесь в этом конкретном примере от 1С?
270 Пузан
 
23.10.19
16:41
(263) Ага т.е. IN base  в абстрактном классе не нужен.
271 НиколаевГ
 
23.10.19
16:42
(266) Кстати, неплохо получается объяснять, сразу ясны аналогии и можно задать уточняющие вопросы по теме без всякого флуда.
272 Bro
 
23.10.19
16:42
(260) Еще раз может сложиться мнение что я считаю что платформа «плохая» но нет, я очень люблю платформу, она меня как минимум кормит и я знаю как быстро на ней можно решать любые задачи бизнеса

Это про 1с этого автора, но все ухожу в другую ветку.
273 Пузан
 
23.10.19
16:42
(263) Хотя не, не понял разве так нельзя абстрактный класс объявить:
CLASS ABSTRACT Document;
DateDoc 'Дата' = DATA DATETIME (Document) IN base;
NomDoc 'Номер' = DATA NUMERIC[15, 0] (Document) IN base;
274 Ник080808
 
23.10.19
16:43
(272) ага. это типа - вася говорит что его жена жирная и тупая, но он ее то любит ведь она мать его детей)))
275 НиколаевГ
 
23.10.19
16:45
(273) Они не от классов танцуют, а от "свойств".
276 Пузан
 
23.10.19
16:47
(275) Тем не менее в их же примере для обычного класса именно так выглядит объявление.
277 Пузан
 
23.10.19
16:49
Т.е. класс объявляют без всего, а потом свойства объявляют именно как в (273), однако в (263) другой способ объявления свойства. Так то я начинаю по не многу въезжать в синтаксис, но почему такая разница на похожих примерах?
278 _DAle_
 
23.10.19
16:52
(263) Продолжу

Определяем его name как первичное хранимое в базе свойство:

name = DATA STRING (IncomeDocument);

и расширяем наше абстрактное базовое свойство:

name(IncomeDocument d) += name(d);

Затем в другом модуле объявляем класс расходного документа:

CLASS OutcomeDocument : Document;

Допустим, что его имя всегда вычисляется по какой-то логике:

name(OutcomeDocument d) = name(header(d)) + someInfo(d);  

И также расширяем абстрактное свойство:

name(OutcomeDocument d) += name(d);

Теперь в коде, где используется абстрактный name, например

showDocumentName(Document d) { MESSAGE name(d); }

будет при передаче туда приходного документа браться имя из базы, для расходного будет вычисляться по заданной нами логике.
279 PR
 
23.10.19
16:55
(263) В 1С такое же будет, если в менедежере каждого документа сделать такой метод
280 Пузан
 
23.10.19
16:55
(278) Не, ты слишком вглубь пошел, пока задача прозаичная. Объявить абстрактный класс и его свойства, так чтобы само собой объект такого класса быть создан не мог, а наследники таки свойства от него получили. Почему (273) не канает?
281 _DAle_
 
23.10.19
16:59
(280) Ну я просто попытался описать самую простую логику, где типично использование абстрактного класса.

(273) Канает, я вроде бы в (263) про это вверху и написал
282 _DAle_
 
23.10.19
17:02
(270) IN base; - это вообще лишнее в этих примерах, это добавление свойства в группу свойств. В данном контексте это можно выбросить из кода.
283 Пузан
 
23.10.19
17:06
(282) Зачем оно тогда там? Сбивает с толку, я подумал что это значит, что это свойство хранится в базе. В примерах каждая буква должна быть описана, че она там делает, а такое всякое только сбивает с толку.
284 _DAle_
 
23.10.19
17:08
(283) А откуда этот код? :)
285 _DAle_
 
23.10.19
17:11
(254) Не соглашусь. Это не объяснение того, что такое multiple dispatch. Это показ функциональности, где руками делается single dispatch.
286 НиколаевГ
 
23.10.19
17:12
(285) Тогда точно придется объяснить :)
287 НиколаевГ
 
23.10.19
17:13
(278) Вот, теперь это в FAQ на сайт, и, если что, ссылку джунам кидать.
288 Пузан
 
23.10.19
17:14
Ребята, описалово вообще никакое, примеры вводят в заблуждение, структуры никакой. Надо кучу времени потратить чтобы понять че к чему. Я уже час не могу элементарно базовые классы сделать, оказывается если написать NUMERIC[10,2] и NUMERIC[10, 2] - это сильно не одно и то же, во втором случае будет ошибка, потому что среда разработки ничего не знает пробелах, табах, переводах строк и прочих разделителях, которые не в синтаксисе должны игнорироваться.
289 Пузан
 
23.10.19
17:14
290 НиколаевГ
 
23.10.19
17:17
(288) Да, именно об этом я неоднократно говорил выше. Но они почему-то считают, что сейчас для них важнее битва с 1С...
291 _DAle_
 
23.10.19
17:23
(289) А этот пример.. там, возможно, этот IN base; для чего-то нужен. Почему-то люди, которые писали этот пример, решили не рассказывать, что это за base такой. Я не знаю почему, нужно, конечно, эти примеры улучшать. Я думал вы смотрите документацию по языку.

(288) К сожалению этот NUMERIC[10,2] - это единая лексема, там не может быть пробелов.
292 Пузан
 
23.10.19
17:26
Даже в примерах для начинающих по любому ЯП даже в Hello world! описывается каждое слово, зачем оно там, для чего и какой эффект от него. У вас ...IN base…, че это и за на фига и 99% разработчиков имеющих дело с СУБД, а с ним мы дело имеем в данном случае, поймут однозначно, что это вроде как будем хранить в БД, потому что логично что могут быть свойства, которые в БД не хранятся.
293 _DAle_
 
23.10.19
17:27
(288) И еще заходите к нам в slack: slack.lsfusion.org, мы там отвечаем на вопросы, там они хоть не потеряются. И на slack у нас куда больший приоритет.
294 НиколаевГ
 
23.10.19
17:28
(291) Документацию Бро писал? Тогда, это очень плохая документация :((
295 Пузан
 
23.10.19
17:29
(291) Ты же наверное на программиста учился, помнишь примеры первые с приветом миру? Там каждая лексема описывалась на программу из пяток строк. А тут отмазка как в детском саду: "Да фиг знает". Ну и поискал я что такое IN в вашей документации - некая группировка. А за нахрена одна, нигде не написано. :)
296 _DAle_
 
23.10.19
17:29
(294) Коллективное творчество.
297 НиколаевГ
 
23.10.19
17:29
(293) Слак это хорошо... Но не всем пока ясно, что вообще стоит с фузиной заморачиваться, поэтому, здесь то-же отвечайте, да и гарантировано больше людей увидит.
298 НиколаевГ
 
23.10.19
17:31
(296) Вы его, пожалуйста, из написания документации исключите. В этом от него вреда больше, чем пользы. Что называется, объяснять доходчиво и внятно ему "не дано".
299 _DAle_
 
23.10.19
17:35
(297) Ну как бы, миста - это же все-таки временно, здесь мы в любом случае чужаки. Не будем же мы сюда заходить постоянно каждый день.
300 Bro
 
23.10.19
17:35
(298) зависит от того какую часть вы читаете. парадигму язык и примеры писали разные люди для разных целей. И 1сцы все же не фокус группа. :)
301 Пузан
 
23.10.19
17:39
(300) Примеры должны быть сквозные и понятные. У меня с MSDN почему-то не было никаких проблем, даже когда она была только на англицком. У вас скачешь как блоха туда сюда и нифига целостной картинки не складывается. Так захрена нужно ваше IN? Ок, оно группирует свойства. Где потом это используется и с какой целью?
302 _DAle_
 
23.10.19
17:40
303 Пузан
 
23.10.19
17:40
(300) Если это IN есть в примере, значит оно кому то нужно? Где описалово? Нету? Уберите из этого примера. Для IN напишите отдельный пример.
304 _DAle_
 
23.10.19
17:42
(300) Кстати, видишь, как сработало переименование baseGroup в base? Люди думают, что IN base - это "в базе" :)
305 Пузан
 
23.10.19
17:43
(302) Прикольно. Пример в логике предметной области и IN там же кратко описывается, а использование совсем в другом месте. Где ссылка из одного места в другое? Я конечно буду дальше изучать, но мало того что сам подход такое не ординарный, так еще и описалово никакое.
306 Пузан
 
23.10.19
17:45
(304) Люди, кстати, нормально думают, в контексте. А вот примеры без объяснений чего и как и потом глумление над непонятливыми - это вам в минус большой.
307 НиколаевГ
 
23.10.19
17:45
(300) А кто ещё то? Люди без ИТ-бекграунда вообще не поймут, а ИТ-шники, которые вот так сходу могут понять - изучать фузину не будут, нет там для них денег.
308 _DAle_
 
23.10.19
17:47
(306) Вы меня, видимо, неправильно поняли. Я если и глумился над чем-нибудь в (304), то над нашим неймингом, уж точно не над людьми, читающими код.
309 НиколаевГ
 
23.10.19
17:47
(306) А это не глумление, они просто не понимают, как это всё правильно делается. Типичные айтишники-гики.
310 Bro
 
23.10.19
17:49
(308) ну там скорее вопрос к примерам написать код и не сделать пояснение странно. Хотя справедливости ради в доках что по 1с что по аксапте такое сплошь и рядом, но зачем на них равняться.
311 Пузан
 
23.10.19
17:50
(309) Думаешь фузина это такой себе Линух в противостоянии Винде? Красноглазики против виндовых юзверей? Любое действие скриптом против двойного щелчка мыши? :)
312 НиколаевГ
 
23.10.19
17:53
(310) Зачем вы себя с другими сравниваете? Чтобы самим нормально не делать, что-ли, раз другие не сделали?
313 _DAle_
 
23.10.19
17:55
(295) Кстати, меня учили не так. Мне давали какой-то код примитивной программы на паскале (что-то вроде прочитать 10 чисел, посчитать сумму, вывести сумму) с минимумом комментариев, а потом говорили: "теперь напишите-ка, такое же, но чтобы она не сумму выводила, а произведение". И 25 задач за четверть в таком духе, короче, как котят в воду, кто-то выплыл (3 человека из 30). Я не говорю, что это было правильное обучение. Просто история из жизни :)
314 Bro
 
23.10.19
17:55
(311) ну вот кстати, что что а вот проектировать Майкрософт умеет. Многие их продукты намерено сделаны чуть бедненько зато чистенько. То есть хоть какое то наличие архитекторов заметно, тогда как Линукс очевидный плод коллективного разума. Поэтомк ваша аналогия только если текстовое и визуальное программирование сравнивать. В остальном скорее наоборот.
315 Пузан
 
23.10.19
17:55
(310) А надо не на чужие ошибки указывать, а со своими разбираться. 1С мне очень легко зашел, особенно v8, все-таки профильное образование ПОВТ и АСУ. У вас пока много не понятного, хотя и потратил только часа четыре. Но документация реально местами сильно сбивает с толку. Ну и мне некоторые вещи вводят в ступор такие как пробел в параметрах намерика - это же ну совсем уже. :)
316 НиколаевГ
 
23.10.19
17:56
(311) Масштабы не те. Но гики от этого гиками быть не перестают
317 НиколаевГ
 
23.10.19
17:58
(313) Если бы мы не были 1С-никами, ты, может быть, был бы прав. Но, у нас, 1С-ников, нет необходимости изучать фузину, а просто некий интерес, который, в случае больших затруднений, очень быстро пропадёт.
318 Bro
 
23.10.19
18:05
(317) ну так вам же и сказали вы не фокус группа :) 1с чисто российское и бразильское явление. Тут скорее спортивный интерес.
319 НиколаевГ
 
23.10.19
18:08
(318) Так а кто фокус-группа то, по-вашему?
320 _DAle_
 
23.10.19
18:08
(317) Я специально подчеркнул, что это просто история. Я бы в ретроспективе не хотел бы, чтобы меня учили именно так, это было жутко неэффективно и нудно.
321 Bro
 
23.10.19
18:21
(319) ну мировой рынок который куда более разнороден, и не привык к визуальному программированию к примеру (а точнее считает его неудобным)
322 НиколаевГ
 
23.10.19
18:24
(321) Я понимаю, что вам нравится мечтать, но реальные проблемы, на которые мы указываем, надо исправлять.
323 НиколаевГ
 
23.10.19
18:26
(320) А я вот так 1С изучал - взял список задач на сертификацию "специалист по платформе", и стал их решать. Прорешал, получил сертификат - и работать на реальное производство пошёл...
324 Bro
 
23.10.19
18:27
(322) поверьте мы их помечаем, но и про фордовское "если бы я спросил людей, что им нужно, они бы ответили - более быстрая лошадь" тоже не забываем.
325 НиколаевГ
 
23.10.19
18:34
(324) С того времени прошло 100 лет. И, знаешь, мир сильно изменился...
326 pechkin
 
23.10.19
18:39
(325) только внешне. суть осталась  та же
327 НиколаевГ
 
23.10.19
18:43
(326) Вот точно не для этой темы обсуждать такой вопрос. Вкратце - совсем не согласен с данным тезисом.
328 Ещё1
 
24.10.19
20:46
Добавляю на форму кнопку в другом модуле, расширяя её. При этом хочу чтобы новая кнопка легла перед кнопкой "Добавить" под списком. Делаю так:

В главном модуле:
FORM ordersForm 'Заказы покупателей'
  OBJECTS o = Order
  ...
  PROPERTIES(o) NEWSESSION NEWEDIT, EDIT, DELETE
;

В модуле расширения:
EXTEND FORM ordersForm
  PROPERTIES(o) setStatusReadyToSend TOOLBAR
;

DESIGN orderForm {
  MOVE PROPERTY(setStatusReadyToSend(o)) BEFORE PROPERTY(NEWEDIT(o))
}

Компилятор ругается: Exception while starting logics instance: [error]:    Exchange:30:58 no viable alternative at input 'NEWEDIT'

Вроде смотрел по описанию языка и старался делать также. В демке ERP похожего примера не нашёл. В чём ошибка?
329 Злопчинский
 
24.10.19
20:54
(230) "Сейчас вот обновил модули lsFusion до последней версии 3 beta, поработал по пару часиков каждый день, и вроде уже начинает нравиться."
- ясен пень, поприятнее стало. если бы 1Сники не пинали пенделями - то хз через сколько сделали бы.

в новом мне не нравитяс заголовки табличных форм (табличная часть документа) - шапка ТЧ очень высокая и никак не выделена визуально. очень неудобно, я бы сделал поменьше высотой и как-то выделил едино-стилистически
330 Злопчинский
 
24.10.19
20:54
В зарубе - есть список документов поступления.
какая разница между кнопками "ОК" и "Закрыть" - на списке документов?
331 Злопчинский
 
24.10.19
20:55
заголовки ТЧ - хотя бы болдом выделили. или синим шрифтом.
короче - очень некузяво, сделайте как-то получше.
332 Злопчинский
 
24.10.19
20:58
Список документов. Кнопка "обновить список" - она почему вынесена ИЗ "контекста" списка, то есть из "контейнера" (он даже рамочкой обрисован) где выполняются действия над списком документов (удаление/редактирвоание/отбор? почему "обновить" рядом с закрыть/ОК?
аболютно имхо нелогично.
333 CrushBy
 
24.10.19
21:00
(328) Во-первых, нету такого действия NEWEDIT. Есть только NEW.
Во-вторых, в MOVE обязательно указывать в какой контейнер поместить. Вот тут проще всего посмотреть :
https://clip2net.com/s/44fW0ql
То есть нужно :
TOOLBAR(i) {
    MOVE ...
}
334 Злопчинский
 
24.10.19
21:01
Список документов - на пиктограммах слева внизу под списком - подсказки на кнопках НАХРЕН В ДУГУ НЕ РАБОТАЮТ (шозабля?). В опере - навел мышку - подсказка проморгнула и все. даже не успеешь прочитать что/длячего.

у вас там как-то тетсируется что-то хотя бы в части UI?
335 Злопчинский
 
24.10.19
21:07
(на примере зарубы).
Открыл текущие остатки.
нижний правый фрейм приходится кроллить горизонтально. херово. настроить свою пользовтаельскую ширину колонок (или сделать двойную строку) - что, совсем никаки???

и если я настроил форму - подогнал ширину столбцов под мне нуджное мышкой - хреняк, закрыл форму, открыл заново - ээээ.. как бы хотелось видеть в том варианте как я натсриавал по ширине колонок... а то как-то сильно уморочно каждый раз. Когда фес можно подстроить под специфику монитора/пользователя - это хорошо, нет - это плохо...
336 Злопчинский
 
24.10.19
21:14
на зарубном примере хотя бы - сделайте на главноем окне в верхнем главном еню "кнопку" типа "Гид по клаишам" - жмакнуть и откроется краткий хелп по приемам нафигации - описание какие клавиши/мышки для типовых действий в формах/списках. А то я вот тыкаю мышкой привычно - какие-то неожиданные для меня "эффекты получаю".
типа гид:
список:
- добавит элемент в список - кнопка "Добавить" внизу справа списка
- редактировать элемент списка -кнопка "Редактировать" внизу справа списка
- одинарный жмак мышью на ячейке списка - тотот
двойной жмак на ячейке списка - тото..
.
как бы будет тестерам (нефузиновцам) гораздо легче привыкнуть/понять...
337 Ещё1
 
24.10.19
21:14
(333) Сделано!
DESIGN ordersForm {
  TOOLBAR(o) {
    MOVE PROPERTY(setStatusReadyToSend(o)) FIRST {
      background = #FF00FF;
    }
  }
}

А насчёт NEWEDIT вы неправы, есть оно: https://paste.pics/15c2a85e9e96d240a7cebe59b493bb7f
338 Ещё1
 
24.10.19
21:20
(329) Я тоже не даю им расслабиться, и здесь, и в Slack. Но пока на дизайн меньше смотрю, а больше на юзабельность и ошибки/недоработки. Дизайн то они переделают, раз собрались на React мигрировать.
339 Ещё1
 
24.10.19
21:28
(334) Если у вас Опера - проверьте версию и обновите до актуальной (64.0.3417.73). Я ловил некоторые глюки в старой версии, типа открывалась форма документа пустой. Обновился - полёт нормальный.
340 Злопчинский
 
24.10.19
21:44
(339) как бы - свежая стоит.
траблы с подсказакми на кнопках.
341 Злопчинский
 
24.10.19
21:45
блин, расконнектился.
какой логин/пароль на зарубу?
342 Злопчинский
 
24.10.19
21:46
(337) "..А насчёт NEWEDIT.." - спожники без сапог? ;-)
343 Злопчинский
 
24.10.19
22:07
(офф) глянул сейчас в конфигураторе УНФ (на которую много ругается за огразчность и бедность) -порядка 250 справочников, 500 перечислений... дальше побоялся...
344 Flyd-s
 
24.10.19
22:09
(341), у фузины нет логина и пароля на зарубу. В демо ERP guest guest. В базу PR создай нового пользователя если забыл
345 Ещё1
 
24.10.19
22:14
(340) Да, у меня тоже было, мельтешение подсказок. Пока не словишь нужную позицию курсора, чтобы не мельтешила. Сейчас всё OK.
346 Злопчинский
 
24.10.19
22:32
(345) Хрен там. Прорисовка форм вроде ок.
подсказки на кнопках - промаргивает, не видно
347 Злопчинский
 
24.10.19
22:34
(344) вот еще косячок. зарубное задание - есть возможность "выйти". после выхода - активизиурется адрес в строке ....mуcompany\login - как результат - вход де факто "заблокирован". пока не уберешь логин... если логин не нужен - тогда на экране логина/пароля ничего не заполнять и жмакаем войти -должно пустить. однако - хрен вам.
348 Ещё1
 
24.10.19
22:42
(346) У тебя Opera 64.0.3417.73 ? Если такая же, и всё равно ошибка, тогда не знаю.
(347) Попробуй anonymous без пароля. Этот пользователь у них по умолчанию добавляется всегда в пустую базу.
349 Ещё1
 
24.10.19
22:44
Снова вопрос. Делаю экспорт в JSON объекта Order. Потом этот файл будет загружен в 1С. Мне для обратной связи нужен id выгружаемых объектов. У каждого бизнес-объекта есть первичный ключ, как его выгрузить в JSON с остальными данными?
350 _DAle_
 
24.10.19
23:04
(328) >MOVE PROPERTY(setStatusReadyToSend(o)) BEFORE PROPERTY(NEWEDIT(o))

Сейчас для того, чтобы обращаться к специальным свойствам на форме после их добавления нужно им задать алиас. То есть в месте добавления на форму написать newEdit=NEWEDIT и в дизайне использовать BEFORE PROPERTY(newEdit).
351 _DAle_
 
24.10.19
23:11
(334) Вот эти кнопки? https://ibb.co/WP1p1bx
352 Ещё1
 
24.10.19
23:13
(350) Пробовал так, почему-то не прокатило. Но ладно, сделал по-другому. (337)

И ещё 1 вопрос: я вроде разобрался как сверстать из объектов JSON, и как сохранить текст на диск. Но как из свёрстанного текста получить текст для сохранения в файл?

      EXPORT exportOrder OBJECTS o = order JSON;
      SHOW exportOrder;
      WRITE exportOrder TO exchangeFolder() + 'order ' + date(order);
353 _DAle_
 
24.10.19
23:13
(336) Да, такое бы не помешало
354 _DAle_
 
24.10.19
23:18
(349) VALUE(o) - описывается здесь https://documentation.lsfusion.org/pages/viewpage.action?pageId=1573071
355 _DAle_
 
24.10.19
23:24
(352) Не совсем понял вопрос к сожалению. Спрашивается, как записать полученный json в файл на диске?
356 Злопчинский
 
24.10.19
23:38
(348) да, последняя опера.
357 Злопчинский
 
24.10.19
23:39
(351) угу. что значит Они, что значит ТРУЕ. То есть - ДА
358 Злопчинский
 
24.10.19
23:41
(353) да, было бы хорошо. и про поля в шапках - поля вводс примитивных типов, поля ввода ссылочных типов итд.
ГИД.
359 Злопчинский
 
24.10.19
23:42
(355) не, как в джсоне прописать внутренний системный ИД, по которому при обратных обменах из 1С в фузину будет идентифицироваться фузиновский прикладной бизнес-обьект.
360 Ещё1
 
24.10.19
23:43
(354) Точно! Я помнил про VALUE, но не подобрал правильный синтаксис. Вот так прошло:
  PROPERTIES(o) 'id' = VALUE, date, amount, ...

(355) Да. Вот задача: сверстать JSON из объектов, и сохранить на Windows-сервер в указанную папку с указанным именем. Делаю:

      EXPORT exportOrder OBJECTS o = order JSON;
      fileName() <- exchangeFolder() + '_out/order ' + replace(STRING(date(order)), ':', '-');
      WRITE exportOrder TO fileName();

Так ошибка. Честно говоря, что-то у меня даже обычную строку не получается сохранить.
      WRITE 'My Text' TO 'd:/lsFusion/_out/myfile.txt';
Даёт AssertionError NULL.
361 _DAle_
 
24.10.19
23:47
(360) EXPORT exportOrder OBJECTS o = order JSON;
В рeзультате выполнения EXPORT создается объект класса FILE, если не указано, куда его записать, он записывается в свойство System.exportFile. Теперь нужно вызвать WRITE
WRITE exportFile() TO fileName();
362 _DAle_
 
24.10.19
23:48
(360) В WRITE не строчка же передается, а FILE
363 Злопчинский
 
24.10.19
23:54
(361) "В рeзультате выполнения EXPORT создается объект класса FILE,"
то есть выполнения EXPORT - ВСЕГДА создается класс FILE?
откуда это следует/известно?
364 _DAle_
 
24.10.19
23:58
(363) Да вроде как из документации по оператору EXPORT. FILE - это не файл на диске, это будет объект нашего класса FILE, с которым потом можно что-нибудь сделать, например куда-нибудь записать инструкцией WRITE, как в примере выше.
365 Ещё1
 
25.10.19
00:00
(361) Спасибо, у вас получается объяснять!
JSON есть и записан в файл на диске. Но в нём вместо нормального имени для идентификатора класса стоит так:
"_OBJVALUE_Exchange_exportOrder_o":9108
А я ведь указывал в FORM exportOrder :
PROPERTIES(o) 'id' = VALUE
То есть конкретно задал как назвать это свойство при выгрузке ("id").
366 _DAle_
 
25.10.19
00:04
(365) алиас - это id без кавычек. 'id' в кавычках - это знасение текстового заголовка по умолчанию
367 Ещё1
 
25.10.19
00:05
(366) Да, уже хотел написать, что сам разобрался. :)
368 Злопчинский
 
25.10.19
00:05
(365) офф: закон больших чисел. в большой толпе неадекватов найдется кто-то адекватный ;-)
369 Злопчинский
 
25.10.19
00:06
(366) хм.. то есть VALUE - это некий аналог 1Сного Обьект.Ссылка ..?
370 Ещё1
 
25.10.19
00:09
(369) Это уникальный идентификатор объекта в БД. Целое число. Автоматически добавляется для любого бизнес-объекта в Фузине.
371 Злопчинский
 
25.10.19
00:13
(370) тогда в обмены надо пихать вдобавок и ИД САМОЙ БАЗЫ. иначе по ошибке затняут не в ту базу и жопа получится. с Гуидами такая вероятность намного меньше.
(?)
372 Ещё1
 
25.10.19
00:26
(371) Да, ключ уникален только внутри таблицы. (А может там сквозная нумерация по всем классам объектов в базе? Не хочу врать, может фузиновцы ответят).
И у них VALUE типа BigInt = 8 байт. А GUID кажись 16 байт. Учитывая, что он добавляется в каждую запись каждой таблицы, то как бы экономия памяти + скорость.
373 Ник080808
 
25.10.19
00:27
(366) почему нет номера строки в документе? почему в фильтрах пристуствуют - удалить\обавить редактировать?
374 _DAle_
 
25.10.19
00:29
(372) Сквозная
375 Злопчинский
 
25.10.19
00:30
(373) ну, по хорошему номер строки - сущность избыточная для набора равноправных записей.
если номер строки рассматривать как ИД для связи с внешними информационными системами (например печатная форма накладной) - то да, его не хватает.
376 Ещё1
 
25.10.19
00:30
(374) Ага, это хорошо. Значит, теоретически для нахождения бизнес-объекта в БД можно обойтись без его класса, только id.
377 Злопчинский
 
25.10.19
00:32
с этой точки зреняи фузина позволяет гибчее строить, но гораздо больше времени уделять продумыванию (ничто не дается даром). не сделал ты для документа ключ по которому можно сортировать по хронологии создания или учета документа - и все, жопа. забодаешься искать документ в неупорядоченной последовательности (журнале)
378 Злопчинский
 
25.10.19
00:33
(376) с другой стороны - это удлиняет поиск. придется искать номенклатуру по 30 Гб, вместа поиска в однйо табличке на 3МБ. ну да, индекс... быстро вроде... Но.. курочка по зернышку...
379 _DAle_
 
25.10.19
00:33
(373) Можете подробнее про фильтры? Где именно "удалить, добавить, редактировать"? Кнопки добавить, редактировать, удалить обычно в правом нижнем углу формы, относится это к объектам, а не к фильтрам.
380 Ещё1
 
25.10.19
00:35
(375) Я б сказал, необязателен. Но в табличных частях документов крайне желателен, и на экране, и при печати. Его то и добавить несложно. Причём можно сохранять изначальную нумерацию после удаления строк из середины списка. А можно сделать перенумерацию при сохранении, после всех удалений и сортировок. Как в ТЗ напишут.
381 Ещё1
 
25.10.19
00:38
(377) ключ по хронологии создания - это тот самый VALUE, присутствующий изначально во всех объектах.
382 Злопчинский
 
25.10.19
00:41
я вот смотрю. фузина очень хорошо (имхо) подошла бы для создания WMS. Правда мне ничего непонятно, насколько богаты конструкции языка для всяких вычислительных действий. с учетом что интерактивная работа с WMS (бегунки и операторы) в основном нетребовательна к вычислениям в оперативном режиме, а там где это надо массово вычислять - есть некие ресурсы времени (и вычисляется все как я понял на самой СУБД средствами субд вся математика делается, то есть даже 123/12 - вычисляет на стороне БД) - то должно получиться весьма неплохо. И интерфейсный подход хорошо сюда кладется. Но непонятно, что WMS это по большей части бешеные обьемы умножения/сложения/вычитания/обединения/итд куч таблиц - насколько хорошо это получается без возможности тонокой настройки на уровне олптимизации запросов к базе.

так что если фузиновцы - соберетесь пилить WMS (нормальную вмс) - как белорус белорусам - зовите, поконсультрую (хоть даже с выездами, без проблем) за мзду.
383 Злопчинский
 
25.10.19
00:43
(379) я выше писал - почему у вас кнопка "обновить" (список) - лежит возле кнопок закрыть/ОК, а не в контенйере где кнопки/команды работы со списком?
.
и какая разница в списках между кнопками "ОК" и "ЗАкрыть"..?
384 Ещё1
 
25.10.19
00:44
(378) Вот этот момент не понял. И в Фузине VALUE, и в 1С GUID уникальны в пределах БД. Только 1С ещё учитывает возможность кластерных решений с несколькими базами. Не знаю, как это Фузина разруливает, и возможно ли, но для меня это неактуально (кластера БД). Зато в Фузине VALUE мы знаем точно, что инкрементируемый, а значит более новые записи ВСЕГДА имеют большее число в VALUE. Т.е. этот идентификатор можно использовать не только как ключ, но и для сортировки по времени создания объекта БД.
385 Злопчинский
 
25.10.19
00:45
(381) тут еще хоть убабахайся, в бизнес-задачах нужен будет ключ для упорядочивания по хронологии учета.
(тут фузиновцы если бы хорошо подумали, могли бы утереть 1су, реализовав схему беззаднепроходной работы, то есть имея период регистрации и период учета ...)
386 Злопчинский
 
25.10.19
00:48
(380) угу. у меня например в заявках напряду со служебным номеромстроки (штатный в 77, просто номер строки по порядку в текущем представлении ТЧ), есть ОПС (оригинальный порядок строк) по данным покупателя. Потому что некоторым надо выплевывать не просто данные по товару, а именно в строгой последовтельности ИХ нумерации исходных строк ихневых. и как раз тут и удаленные строки с пропусками в нумерации ОПС и - внезапно - позвонили по ТЛФ и срочно надо добавить еще два товара! вопрсо встречный - а ккие номера строк это будут?! - повергает покупателя в ступор ;-).
387 _DAle_
 
25.10.19
00:48
(384) Я сейчас не совсем уверен, в том что скажу, но все же у нас явно нигде не гаранируется, что объект с большим идентификатором был создан позже, чем объект с меньшим. То есть оно то так, конечено, будет в большинстве случаев, но я бы не строил на этом серьезную логику, где это важно. Если я не прав, надеюсь, меня поправят.
388 _DAle_
 
25.10.19
00:49
(383) >я выше писал - почему у вас кнопка "обновить" (список) - лежит возле кнопок закрыть/ОК, а не в контенйере где кнопки/команды работы со списком?

Видимо, потому что она относится ко всей форме, а не к "списку".
389 Злопчинский
 
25.10.19
00:50
(384) "и в 1С GUID уникальны в пределах БД" - кто тебе такое сказал? в типовых - может быть. но это совсем необязательно. (может на меня помрочение нашло)
390 Злопчинский
 
25.10.19
00:52
(388) "Видимо, потому что она относится ко всей форме, а не к "списку"."
- хм... видимо да. так как у вас один и тот же обьект (и не только строки ТЧ документа нпример но и шапку документа) могут одновременно реадктировать туеву хучу людей. То да, такая логика имеет смысл. непривычно просто (в 1С по идее тожне можно аналогично перечитатать весь обьект/форму, но обычно этого не делают для типовых решений)
391 Ещё1
 
25.10.19
00:54
(387) Я это почерпнул где-то из примера кода для регистров накопления, который приводил Bro или Краш. В документации этого нет. С другой стороны, 1С тоже не гарантирует: "Хотя уникальность каждого отдельного GUID не гарантируется, общее количество уникальных ключей настолько велико (2^128 или 3,4028*10^38), что вероятность того, что в мире будут независимо сгенерированы два совпадающих ключа, крайне мала."
392 Злопчинский
 
25.10.19
00:55
(387) ИД у вас когда генерится? в момент создания обьекта или в момент записи?
если в момент создания - то однозначно гарантий вообще никаких нет.
если в момент записи - то тут я не спец, определяется наверно всякими уровнями транзакций и блокировок. и в общем случае - тоже нет гарантий.
393 _DAle_
 
25.10.19
00:55
(390) Не, я не это имел ввиду. Просто, например, если на форме несколько таблиц, то этой кнопкой обновляются все.
394 Злопчинский
 
25.10.19
00:59
(393) а не таблицы (поля шапки документа например на однйо форме с таблицей) - они как обновляются?
395 _DAle_
 
25.10.19
01:01
(392) Я бы представил гипотетическую ситуацию, когда кто-нибудь каким-то образом похерил данные в базе, и старые объекты пришлось пересоздать или копировать, id будут новые, но вряд ли это логически тогда будет верным. А так в идеальной ситуации, без всяких проблем, они будут идти в порядке времени создания.

(394) Той же кнопкой.
396 Ещё1
 
25.10.19
01:01
(389) Лучше я не буду лезть в глубь, а дам ссылку на описание GUID.  http://catalog.mista.ru/public/635159/
398 Злопчинский
 
25.10.19
01:44
(395) "той же кнопкой"
я ничего (пока и скорее всего навсегда уже ;-) не рублю в ООП и прочих ..ия..изм..ие.
допустим
- РазрабА в форме1 опеделил класс/обьект "ДокументА"(хранится в базе) как совокупность неких реквизитов.
- РазрабБ в форме2 унаследовал "ДокументА" и доопределил его как ДокументАа=(ДокументА,ТабличнаяЧасть)(хранится в базе) и установил "связь" что при изменении реквизита шапки Реквизит1 пересчитываются некие реквизиты ТабличнаяЧасть.
.
?55: если пользовательА в форме1 ДокументА изменил Реквизит1 - ТабличнаяЧасть для ДоекументАа в базе пересчитается? (тут я хз)

?66: если пользовательБ в форме2 ДокументАа изменил Реквизит1 - ТабличнаяЧасть для ДоекументАа в базе пересчиталась, Реквизит1 в ДокументА - тоже изменился (полагаю что да).

?77: в какой момент пересчитанная табличнаяЧасть сохраняется в базе? в момент закрытия/записи формы документа? или непосредственно сразу после пересчета при открытой форме документа?

?88: возможна ли такая ситуация при конкруентной работе разных пользователей с формой1 и формой2 (или вообще с пофиг какими формами, главное что с одним и тем же документом) - что, например. в шапке будет указана ставка НДС20%, а в ТЧ - расчет сделан по 10%).
т.е. является ли документ как совокупность реквизитов гапки и ТЧ документа неделимым и цельным обьектом с точки зрения бизнес-логики? или потенцуиально возможна ситуация когда шапка документа живет сама по себе, а табличная часть сама по себе. и связь между ними не здана жестко на уровне всей базы, а определяется только тем, какая форма используется?
399 НиколаевГ
 
25.10.19
05:57
(389) Да, можно спокойно создать документ и справочник с одинаковым GUID.
400 НиколаевГ
 
25.10.19
05:59
(382) Да, ложится неплохо. Но вот не осилили они. А с нуля сейчас писать есть ли смысл, при наличии на рынке того-же Инстока и кучи WMS на 1С?
401 _DAle_
 
25.10.19
11:09
(398) Извиняюсь, нет времени сейчас разобраться полностью в вопросе (да и, возможно, я не смогу на него полностью ответить). Главное - любые изменения в lsfusion делаются в некоторой сессии изменений (можно, наверное, провести аналогию с транзакцией). То есть пользователь в своей сессии изменений что-то меняет, и пока он не сохранит эти изменения (обычно это осуществляется нажатием кнопки "Сохранить"), ничего в базу не попадает, и другие пользователи этих изменений не видят.
Сессии изменений: https://documentation.lsfusion.org/pages/viewpage.action?pageId=2719863
действие APPLY: https://documentation.lsfusion.org/pages/viewpage.action?pageId=5832735
402 Злопчинский
 
25.10.19
13:51
(400) тут ценность не в том что написано, а какие подходы сделаны. а почти каждая ВМС на рынке - это свой вариант реализации. Простые вмс системы это одно. а есть вмс, где можно сконструировать практически без кода очень сложные бизнес-процессы обработки товаропотока на складе. и это - не на уровне галочек делается. даже формы для ТСД и то могут генериться системой на ходу автоматически. это вам блин не столбец просуммировать...
403 НиколаевГ
 
25.10.19
13:55
(402) Вот поэтому нет и не будет WMS на фузине...
404 Злопчинский
 
25.10.19
14:07
(403) с учетом того, что фузиновцы пилят решения частные "по месту" - то вполне можно.
405 Злопчинский
 
25.10.19
14:12
(403) вмску под конкретный склад написать можно достаточно быстро. реально достаточно быстро. только проблема в подстройке под новые хотелки. все превратится в постонное допрограммирование.
406 НиколаевГ
 
25.10.19
14:14
(404) Тогда почему нет до сих пор? А, да, клиенты же не попросили :))
407 Ещё1
 
25.10.19
14:19
Пишу действие по кнопке на форме редактирования заказа. Чем отличается
NEWSESSION {
  status(order) <- Status.Sent;
  APPLY;
}
от
NEWSESSION {
  status(order) <- Status.Sent;
}
В обоих случаях создаваемая здесь сессия будет завершена при выходе с обработчика действия кнопки.
408 Злопчинский
 
25.10.19
14:35
Чем на форме (со списком документов, например) кнопка "ок" отличается от кнопки "закрыть"..? - вы как-то если подвязались на вопросы отвечать - не динамьте, а то ломает повторно спрашивать
409 _DAle_
 
25.10.19
14:36
(407) Сессия будет завершена в обоих, а изменения сохранятся в базу только в первом варианте.
410 _DAle_
 
25.10.19
14:38
(408) Эмм, "ок" - это сохранить и закрыть, "закрыть" - это просто закрыть.
411 Злопчинский
 
25.10.19
14:41
(410) список документов поступления. что "сохранить"..?
сохранить - это как бы применяется к содержательным данным.
в форме списка документов - что сохранить?
412 НиколаевГ
 
25.10.19
14:42
(409) А... зачем так может быть нужно?
413 _DAle_
 
25.10.19
14:44
(411) Изменения в текущей сессии изменений.
414 Злопчинский
 
25.10.19
15:04
Как наложить блокировку на чтение данных для всех пользователей по определенным таблицам БД (регистры остатков) по определенной номенклатуре на период пока какойто пользователь инициировава интерактивно действие не пройдет всю цепочку вычислений "чтение данных(здесь блокируем, если уже заблокировано - отлуп)-на основании прочитанных данных перехрендрячиваем кучу инфы из базы, в т.ч. чтение доп.данных(их тоже никто не может читать кроме меня)- пишем кучу инфы в базу - отпускаем блокировку (могут такой же процесс делать ктото другой).
?
415 _DAle_
 
25.10.19
15:06
(412) Хороший вопрос, сам его пару раз задавал. Я на lsfusion не пишу, а те, кто пишут, говорят, что для них такой явный APPLY лучше. Насколько я понимаю, один из основных аргументов в том, что далеко не всегда мы хотим применить изменения, которые сделали. Например, есть необходимость в конце выполнения некоторого действия спросить пользователя, нужно ли сохранять измененное или нет. В такой ситуации нужен дополнительно некий способ закрыть сессию уже без сохранения изменений. Говорят, что такие случаи в реальном коде довольно распространены, поэтому они за явный APPLY.
416 Ещё1
 
25.10.19
15:50
(409) Т.е. во 2-м случае (без APPLY) несохранённое изменение свойства как бы передастся в вышестоящую сессию, открытую при открытии формы редактирования заказа. Правильно?
417 НиколаевГ
 
25.10.19
15:53
(415) Примерчик бы... Как-то странно всё это.
418 Ещё1
 
25.10.19
15:59
(416) Если убрать APPLY, новое значение свойства вообще не сохраняется. Получается, выходит из сессии без сохранения...
419 НиколаевГ
 
25.10.19
16:01
(418) Вот я и говорю, странно это как-то, хочется понять логику.
420 Ещё1
 
25.10.19
16:10
(419) Тут логика в том, что все действия пользователя с объектами как бы накапливаются в текущей сессии, не переносятся в базу сразу. И применяются к основной базе только по нажатию OK, или программно при вызове APPLY. А также пользователь может отказаться ("Закрыть"), либо программно CANCEL. Там есть ещё нюансы и разные параметры этих команд, я пока не разбирался детально.

При применении изменений платформа проверит все установленные ограничения (CONSTRAINTS), и если где-то что-то пользователь накосячил или удалил лишнее - не даст ему испортить базу, позволит исправить, либо отказаться от сохранения.
421 НиколаевГ
 
25.10.19
16:12
(420) Так ограничения же только после APPLY сработают, или как?
422 Ещё1
 
25.10.19
16:17
(421) Верно, во время APPLY (применения изменений). Если сработают ограничения - APPLY не состоится. Я в (407) во 2-м примере создал новую сессию, что-то там изменил, и закрыл. А надо было сохранить изменения (APPLY).
423 Bro
 
25.10.19
16:18
(421) все события (в частности и ограничения) именно при apply и срабатывают, в этом смысл apply. И newsession не делает apply потому что это строго говоря перпендикулярные понятия. Newsession создаёт новую сессию, apply применяет изменения в текущей.
424 НиколаевГ
 
25.10.19
16:22
(423) Не понял, APPLY в новой сессии применит изменения в родительской сессии? Когда нажимаем ОК на форме, что происходит?
425 _DAle_
 
25.10.19
16:56
(424) APPLY применит изменения текущей сессии.

>Newsession создаёт новую сессию, apply применяет изменения в текущей.

Здесь два независимых утверждения:
NEWSESSION создает новую сессию
APPLY применяет изменения в текущей
426 Bro
 
25.10.19
17:02
(424) применяются изменения в текущей сессии.
427 Ещё1
 
25.10.19
17:35
А скажите есть ли в платформе диалог выбора папки на сервере? Хочу для админа приложения сделать выбор папки для обмена с 1С. Не то чтобы это обязательно, но может такая функция уже реализована?
428 НиколаевГ
 
25.10.19
18:19
(425) Тогда непонятен смысл NEWSESSION без APPLY. И что, всё-таки, происходит при нажатии кнопки ОК? Новая сессия открывается или изменения в текущей применяются?
429 _DAle_
 
25.10.19
18:47
(428) >Тогда непонятен смысл NEWSESSION без APPLY

Я выше писал: не всегда нужно применять изменения, которые произошли в сессии. Например, пользователь не захотел этого делать.

>И что, всё-таки, происходит при нажатии кнопки ОК

Сохраняются изменения текущей сессии, форма закрывается.
430 НиколаевГ
 
25.10.19
19:11
(429) То есть, то, что Ещё1 делает в (407) так делать не надо?
431 Ещё1
 
25.10.19
19:26
(430) Да, 2-й вариант обычно* не имеет смысла. Если начата сессия, её нужно закончить либо APPLY, либо CANCEL.

*Если в течении сессии какие-то файлы на диск записывались, или удалялись, или информация отсылалась куда-то, то естественно это назад не вернёшь. APPLY и CANCEL действует только на БД приложения.
432 НиколаевГ
 
25.10.19
20:11
(431) А зачем вообще новую сессию открывать было в этом примере?
433 Ещё1
 
25.10.19
20:25
(432) Новая сессия гарантирует что все изменения, которые будут в ней произведены с БД, будут либо записаны целым блоком, либо отменены целым блоком. А без сессии может получиться так, что часть свойств были изменены, потом произошла какая-то ошибка и дальше выполнение не пошло.

Короче, ещё 1 контроль целостности базы.
434 Ещё1
 
25.10.19
20:30
Если на примере:
NEWSESSION {
  fileSaved() <- TRUE;
  //... тут пишем файл на диск
}
Если Exception случится в момент записи файла на диск, то флажок fileSaved() к этому моменту будет уже установлен, что нарушит логику программы.
(И не говорите мне, что устанавливать флажок надо в конце блока, это просто иллюстрация.)
435 НиколаевГ
 
25.10.19
20:36
(433) Типа аналог НачатьТранзакцию в 1С? Оригинально...
436 Ещё1
 
25.10.19
20:48
(435) Получается да, но тут гораздо продвинутее. Можно например создавать вложенные сессии, тогда локальные свойства материнской сессии будут видны у потомка.

Кстати, в примерах у них нашёл создание сессии с временным объектом, которая не заканчивается ни APPLY, ни CANCEL:

NEWSESSION {
    NEW s = Sku {
            id(s) <- 1234;
            name(s) <- 'New Sku';
            SHOW sku OBJECTS s = s;
    }
}
437 НиколаевГ
 
25.10.19
20:57
(436) Что-то слишком заумно. Провоцирует писать совершенно неочевидный и несопровождаемый код.
438 Ещё1
 
25.10.19
21:09
(437) Как посмотреть. Я сейчас пробую писать свою приблуду, но не использую и половины возможностей языка. С другой стороны, приятно сознавать, что там есть такие мощные вещи.
439 Злопчинский
 
25.10.19
21:10
(438) Покажи потом что написал...
440 Злопчинский
 
25.10.19
21:11
Про сессии - нихрена не понял.
открывается например визуальная форма для редактирования документа. Нахера там ньюсессион открывать? система сама не может это проинтуичить?
441 НиколаевГ
 
25.10.19
21:14
(438) Ну, я не уверен, что эти вещи именно так стоит реализовывать. Не хватает, конечно, стандартов разработки и внятной и непротиворечивой документации.
442 НиколаевГ
 
25.10.19
21:16
(440) Я то-же не понимаю, поэтому есть сомнения, что именно так и надо делать. Подождем настоящих сварщиков :))
443 Ещё1
 
25.10.19
21:31
(439) Можно. Но пока и половины не сделал. Планирую что-то вроде (очень упрощённой) системы заказов для разъездных продавцов и авторизованных клиентов. С импортом-экспортом в 1С УТ.
(440) Не надо. При открытии окна сессия автоматом создаётся. Новую сессию можно например для своих обработок по нажатию кнопки. Чтобы в случае чего не испортить то, что пользователь навводил в форме.
444 Bro
 
26.10.19
05:30
(428) там в другом дело, вы если show формы например сделаете эта форма схватит сессию в новом потоке и будет там с ней работать. А newsession завершится. С сессиями же по сути сборка мусора работает, ссылок не осталось сессия закрывается.
445 Bro
 
26.10.19
05:38
(435) (433) нет это не начатьтранзакцию, сессия это место куда записываются изменения свойств и добавление удаление объектов (пока они не сохранились в базу). За транзакцию отвечает apply. Хотя apply применяет именно накопленные в сессии изменения (так что связь есть)
446 Bro
 
26.10.19
05:40
(441) как раз документация (та что парадигма) писалась достаточно сухим языком и ее цель была полнота, структурированность и непротиворечивость. Так что если где то нашли противоречие сразу пишите.
447 Михаил Иванович
 
26.10.19
07:27
Так смешно смотреть, как фузиновцы сами с собой разговаривают. )))
448 НиколаевГ
 
26.10.19
08:26
(445) А как тогда явно "обернуть" часть кода в транзакцию?
449 CrushBy
 
26.10.19
08:37
(448) Покажу на примере.
Можно написать двумя способами :
NEWSESSION {
f(a) <- g(a);
APPLY;
}
и второй способ (именно обернуть код в транзакцию) :
APPLY {
f(a) <- g(a);
}

В первом случае f(a) <- g(a) ничего в базу писать не будет, а запишет изменения во временную таблицу. При APPLY пойдет UPDATE в базу исходя из данных временной таблицы.

Во втором случае, начнется транзакция, а затем сразу пойдет UPDATE f ...

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

На самом деле, открытие любой формы из меню равносильно :
NEWSESSION {
    SHOW form DOCKED;
}
Внутри любой формы есть кнопки Сохранить и ОК (сохранить и закрыть). Они по сути и сделают APPLY, если пользователь это нажмет.
450 НиколаевГ
 
26.10.19
09:41
(449) И в каких случаях какой способ применять?
451 CrushBy
 
26.10.19
10:09
(450) Если нужно с пользователем в действии взаимодействовать, то первый. Иначе второй.
452 CrushBy
 
26.10.19
10:11
(451) Плюс первый предпочтительнее, если не хотите растягивать транзакцию, когда в действии есть сложные вычисления, которые можно сделать вне транзакции.
453 Bro
 
26.10.19
11:09
Про сессии этот раздел:
https://habr.com/ru/company/lsfusion/blog/458376/#session

Тут все зависит на самом деле хотите чтобы верхняя и открываемая форма вместе свои изменения применяли (отменяли) или по отдельности.
454 Ещё1
 
26.10.19
12:42
А, ну да, в Фузине транзакция кратковременная, происходит внутри блока в команде APPLY. Чтобы базу не блокировать надолго. Иначе не работало бы одновременное редактирование одного документа разными пользователями. Хотя стоило бы всё же предупреждать пользователя при открытии документа, что его уже редактирует Марьванна с бухгалтерии.
455 Bro
 
26.10.19
13:04
(454) Вообще я писал, что лучше не так. Лучше как в гуглдокс, показывать, какие пользователи редактируют, рамочкой показывать, где сейчас фокус у этих пользователей и что недавно изменилось. Но это уже лучшее враг хорошего. Принципиальный момент, что платформа принципиально устойчива к одновременному редактированию.
456 НиколаевГ
 
26.10.19
14:04
(455) И в 1С моно сделать так-же, если что.
457 Bro
 
26.10.19
15:45
(456) Понятно что и на ассемблере можно так же сделать. Вопрос в том, что в lsFusion для этого делать ничего не надо, там одновременное редактирование "в крови" (по умолчанию).
458 Bro
 
26.10.19
15:47
(454) Транзакция в принципе должна быть короткой. По сотне причин. Строго говоря если в транзакции есть любой интерактив или ожидание чего либо еще это уже неправильно.
459 Ещё1
 
26.10.19
22:13
Вопрос по настройке планировщика программно. При запуске сервера приложений выполняется такой код (упрощённо):

onStarted() + {
  NEWSESSION {
        NEW task = UserScheduledTask {
          name(task) <- 'Импорт из 1С';
          //...
          NEW td = UserScheduledTaskDetail {
            active(td) <- TRUE;
            //...
            order(td) <- 1;
            NEW action = Action {
              caption(action) <- 'importFiles';
              canonicalName(action) <- 'import.importFiles[]';
              action(td) <- action;
            }
            scheduledTask(td) <- task;
          }
      APPLY;
    }
}

Я вижу, что код точно выполняется, ошибок никаких не выдаёт. Однако задание в планировщике не появляется. В чём здесь проблема?
460 Bro
 
26.10.19
22:27
(459)
Странно выполняю в lsfusion.org/try у меня появляется задание:

REQUIRE Scheduler;

showHelloWorld 'Показать сообщение' () {
    MESSAGE 'Hello world!';
}

FORM formHelloWorld 'Форма'
    PROPERTIES 'Сообщение' = 'Hello world!';
;

NAVIGATOR {
    NEW showHelloWorld;
    NEW formHelloWorld;
}

onStarted() + {
   NEW d=UserScheduledTask {
       name(d) <- 'Импорт из 1С';
   }
}

И с NEWSESSION APPLY тоже.

А попробуйте просто в интерпретаторе показать форму
OBJECTS d=UserScheduledTask
PROPERTIES (d) VALUE,name
посмотреть создались или нет. То есть без фильтров и всего остального.
461 Ещё1
 
26.10.19
22:59
Вы по-другому всё-таки делаете.
Если я отключаю создание NEW action то задание нормально создаётся, и в нём появляется 1 строка задания, но с пустым действием. И это понятно, т.к. action я не заполняю.
Я уже пробовал так:
action(td) <- actionCanonicalName('import.importFiles[]');
и так:
action(td) <- propertyCanonicalName('import.importFiles[]');
и даже так:
action(td) <- GROUP AGGR ActionOrProperty a WHERE a IS ActionOrProperty BY canonicalName(a);
Последнее не скомпилировалось.

Когда вручную выбираю это действие из списка, то в столбце "Класс действия" появляется ListAction. Но я не смог найти этот класс в LSF-файлах платформы, чтобы создавать экземпляр именно этого класса.
462 Ещё1
 
26.10.19
23:08
В метаданных - Действие нужное мне действие есть в группе root - private:
https://paste.pics/a5adf06571625ca30c289eb7bfec901e
Но как его выцепить?
463 Ещё1
 
27.10.19
01:44
OK добавил задание в планировщик пока вручную. Вроде всё прописалось, сохранилось. Планировщик запущен. Но задание не запускается. На закладке "Лог" - пустой. Вручную кнопкой с навигатора задание запускается и отрабатывает. Непонятно...
https://paste.pics/761e772096273f4cad5b97b6a878f672
464 Ещё1
 
27.10.19
01:47
Нажимаю "Выполнить задание" в строке задания справа - всё срабатывает отлично.
465 Злопчинский
 
27.10.19
02:56
(449) так как в итоге блокировку поставить для других пользователей как в (414) описано - по второму варианту из (449)?
466 Злопчинский
 
27.10.19
02:57
а главное меню - верхняя часть - поддается настройке в пользовательском режиме (показать толькт значки, только тест, текст-значки)..? или зашито жестко ? или опять надо "написать одну строку?"
467 Bro
 
27.10.19
08:32
(462) У вас Import с маленькой буквы. Язык case sensitive, canonical name'ы тоже. По идее это правильно:

action(td) <- actionCanonicalName('Import.importFiles[]');

С NEW правда непонятно почему не сработало, я проверю чуть позже
468 Bro
 
27.10.19
08:34
(463) А попробуйте Выполнять при старте, или дату начала проставить. Если это поможет то конечно криво, пофиксим.
469 Bro
 
27.10.19
08:37
(465) В модуле Authentication есть уже готовые действия lock, unlock (можете кстати глянуть как они реализованы, если что можно просто их скопировать и сделать более хитрую логику)

lock(object);
TRY {
    IF lockResult() THEN {
       ...
    } ELSE
      MESSAGE 'Locked by user : ' + locked(object);
} FINALLY {
   unlock(object);
}
470 Bro
 
27.10.19
08:47
(466) Смотрите есть вещи которые делает разработчик, есть которые пользователь. Общая идеология - пользователь делает совсем базовые вещи, связанные в основном с особенностями его компьютера (иногда бизнес-процесса, но все равно базовые). То есть акцент на бизнес-приложения, а не "телеграмы и вконтакте". Возможно пользовательскую настройку будем расширять, но не хочется дублировать механизмы. Все же возможности пользователя ограничены его желанием / способностями, а размазывать логику приложения - это создавать проблемы с поддержкой и доработкой. Пока основной фокус lsFusion это не массовые коробки (где можно все решить деньгами), а нишевые коробки и проекты с высокой степенью кастомизации.
471 Bro
 
27.10.19
10:08
(461) GROUP AGGR не сработал потому как он неявно создает ограничение, и просто где попало его использовать нельзя, только при объявлении свойства вроде как, так же как и DATA. В таких случаях обычно GROUP MAX, или GROUP NAGGR (без создания ограничения, но что запись одна на совести разработчика)
472 Ещё1
 
27.10.19
11:59
(467) Точно, не доглядел. Поменял букву, теперь нормально записывается простой командой:
action(td) <- actionCanonicalName('Import.importFiles[]');
(468) Да, установка запуска при старте помогла.
(471) Я потом был переписал эту строку так:
action(td) <- [GROUP AGGR Action a WHERE a IS Action BY canonicalName(a)]('import.importFiles[]');
Но естественно она тоже не работала, потому что 'import' с маленькой буквы.

OK на данный момент настройка шедулера в приложении работает как планировалось.
473 Ещё1
 
27.10.19
12:03
Можно ли настроить уровень логирования в планировщике, напр. только ошибки?
Или полностью отключить лог, когда всё отлажено и работает.
474 Bro
 
27.10.19
12:17
(473) EXTEND FORM scheduler FILTERS error(o), ну или точно не помню что просто наведите на колонке там в tooltip показывается свойство. Ну или FILTERGROUP можете добавить с DEFAULT, чтобы по умолчанию включены только ошибки, в при выключении все.

А что значит полностью отключить лог? Ну пишется и пишется, или что вы имеете ввиду?
475 Ещё1
 
27.10.19
12:20
(474) Фильтр там уже реализован, под логом птичка "Ошибки или сообщения". Я думал, вообще можно отключить логирование, если оно не нужно. Но на закладке "Настройки планировщика" есть только "Количество потоков".
476 Bro
 
27.10.19
12:29
(475) Туда все сообщения из задания пишутся, но непонятно зачем его вообще отключать
477 Ещё1
 
27.10.19
13:27
В форме заказа, хочу сделать чтобы при добавлении новой строки OrderDetail по кнопке ( PROPERTIES(od) NEW ) или по клавише Insert, сразу же появлялось окошко выбора номенклатуры ( FORM skusForm ) для этой строки. Возможно ли?

Сейчас при нажатии Insert внизу в списке появляется новая пустая строка, надо щёлкнуть по ячейке Код товара или Товар, чтобы открылся список номенклатуры для подбора.
478 Ещё1
 
27.10.19
13:38
Можно ли открыть форму заказа в режиме "Только чтение" при указанных условиях (напр., статус заказа - отправлен). Я могу это сделать, добавив на все свойства READONLYIF, а на конпки NEW и DELETE - условие SHOWIF. Но может есть простой способ, который сразу накладывает на все свойства объекта условие READONLY.
479 Bro
 
27.10.19
13:47
(477) Action сделайте и повесьте на форму (но да CHANGEKEY и картинку придется прописать)
addDetail(Order o) {
   DIALOG LIST Sku INPUT s DO NEW od = OrderDetail {
        sku(od) <- s;
        order(od) <- o;
   }
}
// или (s-имя объекта на skusForm)
//   DIALOG skusForm OBJECTS s INPUT DO...
480 Bro
 
27.10.19
13:48
(478) При SHOW / DIALOG есть опция READONLY, можно при показе проверить и показать либо с этой опцией либо без. Ну а так да, READONLYIF
481 Михаил Иванович
 
27.10.19
14:05
разговоры сами с собой ведете?
(479) врешь!
482 Михаил Иванович
 
27.10.19
14:05
(480) Опять врешь!
483 Ещё1
 
27.10.19
14:31
(480) Это работает, но требуется небольшая доработка. При открытии формы в режиме READONLY надо дополнительно убирать кнопки NEW, DELETE.
484 Bro
 
27.10.19
14:37
(483) А они разве не убираются? Может там они в NEWSESSION?
485 Ещё1
 
27.10.19
14:47
(484) Нет, не убираются, и не NEWSESSION. Сейчас я добавил вручную SHOWIF, чтобы убирать кнопки когда не нужны:
  PROPERTIES(od) SHOWIF NOT readOnly(o) NEW, DELETE
486 Bro
 
27.10.19
14:54
(485) не, в понедельник глянем пофиксим. но очень странно так как на тот же механизм политика безопасности read only завязана, и если бы появились эти кнопки нам бы давно сказали.
487 Ещё1
 
27.10.19
14:56
(479) Не хотелось бы лезть в макет формы, чтобы поднастроить поведение стандартных действий. А что если как-то так сделать:

WHEN LOCAL SET(OrderDetail od) AND NOT sku(od) DO {
  DIALOG LIST SKU INPUT s DO {
    sku(od) <- s;
  }
}

Но в этом коде что-то не то с синтаксисом, пишет "Data:158:32 single parameter could not be a parameter of a session operator"
488 Ещё1
 
27.10.19
15:07
(487) Переделал так, компилируется:

WHEN LOCAL SET(od IS OrderDetail) AND NOT sku(od) DO {  
  DIALOG LIST SKU INPUT s DO {
    sku(od) <- s;
  }
}

Но окно выбора не появляется, и на сервере вызывает StackOverflowError.
489 Bro
 
27.10.19
15:15
(488) вообще локальные события предметной области асинхронные, и в них интерактивные блокирующие вызовы мы никогда не вызывали. Хотя теоретически не вижу почему они не должны работать, а можете стэк в слэк скинуть?
490 Ещё1
 
27.10.19
15:22
(489) Я попробовал пошагово оттрассировать обработку этого события. Тут получается зацикливание, т.е. последовательно исполняется DIALOG LIST SKU, затем вызывается WHEN LOCAL SET, потом снова DIALOG LIST SKU и т.д.
Может как-то нужно подправить условие в WHEN, чтобы избежать этого?
491 Bro
 
27.10.19
15:27
(490) Ну в общем да логично, она при открытии формы в той же сессии опять вызывает обработку локальных событий. Можно теоретически NEWSESSION сделать, но тогда придется sku через NESTED возвращать (так как в новой сессии не будет виден sku, можно конечно еще NESTEDSESSION попробовать, но это уже совсем жестко):
selectedSku = DATA LOCAL NESTED Sku ();
WHEN LOCAL SET(od IS OrderDetail) AND NOT sku(od) DO {  
  NEWSESSION
     DIALOG LIST SKU INPUT s DO
        selectedSku() <- s;

  sku(od) <- s;
}

Ну и не уверен, что это заработает. Хотя если нет, то интересно почему.

Но я бы все же вернулся к более кошерному варианту с явным действием Action.
492 Bro
 
27.10.19
15:27
(491) * не видно свойство sku в смысле и даже новая строка не будет видна.
493 Ещё1
 
27.10.19
15:35
Я решил эту проблему через добавление локального флажка, отслеживающего повторный заход в событие.

inDialog = DATA LOCAL BOOLEAN ();

WHEN LOCAL SET(od IS OrderDetail) AND NOT sku(od) AND NOT inDialog() DO {
  inDialog() <- TRUE;  
  DIALOG LIST SKU INPUT s DO {
    sku(od) <- s;
  }
  inDialog() <- NULL;
}

Костыльно, но работает.
494 Bro
 
27.10.19
15:46
(493) Ниразу так не делали. Хотя с другой стороны, ситуации когда диалог вызывается в асинхронных операциях в платформе бывают, так что не вижу почему не должно работать. Тут бы конечно "связь" бы затормозить и потыкать на добавить очень быстро.

А с NEWSESSION заработает?
495 Ещё1
 
27.10.19
16:13
(494) С новой сессией получилось так:

WHEN LOCAL SET(od IS OrderDetail) AND NOT sku(od) DO {
  LOCAL newSKU = SKU();
  NEWSESSION NESTED LOCAL {
    DIALOG LIST SKU INPUT s DO {
      newSKU() <- s;
    }
  }
  sku(od) <- newSKU();
}

Выглядит уже покрасивше. Пришлось использовать LOCAL newSKU для промежуточного хранения, потому что если сразу писать в sku(od) <- s; то присвоенное значение не сохраняется.
496 Bro
 
27.10.19
18:48
(495) да я это и писал выше. Что надо через NESTED LOCAL делать.

Кстати в таких случаях в самом LOCAL лучше указывать NESTED. Он тогда автоматически передастся в NEWSESSION. Ну или в nested указать конкретно к свойство.

В любом случае мы так никогда не делали, даже интересно какие подводные камни при этом могут быть.
497 Ещё1
 
27.10.19
19:03
(496) OK переделал на LOCAL NESTED newSKU = SKU();
Так тоже работает, минус 1 служебное слово.
OK
498 CrushBy
 
27.10.19
20:55
(495) Есть только один момент. В том же ERP мы ни разу так не делали (в локальном событии вызов диалоговой формы). Так что точной корректности гарантировать не могу.
499 Ещё1
 
28.10.19
23:34
(354) > VALUE(o) - описывается здесь https://documentation.lsfusion.org/pages/viewpage.action?pageId=1573071

А при обратном импорте из JSON в базу, я могу прочитать ранее записанный идентификатор объекта как число LONG, а как по нему получить сам объект известного класса (скажем Order)?
500 Ещё1
 
28.10.19
23:46
Допустим:
impID = DATA LOCAL LONG (); // Сюда импортируется ID объекта из JSON
LOCAL order = Order (); // Сюда хочу поместить ссылку на сам объект с ID = impID()
Пробую разные варианты:
order() <- Order(impID()); // Приведение типа не работает
VALUE(order()) <- impID(); // Тоже не работает
order() <- [GROUP AGGR Order o WHERE o IS Order BY VALUE(o)](impID());
// тоже не берёт
501 Ещё1
 
29.10.19
13:27
Правильное решение получения объекта по внутреннему идентификатору:
order() <- GROUP MAX Order o IF o IS Order AND LONG(o) == impID();
502 Bro
 
29.10.19
14:06
(501) Да есть этот фокус, с тем что указание класса, это еще не означает IS. Хотя строго говоря в данном случаем можно класс не указывать и просто писать GROUP MAX o IF o IS Order AND LONG(o) = impID();
503 Ещё1
 
29.10.19
14:16
(502) Ага, untyped implicit parameter declaration. С другой стороны, если lsFusion может вывести тип и параметры переменной из записи запроса, то почему нет.
504 Bro
 
29.10.19
14:39
(503) Это не warning. Это подсветка чтобы случайно новые параметры не заводили. lsFusion выводит классы параметры и значений свойств и при неявной ситуации. Просто обычно не рекомендуется не указывать классы параметров, если идет обращение к другим свойством, потому как ambigious рискуете получить, когда появится еще одно свойство с таким именем.
505 Bro
 
29.10.19
14:40
* при неявной типизации
506 Ещё1
 
29.10.19
16:24
(504) Так а в случае ambigious будет предупреждение? Если да - то не проблема.
507 Ещё1
 
29.10.19
16:36
Обновляется ли форма в lsFusion автоматически при изменениях в базе? На примере: в web-клиенте открыта форма со списком заказов, на сервере приложений фоновая задача отрабатывает пришедший от 1С пакет, который обновляет статус заказов. Но у пользователя в Web-клиенте статусы сами не обновляются, надо жать formRefresh. Это так задумано, или недоработка (моя или платформы)?
508 Злопчинский
 
29.10.19
16:40
(507) имхо это проблематично.
обновлений в базе столько может быть, что ядро должно постоянно диспетчеризировать и рассылать "уведомления" об обновлении. или клиент (с таймаутом? - это херня полная)
509 Bro
 
29.10.19
16:52
(507) Да проблематично, по сути надо следить как-то за видимым окном и что именно в нем произошли изменения. Оверхед будет очень большой скорее всего в таком случае.

Для реализации таких вещей обычно AUTOREFRESH используют:
https://documentation.lsfusion.org/pages/viewpage.action?pageId=3670145
510 Ещё1
 
29.10.19
17:26
(509) AUTOREFRESH отлично, полностью устраивает.
511 Злопчинский
 
29.10.19
17:34
(509) при авторефреше - сохранится набитое в текстовых поляпрочих полях которые не изменялись другой тсороной? курсор в поле вврда текста останетяс на той же строке?
512 Bro
 
29.10.19
17:47
(511) Естественно.
513 Ещё1
 
29.10.19
20:48
Зря вы сделали логины пользователей чувствительными к регистру. Он должен иметь возможность ввести Vasya, vasya или VASYA (Caps Lock "случайно" включился), и система его примет. Меньше разгневанных звонков в службу поддержки. Вот пробелы в начале и конце логина отбрасываете - это правильно.
514 Ещё1
 
30.10.19
11:37
Такой код:
NEW ur = UserRole {
  sid(ur) <- 'admin';
  //...
  mainRole(customUser('admin')) <- ur;
}
Он компилируется, но в IDEA подчёркивает красным customUser('admin') и пишет Ambiguous reference: mainRole(?) and mainRole(?) match.
Я уточняю тип параметра:
mainRole(customUser('admin') AS CustomUser) <- ur;
Но подчёркивание остаётся. Пробовал приведение к типу:
mainRole(CustomUser(customUser('admin'))) <- ur;
Но так не компилируется.
Как избавиться от этого предупреждения? Можно и так оставить, но я люблю когда код чистый, без предупреждений компилятора.
515 _DAle_
 
30.10.19
12:08
(514) Подскажите, пожалуйста, если нажать ctrl+b на mainRole в исходном коде, то показываются ссылки на исходные файлы в двух разных .jar файлах, один из которых *sources.jar?
516 Ещё1
 
30.10.19
14:15
517 _DAle_
 
30.10.19
14:40
(516) Избавиться всегда можно с помощью явного указания сигнатуры, в данном случае mainRole[User], но ситуация ненормальная, нужно смотреть.
518 Ещё1
 
30.10.19
14:45
Подстановка mainRole[CustomUser](customUser('admin')) <- ur; не убирает подчёркивание.
519 Ещё1
 
30.10.19
14:49
https://paste.pics/81cbf7cc50a7b6a2939a2b7dc5e949b5
Меня смущают "?" в предупреждении об ошибке. Такое ощущение что плагин не видит истинных типов параметров в определениях mainRole.
520 _DAle_
 
30.10.19
15:15
(518) Да, но я не зря написал, mainRole[User], вы же в DATA свойство хотите записать.
(519) Да, похоже, почему-то не видит, надо разбираться. Могу пока посоветовать вызвать File | Invalidate caches / restart, пускай индексы перестроит для начала.
521 _DAle_
 
30.10.19
15:33
(520) Воспроизвел баг, проявляется, когда системные модули, в том числе и Security.lsf, находятся внутри jar файла, как, видимо, и у вас сейчас. Будем разбираться.
522 Злопчинский
 
31.10.19
00:24
Где по типовой методе в фузине предполагается хранить картинки товаров (для веба и для десктопа).
Как от рисовать хранимую картинку на форме? Типа идём по товарам по списку - меняется картинка.
523 _DAle_
 
31.10.19
12:24
(522) Я, конечно, не очень знаю типовые подходы. Но в исходниках вижу, например, вот такое применение:

image 'Изображение' = DATA IMAGEFILE (Article, Color);

То есть изображения хранятся в базе. Реализуется это с помощью свойства, которое возвращает объект класса IMAGEFILE. В данном случае выбор картинки зависит от артикула и цвета. Потом нужно будет добавить это свойство на форму, обычно в отдельную панель.
524 Bro
 
31.10.19
12:30
(522)
image = DATA IMAGEFILE (Sku);
FORM skus
    OBJECTS s=Sku
    PROPERTIES (s) image PANEL
;

Когда будете ходить по товарам картинка будет сама обновляться.  Хранятся прямо в базе.
525 Ник080808
 
31.10.19
12:33
(524) если нужно прикреплять несколько картинок к товару? к строке документа?
526 CrushBy
 
31.10.19
12:43
(525) Несколько картинок :
CLASS Image;
sku = DATA Sku (Image) NONULL DELETE;
file = DATA IMAGEFILE (Image);

Прикрепление к строке документа :
image = DATA IMAGEFILE (DocumentLine);
527 Ник080808
 
31.10.19
12:47
(526) по какому ключу связывается картинка и строка? по номеру строки?
528 CrushBy
 
31.10.19
12:52
(527) Смотрите, IMAGEFILE - это просто примитивный тип. Вроде строки. В базе данных она хранится как byte array (то есть просто бинарным файлом). Соответственно просто в строке появляется новое поле. Как правило, мы складываем их в отдельную таблицу, чтобы не раздувать основную таблицу со строками :

TABLE documentLineImage(DocumentLine);
image = DATA IMAGEFILE (DocumentLine) TABLE documentLineImage;
529 Ещё1
 
31.10.19
13:15
Непонятно, как показать в карточке товара все его картинки. Например, автомобиль, снятый с разных ракурсов. Тут можно разную логику придумать, например по-умолчанию выводится 1-я прикреплённая картинка. Щёлкая по картинке - открывается новое окно с галереей картинок по товару.
530 Bro
 
31.10.19
15:02
(529) Можно либо в таблице сделать и увеличить размер ряда, либо что логичнее объектами-в-колонки:

image = DATA IMAGEFILE (Car, LONG);
FORM carWithPhotos
    OBJECTS c=Car, l=LONG
    FILTERS image(c, l) // фильтруем только номера с картинками
    PROPERTIES image(c,l) COLUMNS (l) HEADER 'Фото ' + l
;
По идее должно сработать
531 Ещё1
 
31.10.19
15:08
(530) Т.е. в таблицы можно не только текст выводить, но и картинки?
532 Злопчинский
 
31.10.19
16:34
(470) я согласен, но настройки интерфейса - зачем на них разработчика тащить. если у меня на ноуте по вертикали 800 пикселей экран - мне бы верхнее меню вообще значки убоать и оставить только текст.
.
аналогично - левая панель перечень справочников\документов - хорошо бы разные пиктограммы иметь и убрать текстт - я по горизонтали сэкономлю...
533 Злопчинский
 
31.10.19
16:37
(531) не, в таблицы картинкт колонками выводить это в отчет хорошо. а на экране - как показать ленту картинок для текущей строки таблицы\списка?понятно что в ленте может быть переменное колво картинок для разных строк списка.
534 Bro
 
31.10.19
16:38
(531) ну все можно везде выводить. Строго говоря, с точки зрения реализации свойство в панели это таблица из одного ряда, одной колонки, без заголовка. Вопрос что у разных типов разные рендереры. У картинок это отображение картинки.
535 Bro
 
31.10.19
16:39
(533) для этого объекты-в-колонки использовать. То есть по сути кросс-таблицы, просто в панели эта таблица из одного ряда.
536 Ещё1
 
01.11.19
01:42
Воспользовался предложением CrushBy в соседней ветке ( OFF: lsFusion vs 1C. Раунд 7 (37) ) и переделал обновление справочника товаров, как приведено в примере №3 https://documentation.lsfusion.org/pages/viewpage.action?pageId=46367614
И сравнил по скорости с первоначальным решением "в лоб". В качестве теста делал 3 загрузки каталога: сначала 1-ю половину, потом 2-ю, а потом целый каталог товаров.
Действительно, загрузка ускорилась практически ровно в 2 раза.
537 CrushBy
 
02.11.19
11:17
К сожалению, оптимизация получилась не полной. В общем случае FOR может скомпилироваться в один SQL запрос (а не выполняться на сервере приложений), если в нем нет IF'ов, других FOR'ов и строки записи внутри его не зависят друг от друга. У Вас же получается, что внутри пробега создаются группы, производители и прочие. Для оптимизации нужно вынести создание справочников за пределы FOR'а.

Например, с импортом групп снаружи FOR будет другой цикл по созданию несуществующих групп :
FOR [GROUP MAX INTEGER i BY groupName(i)](ISTRING[100] name) AND NOT groupByName(name) NEW g = Group DO {
    name(g) <- name;
}

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

Потом уже при заполнении свойств sku там останется только
group(u) <- groupByName(groupName(i));

так как все группы уже созданы в предыдущем FOR'е.

Это все приведет к тому, что все пойдет одним запросом и импорт должен ускориться во много раз.
538 Bro
 
02.11.19
12:23
(537) IF'и и FOR'ы тоже отлично компилируются в "один запрос" (ELSE'ы только пока не компилируются). Главное чтобы зависимостей читающих свойств от свойств в которые пишется не было. Хотя там можно INLINE в FOR поставить и тогда :

FOR f(a) INLINE DO
   g(a) <- h(g(a));

Скомпилируется в WHERE (то есть один запрос):
g(a) <- h(g(a)) WHERE f(a);
принудительно. Но нужно понимать, что при этом может поменяться логика (собственно поэтому платформа этого и не делает).

INLINE пока единственная (или одна из 2-3) опция которая не описана в документации, так как для этого нужно подробнее описывать как все работает. Это мы конечно тоже сделаем, но чуть позже.
539 Ещё1
 
02.11.19
18:10
Я собирался вынести обновление вспомогательных справочников отдельно. Но почему-то показалось, что несколько пробегов типа FOR groupName(INTEGER i) ... по загруженным данным будут хуже 1 пробега FOR id(SKU u) == skuID(INTEGER i), пусть с проверками внутри. А надо было проверить, разница очень заметная. Если до изменений тест пробегался за 16145 мс и 14379 мс (1-я и последующие итерации), то после выноса обновлений справочников - 2688 мс и 1743 мс соответственно. Выигрыш в 6-8 раз. Получается импорт стал быстрее в 12-16 раз по сравнению с решением "в лоб".

Может, немного сбил синтаксис локальных свойств, что вместо
groupName = DATA LOCAL ISTRING[100] (INTEGER);
нужно писать
LOCAL groupName = ISTRING[100] (INTEGER);

Я протестировал сейчас 4 варианта: с циклами типа FOR groupName(INTEGER i)..., циклы FOR [GROUP MAX INTEGER i BY groupName(i)](name), и те же циклы с добавлением INLINE. По скорости они все примерно одинаковы. Может только FOR groupName(INTEGER i)... без INLINE чуть медленнее, но нужны значительно большие тестовые справочники, чтобы утверждать точно.

С INLINE мне не совсем понятно. Есть ли небольшое ускорение, или и без INLINE компилятор нормально справился в данном случае.

Небольшое наблюдение. В операторе
[GROUP MAX INTEGER i BY groupName(i)](ISTRING[100] name)
Я бы предпочёл не указывать тип параметра ISTRING[100]. И я вижу, язык это позволяет. Причина: при изменении размерности или типа исходного свойства (например на STRING[200]) при явном указании типа в (ISTRING[100] name) придётся вручную отыскать все такие использования и откорректировать.
540 tty12
 
02.11.19
18:46
(538) (537)
Может уже спрашивали, но я ответа не видел... И все с начала читать лень.
Конкретный, простой вопрос. Вы зарубу (задачи в ней) сделали? На котрую Вы подписались! Где решение? Под ТЗ решение, а не под оду... У вас есть ответ?

PS: Я вижу один и тот же ответ -
1. "Три сточки дописать." - это всегда!!!
2. "Джун косячит..." - хотя Краш клялся за ним следить, "как за собой" - его цитата.
3. "Краш оду пишет..." - нахер она кому нужна тут???? Речь не про оду...
4. А надо ли продолжать?

Фузинаторы - Вы дурачки?
541 CrushBy
 
03.11.19
13:45
(539) Я тут немного понял вот что, делать вот так вроде как нельзя :
FOR groupName(INTEGER i) AND NOT groupByName(groupName(i)) NEW g = Group DO {
name(g) <- groupName(i)
}

Поскольку, если это не будет скомпилировано в один запрос, то сначала вычисляется выражение, а затем идет по нему итерирование уже на сервере приложений. Так как таблица денормализованна, то создастся несколько групп с одинаковым именем и сохранение не пройдет по CONSTRAINT. Поэтому в моем примере шел GROUP MAX.
В целом важно понимать, что нужно стремиться, чтобы все компилировалось в SQL запрос, так как выполнение на сервере БД значительно быстрее чем round trip между сервером приложений и сервером БД.

[Может, немного сбил синтаксис локальных свойств, что вместо
groupName = DATA LOCAL ISTRING[100] (INTEGER);
нужно писать
LOCAL groupName = ISTRING[100] (INTEGER);]
Эти два объявления с точки зрения выполнения идентичны. Разница в том, что второе объявление видно только в пределах действия, а первое - в пределах модуля и зависимых от него модулей.

[С INLINE мне не совсем понятно. Есть ли небольшое ускорение, или и без INLINE компилятор нормально справился в данном случае.]
Итерирование на большом объеме в любом случае медленнее, если с INLINE они одинаковы, то или INLINE не сработал и запрос не скомпилировался, или наоборот, исходный скомпилировался. Вообще, с точки зрения выполнения это хорошо видно по "бегунку" в GUI. При итерировании будет идти бегунок, когда выполняется SQL запрос, то никакого бегунка быть не может, так как SQL запрос не возвращает данные о статусе своего выполнения в данный момент.

[Я бы предпочёл не указывать тип параметра ISTRING[100]].
Да, там можно не указывать. Платформа должна в таком случае вывести тип сама (если получится).
542 Salimbek
 
08.11.19
16:58
Тут Конкретные вопросы по lsFusion
Это:
// можно сделать хитрее, i2 закинуть в колонки выдаст матрицу 10x10 в ней будут значения

REQUIRE Utils; // Моя добавка, т.к. iterate в utils

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;
}


Пробую выполнить код на lsfusion.org/try - открывается пустое приложение, SHOW a не срабатывает?

Ну ок, запускаю IDEA, копирую туда этот код, в ответ: ERROR StartLogger - Exception while starting logics instance: [error]:    Main:11:5 single parameter is forbidden in this context
Subsequent errors (if any) could not be found.

Как я понял - это оно на HEADER (i2) ругается, но как и где поправить?
543 Ёпрст
 
08.11.19
18:12
(542) тестиь платформу ? Я чегой-то подзабил, хотя и развернул и демку с ерп даже запустил, лень
544 Bro
 
08.11.19
18:32
(542) Вообще сейчас не у компьютера, но по идее можно написать HEADER (i2+1-1) :) То есть ей не нравится в этом месте параметр, там да косяк был в этом месте. На самом деле в 2.1 это уже пофикшено ЕМНИП и даже уже релиз ее был. На сайте ссылки новые на нее не добавили. Хотя на download.lsfusion.org уже есть.
545 CrushBy
 
08.11.19
18:51
(542) Если речь идет о запуске в Try, то вот модифицированный код, который работает :
REQUIRE Utils; // Моя добавка, т.к. iterate в utils

a = DATA LONG (LONG, LONG);

FORM a
    OBJECTS i1=LONG
    FILTERS iterate(i1,1,10)

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

NAVIGATOR {
    NEW a;
}
546 Bro
 
08.11.19
19:13
(542) а понял теперь. На Try уже свежая версия 3.beta.0 (поэтому на HEADERS (i2) не ругается), а в инсталляторе вы 2.0 ставили где да была такая проблема.

А не запускается потому как run() в режиме платформы ничего не значит, это вы просто объявили действие с именем run. Оно играет роль в режиме СУБД (а точнее оператора EVAL или HTTP вызова eval например, который и выполняет EVAL) - там выполняется именно действие с именем run.
https://documentation.lsfusion.org/pages/viewpage.action?pageId=4915350
https://documentation.lsfusion.org/pages/viewpage.action?pageId=51216539
547 Salimbek
 
12.11.19
14:52
(546) И как обновиться с 2.0 до "3.beta.0" или чего там у вас самое новое?
548 Bro
 
12.11.19
15:13
(547) Последние snapshot версии вот тут (файлы с постфиксом assembly, это jar файлы все-в-одном вместе с зависимостимя ):
Сервер:
https://repo.lsfusion.org/nexus/service/rest/repository/browse/public/lsfusion/platform/server/3.beta.0-SNAPSHOT/
Десктоп-клиент:
https://repo.lsfusion.org/nexus/service/rest/repository/browse/public/lsfusion/platform/desktop-client/3.beta.0-SNAPSHOT/
Веб-клиент:
https://repo.lsfusion.org/nexus/service/rest/repository/browse/public/lsfusion/platform/web-client/3.beta.0-SNAPSHOT/

Инструкции тут в разделе Обновление:
https://documentation.lsfusion.org/pages/viewpage.action?pageId=57738078

Пока 3.beta.0 не выпускали, но в ближайшее время выпустим, тогда просто в download.lsfusion.org появится.
2 + 2 = 3.9999999999999999999999999999999...