|
Конкретные вопросы по 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
|
(284) Из вашего примера: https://documentation.lsfusion.org/pages/viewpage.action?pageId=2228636
|
|||
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
|
(515) Вот так: https://paste.pics/da5a90ef9f9a38699a499f77a695e45b
|
|||
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 появится. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |