LINUX.ORG.RU

lsFusion 6.0 — открытая и бесплатная платформа для разработки бизнес-приложений

 ,


3

1

Вышла новая версия lsFusion 6.0 — открытой и бесплатной платформы для разработки бизнес-приложений. В ней сделан упор на Web UX и расширение возможностей для создания современных веб-приложений.

  • Интеграция с Bootstrap

    Возможность применять bootstrap-классы ко всем элементам интерфейса через атрибут class, предустановленные светлая/тёмная темы и набор дополнительных bootstrap-тем «из коробки».

  • Поддержка иконок

    Подключены Bootstrap Icons и FontAwesome, есть автоматический подбор иконок по ключевым словам, возможность вставлять их в строки через $M{…}.

  • Новые компоненты выбора свойств

    Поддержка списков, чекбоксов (в том числе групп) и радиокнопок.

  • Явное задание тегов и типов <input>

    Полная поддержка HTML-атрибутов tag='input' и inputType (date, datetime-local, time, month, color, range и др.), включая нестандартный year через подключаемый yearpicker.

  • Расширенные атрибуты свойств

    placeholder, pattern/regexp и сообщения об ошибке, tooltip, wrap/wrapWordBreak/collapse, гибкая настройка расположения и выравнивания заголовков и комментариев, произвольные CSS-классы и атрибуты.

  • Popup-контейнеры

    Контейнеры с popup=TRUE, загружающие содержимое по нажатию кнопки, плюс предопределённый блок POPUP в дизайне форм (иконка «гамбургер»).

  • Неактивные свойства и действия

    DISABLE/DISABLEIF для статической и динамической блокировки элементов с нативным использованием Bootstrap-классов.

  • Интерактивные действия через интеграционное API

    Эндпоинты exec/eval могут открывать формы и выполнять действия в уже загруженных вкладках или PWA-клиенте.

  • Браузерные API: Share, Notification, Push

    • Share API: автоматическое добавление «поделиться формой», генерация ссылок через EXTERNAL LSF/HTTP и вызов стандартного диалога шаринга.
    • Notification API: показ контекстных уведомлений с картинкой, кнопками и callback-действиями.
    • Push API: серверные push-уведомления, инициирующие действия или выводящие уведомления даже при неактивном клиенте.
  • Поддержка PWA

    Установка в систему, push-уведомления вне браузера, доступ к аппаратному API устройства.

  • Уровни сообщений (MESSAGE)

    Шесть уровней — LOG, INFO, WARN, DEFAULT, SUCCESS, ERROR — с записью в лог, выводом нотификаций и/или диалоговых окон в зависимости от уровня.

  • Улучшенный навигатор и компактный UI

    • Выплывающая верхняя панель навигатора (вертикальная или горизонтальная)
    • Tiny и Mini CSS-стили для максимально компактного отображения
    • Направленные («arrow») кнопки для визуализации процессов
  • WebSocket-модуль

    Создание/удаление сокетов, обработка событий открытия/закрытия, приёма текстовых и бинарных сообщений, форма для управления соединениями.

  • Расширения языка платформы

    • Табличные значения в FORMULA (unnest, JSON-функции, подключение внешних таблиц)
    • Оператор VALUE для доступа к текущему значению объекта формы вне формы
    • Новые события на форме: CHANGE BEFORE/CHANGE AFTER, ON COLLAPSE/ON EXPAND
    • Явное задание имён таблиц, индексов и материализованных свойств в БД
    • Динамическое определение причины события через eventSource()
    • Кастомные агрегации в GROUP/PARTITION (mode, percentile_cont, lag, rank и др.)
    • Действия в блоке LIST оператора INPUT (список может заполняться результатами действий)
    • Управление порядками и фильтрами (чтение/запись текущих ORDER/FILTERGROUP/FILTER)
    • Raw-литералы (префикс r/R) для путей, регулярных выражений и других «сырых» строк
    • Опции TOP/OFFSET во многих операторах (GROUP, PARTITION, FOR, EXPORT, JSON, PRINT)

>>> Подробности



Проверено: hobbit ()
Последнее исправление: ilinsky (всего исправлений: 4)
Ответ на: комментарий от Obezyan

Развитый и быстрый поиск объектов в списках как в 1С. Это краеугольный камень автоматизации работы.

Имеется ввиду именно фильтрация записей на форме самими пользователем ? В lsFusion все списки «динамические» с точки зрения 1C, и там можно, как сортировать, так и фильтровать по любым колонкам и т.д. Более того, пользователь может считать количество отфильтрованных записей и суммы по любой колонке. 1С даже этого пока не смог сделать.

Наличие готовых и поддерживаемых конфигураций для реальных задач бизнеса. Голая платформа никому не нужна.

Есть коммерческая готовая конфигурация для розничного бизнеса : http://lsfusion-erp.com/

А также под Apache лицензией основа со многими готовыми процессами : https://demo.lsfusion.org/mycompany-ru

Многие используют ее как есть, или дорабатывают под свои нужды.

CrushBy
()
Ответ на: комментарий от monk

А смена 8.2 на 8.3? Что там революционного?

Я 8.3 не застал, но насколько помню там появился интерфейс такси или что то вроде того.

То есть, если для языка форм lsFusion сделать графический интерфейс, то будет лучше, чем в 1С?

Всегда можно что то улучшить.

Можешь помощь сообществу.

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

Rodegast ★★★★★
()
Ответ на: комментарий от Rodegast

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

Чисто из интереса, а какие вы реально работающие редакторы форм в вебе знаете? Можно было бы их прикрутить, только я если честно не особо знаю такие. И раз их нет, может просто они не особо удобны в принципе, и кодом, но декларативно (аля реакт) удобнее?

NitroJunkie
() автор топика

Вышла новая версияlsFusion 6.0— открытой и бесплатной платформы для разработки бизнес-приложений.

Ой, а что случилось с упоминанием 1с?

Ygor ★★★★★
()
Ответ на: комментарий от Ygor

Админы видно поменяли, так как 1С наехал. В 1С очень боятся lsFusion, понимая, что он в разы лучше 1С. Если на инфостарте (который принадлежит 1С) упомянть lsFusion, то сразу банят.

CrushBy
()
Ответ на: комментарий от monk

Графическость редактора форм не даёт ничего кроме видимости. Один фиг ты просто вытаскиваешь переменные формы на дерево и группировками собираешь их примерно в то что хочешь получить. Окошко внизу показывает как это будет выглядеть очень примерно. В ls fusion это приходит примерно так же.

Графический редактор форм остался во временах старых форм и больше к нему возврата не будет.

AleksK ★★★
()
Ответ на: комментарий от AleksK

Графическость редактора форм не даёт ничего кроме видимости.

Нет. Она даёт палитру свойств. Чтобы не писать руками OBJECTS, а нащёлкивать из списка доступных. Чтобы не писать NEW, NEWSESSION EDIT, а отмечать галочками.

А предпросмотр как раз почти не важен.

monk ★★★★★
()
Ответ на: комментарий от monk

Дело привычки. Мышка в таких делах только замедляет и делает процесс более муторным

AleksK ★★★
()
Ответ на: комментарий от NitroJunkie

Можно было бы их прикрутить, только я если честно не особо знаю такие.

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

может просто они не особо удобны в принципе, и кодом, но декларативно (аля реакт) удобнее?

Удобство во многом субъективно. Но если хочешь позиционировать lsFusion именно как «убийцу 1С», то придётся делать редактор форм, работать над документацией, готовить обучающие программы и ещё очень много чего дорабатывать.

Rodegast ★★★★★
()
Ответ на: комментарий от monk

Нет. Она даёт палитру свойств. Чтобы не писать руками OBJECTS, а нащёлкивать из списка доступных. Чтобы не писать NEW, NEWSESSION EDIT, а отмечать галочками.

Для этого completion есть (в том числе AI), то есть можно пару букв набрать, enter, это гораздо быстрее чем мышкой чаще всего.

NitroJunkie
() автор топика
Ответ на: комментарий от CrushBy

Имеется ввиду именно фильтрация записей на форме самими пользователем ?

Имеется ввиду скорость и гибкость с которой она работает даже на большом количестве записей. На ней основаны все фильтры подбора и тд. Это самая технологичная часть платформы 1С.

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

Количество показывает при необходимости, а суммы выводятся отчетами, в окнах поиска и подбора они просто не нужны. Зачем считать сумму по ВСЕМ счетам конкретной ООО если мы сейчас ищем конкретный счет в окне подбора элемента Счет?

Obezyan
()
Последнее исправление: Obezyan (всего исправлений: 2)
Ответ на: комментарий от Obezyan

Имеется ввиду скорость и гибкость с которой она работает даже на большом количестве записей. На ней основаны все фильтры подбора и тд. Это самая технологичная часть платформы 1С.

Да ладно. 1С даже в predicate push down вроде как не умеет. https://habr.com/ru/companies/lsfusion/articles/468415/#opt

Скажем если вы в lsFusion вытянете на форму контрагентов сумму по всем его документам скажем, то при пользовательском отборе наример контрагентов с именем X, этот же предикат попадет внутрь группировочного подзапроса (это и называется predicate push down), и сумма будет подсчитана только для ограниченного числа контрагентов. Как с этим у 1С?

NitroJunkie
() автор топика
Ответ на: комментарий от NitroJunkie

Да ладно. 1С даже в predicate push down вроде как не умеет. https://habr.com/ru/companies/lsfusion/articles/468415/#opt

Умеет, только в другом месте. Там это называется Система Компоновки Данных. Позволяет переписывать запросы на основании выбранных полей и отборов в конечном запросе. Изначально придумали для отчётов, но в случае неопределённых отборов и в других местах используют.

В форме списка она автоматически запрос обрабатывает.

monk ★★★★★
()
Ответ на: комментарий от CrushBy

Более того, пользователь может считать количество отфильтрованных записей и суммы по любой колонке.

То есть, если у меня 10 миллионов записей и я на них поставлю какой-то отбор, под который попадает полмиллиона, то я не увижу свои полсотни строк, которые попадают в видимую часть окна, пока по тому полумиллиону не посчитаются итоги?

1С даже этого пока не смог сделать.

Не не смог, а не захотел. Благодаря этому формы списка работают на порядок быстрее, чем формирование отчёта.

monk ★★★★★
()
Ответ на: комментарий от NitroJunkie

Да ладно.

Создаете новый документ, например Счет. В нем есть поле Номенклатура которое ссылается на Справочник -> Товары. В этом справочники сотни тысяч товаров: болты, гайки, крепеж всех видов и диаметров со своей ценой, остатками по складам и тд.

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

Obezyan
()
Ответ на: комментарий от Rodegast

Эпично тупит тот кто её с 1С сравнивает :D

Идиотам не понять, что платформа 1С и конфигурация 1С даже продаются отдельно. Это все равно что говорить windows, а подразумевать excel, оба же микрософт!

Ты читаешь то, что хочешь прочитать. Что кто-то сделал для тебя новую бухгалтерию взамен 1С бухгалтерии с которой ты побежишь внедрять ее к себе в бухгалтерию, чтоб тебя там погладили по головке. Хотя слова «бухгалтерия» в новости вообще отсутствует!

usermod
()
Ответ на: комментарий от usermod

Это все равно что говорить windows, а подразумевать excel, оба же микрософт!

Такие тоже бывают. Когда на предложение перейти на Linux заявляют, что ОС, в которой нет полнофункционального аналога Excel и Outlook неполноценна.

monk ★★★★★
()
Ответ на: комментарий от monk

Умеет, только в другом месте. Там это называется Система Компоновки Данных. Позволяет переписывать запросы на основании выбранных полей и отборов в конечном запросе. Изначально придумали для отчётов, но в случае неопределённых отборов и в других местах используют.

В форме списка она автоматически запрос обрабатывает.

А есть где почитать, как это работает? Просто единственный вариант реализовать predicate push down, это по сути запускать cost-based оптимизированный перебор с построением лучшего плана выполнения. Для этого нужна статистика, в том числе по индексам и т.п. А главное это все должно быть очень быстро, так как вы не знаете, какой отбор наложит пользователь. Во всяком случае в lsFusion это так работает.

То есть переписывание запросов автоматическое на лету? И откуда она статистику берет для такого переписывания?

Ну и вот это тогда зачем https://its.1c.ru/db/metod8dev#content:2657:hdoc ?

NitroJunkie
() автор топика
Ответ на: комментарий от Obezyan

Я вам больше скажу, в lsFusion нечеткий поиск есть (то есть с учетом словоформ). И с поддержкой всех индексов.

https://habr.com/ru/companies/lsfusion/articles/862418/#matching

И как раз в отличии от 1С, lsFusion умеет в predicate push down на лету, то есть берет окно выборки скажем 30 записей и проталкивает их внутрь подзапросов. То есть подзапросы (остатки, суммы по документам) считаются только для видимых (!) 30 записей. И все из коробки, разработчик про это вообще не знает. Я знаю кучу проектов на террабайты данных (розничные сети) где разработчики даже что такое SQL не знают (все эти ЛЕВЫЕ СОЕДИНЕНИЯ и прочее). И эти террабайтные базы с тысячами пользователей, умудряются на одном (!) серваке работате (то есть даже без горизонтального масштабирования)

NitroJunkie
() автор топика
Ответ на: комментарий от monk

Такие тоже бывают. Когда на предложение перейти на Linux заявляют, что ОС, в которой нет полнофункционального аналога Excel и Outlook неполноценна.

Так любая ОС для конечного пользователя сама по себе неполноценна. Как и любая платформа, включая платформу 1С. Но новость про платформу, а не про законченное решение.

Можно поспорить, про наличие полнофункционального аналога Excel и необходимость глюкодрома Outlook, в моем случае libreoffice прекрасно закрывает все потребности в офисном пакете, а thunderbird и вовсе работает, в отличие от outlook. Но факт остается фактом, пользователь использует сами программы и без них ему ОС ни к чему, эта новость явно не для пользователя.

usermod
()
Ответ на: комментарий от NitroJunkie

А есть где почитать, как это работает? Просто единственный вариант реализовать predicate push down, это по сути запускать cost-based оптимизированный перебор с построением лучшего плана выполнения.

Зачем. Вот есть запрос

ВЫБРАТЬ
  Номенклатура,
  Склад,
  Количество,
  ...
ПОМЕСТИТЬ ВТОстатки
ИЗ 
  РегистрНакопления.УчетНоменклатуры.Остатки;

ВЫБРАТЬ
  Номенклатура,
  Склад,
  Количество,
  ...
ПОМЕСТИТЬ ВТОбороты
ИЗ 
  ...;

ВЫБРАТЬ
    Спр.Ссылка КАК Номенклатура,
    Остатки.Количество КАК Остаток,
    Обороты.Количество КАК Оборот,
    ...
ИЗ
    Справочник.Номенклатура
        ЛЕВОЕ СОЕДИНЕНИЕ ВТОстатки КАК Остатки ПО ...
        ЛЕВОЕ СОЕДИНЕНИЕ ВТОбороты КАК Обороты ПО ...

Пользователь ставит отбор по номенклатуре в списке и выводит только номенклатуру и количество. СКД автоматически добавляет отбор к временной таблице и выкидывает всё ненужное

ВЫБРАТЬ
  Номенклатура,
  Количество
ПОМЕСТИТЬ ВТОстатки
ИЗ 
  РегистрНакопления.УчетНоменклатуры.Остатки(, Номенклатура В (&П1));


ВЫБРАТЬ
    Спр.Ссылка КАК Номенклатура,
    Остатки.Количество КАК Остаток
ИЗ
    Справочник.Номенклатура
        ЛЕВОЕ СОЕДИНЕНИЕ ВТОстатки КАК Остатки ПО ...
ГДЕ Номенклатура В (&П1)
monk ★★★★★
()
Последнее исправление: monk (всего исправлений: 1)
Ответ на: комментарий от NitroJunkie

Ну и вот это тогда зачем https://its.1c.ru/db/metod8dev#content:2657:hdoc ?

Это про то, что виртуальная таблица не совсем таблица. Это на самом деле скорее хранимая процедура. Поэтому её вообще нежелательно прямо в запросе использовать. Я бы то, что по ссылке, писал как

ВЫБРАТЬ 
    РасходнаяНакладнаяСостав.Номенклатура КАК Номенклатура,
    СУММА(РасходнаяНакладнаяСостав.Количество) КАК Количество
ПОМЕСТИТЬ ВТСтроки
ИЗ
    Документ.РасходнаяНакладная.Состав КАК РасходнаяНакладнаяСостав
ГДЕ РасходнаяНакладнаяСостав.Ссылка = &Документ
СГРУППИРОВАТЬ ПО РасходнаяНакладнаяСостав.Номенклатура;

ВЫБРАТЬ 
    Номенклатура,
    КоличествоОстаток 
ПОМЕСТИТЬ ВТОстатки
ИЗ
РегистрНакопления.УчетНоменклатуры.Остатки(, Номенклатура В (ВЫБРАТЬ Номенклатура ИЗ ВТСтроки));

ВЫБРАТЬ
    Состав.Номенклатура, 
    Состав.Номенклатура.Представление КАК Представление, 
    Состав.Количество,
    УчетНоменклатурыОстатки.КоличествоОстаток
ИЗ
    ВТСтроки КАК Состав
    ЛЕВОЕ СОЕДИНЕНИЕ ВТОстатки КАК УчетНоменклатурыОстатки 
        ПО УчетНоменклатурыОстатки.Номенклатура = Состав.Номенклатура
ГДЕ
    УчетНоменклатурыОстатки.КоличествоОстаток < Состав.Количество 
      ИЛИ УчетНоменклатурыОстатки.КоличествоОстаток ЕСТЬ NULL

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

monk ★★★★★
()
Ответ на: комментарий от NitroJunkie

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

А выше написано, что по остаткам и суммам итог виден по всем.

monk ★★★★★
()
Ответ на: комментарий от usermod

в моем случае libreoffice прекрасно закрывает все потребности в офисном пакете, а thunderbird и вовсе работает, в отличие от outlook

Вот кому-то lsFusion ERP прекрасно закрывает все потребности. Поэтому, если Linux аналог Windows, то lsFusion аналог 1С.

monk ★★★★★
()
Ответ на: комментарий от monk

Ну это выглядит как эвристика для одного частного случая. А если есть скажем соединение Номенклатуры с другой таблицей (с каким нибудь регистром сведений например) и пользователь ставит отбор на значение из этой таблицы? Как она соединение с этой другой таблицей в остатки протолкнет (там вместе с соединением надо проталкивать)? А главное как она поймет надо ли проталкивать или быстрее выполнить для всех? Или если условие соединения ПО не просто 1 к 1? И т.д.

Собственно в примере тут

https://its.1c.ru/db/metod8dev#content:2657:hdoc

ВЫБРАТЬ
    РасходнаяНакладнаяСостав.Номенклатура,
    УчетНоменклатурыОстатки.КоличествоОстаток
ИЗ
    Документ.РасходнаяНакладная.Состав КАК РасходнаяНакладнаяСостав
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.УчетНоменклатуры.Остатки КАК УчетНоменклатурыОстатки
        ПО УчетНоменклатурыОстатки.Номенклатура = РасходнаяНакладнаяСостав.Номенклатура
ГДЕ
    РасходнаяНакладнаяСостав.Ссылка = &Документ

СКД протолкнет, а не СКД нет? Это как?

Нафига это огород городить (lsFusion если что все это автоматически делает)?

ВЫБРАТЬ
    Состав.Номенклатура, 
    Состав.Номенклатура.Представление КАК Представление, 
    Состав.Количество,
    УчетНоменклатурыОстатки.КоличествоОстаток
ИЗ
    (ВЫБРАТЬ 
             РасходнаяНакладнаяСостав.Номенклатура КАК Номенклатура,
             СУММА(РасходнаяНакладнаяСостав.Количество) КАК Количество
         ИЗ
             Документ.РасходнаяНакладная.Состав КАК РасходнаяНакладнаяСостав
         ГДЕ РасходнаяНакладнаяСостав.Ссылка = &Документ
         СГРУППИРОВАТЬ ПО РасходнаяНакладнаяСостав.Номенклатура) КАК Состав
     ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.УчетНоменклатуры.Остатки(,
                                                   Номенклатура В (
                                                        ВЫБРАТЬ 
                                                            Документ.РасходнаяНакладная.Состав.Номенклатура 
                                                        ИЗ
                                                            Документ.РасходнаяНакладная.Состав 
                                                        ГДЕ
                                                            Документ.РасходнаяНакладная.Состав.Ссылка = &Документ)
                                                   ) КАК УчетНоменклатурыОстатки 
         ПО УчетНоменклатурыОстатки.Номенклатура = Состав.Номенклатура
ГДЕ
    (УчетНоменклатурыОстатки.КоличествоОстаток < Состав.Количество 
     ИЛИ (УчетНоменклатурыОстатки.КоличествоОстаток) ЕСТЬ NULL )
NitroJunkie
() автор топика
Ответ на: комментарий от NitroJunkie

где разработчики даже что такое SQL не знают

Вот эта магия мне тоже нравится. Но хочется попробовать что-то тяжёлое 1С-ное туда перетащить и посмотреть, как справится. Типа партионного учёта себестоимости для столовой (где у каждого блюда куча полуфабрикатов из кучи ингридиентов).

Объём базы сам по себе ни на что не влияет, если запросы простые (время работы запроса с индексом логарифмически зависит от объёма БД).

террабайтные

Земляные байты :-).

monk ★★★★★
()
Ответ на: комментарий от monk

Не понял. То есть если inline’ишь Остатки в запрос, то платформа не проталкивает предикат, а если через временную таблицу проталкивает? (тут это скорее на CTE похоже, потому как в императивном коде проталкивание это адский ад, нужно следить за последействием)

И зачем вот это делать? Если оптимизатор сам может и должен это делать (в lsFusion он так и делает)? И как вы говорите СКД и делает.

Остатки(, Номенклатура В (ВЫБРАТЬ Номенклатура ИЗ ВТСтроки));
NitroJunkie
() автор топика
Последнее исправление: NitroJunkie (всего исправлений: 1)
Ответ на: комментарий от NitroJunkie

СКД протолкнет, а не СКД нет? Это как?

Потому что СКД для отчётов, где отборы могут быть произвольные и выбираются пользователем. А запросы формируются программистом для фиксированного отбора и разработчики платформы 1С предполагают, что программист знает, что делает. Хотя в MS SQL первый запрос может работать почти со скоростью второго (там оптимизатор слишком умный). Когда на PostgreSQL переходили, столько говнокода в запросах типовой конфигурации обнаружили…

monk ★★★★★
()
Ответ на: комментарий от monk

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

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

NitroJunkie
() автор топика
Ответ на: комментарий от monk

Так а все-таки. Код из примера:

ВЫБРАТЬ
    РасходнаяНакладнаяСостав.Номенклатура,
    УчетНоменклатурыОстатки.КоличествоОстаток
ИЗ
    Документ.РасходнаяНакладная.Состав КАК РасходнаяНакладнаяСостав
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.УчетНоменклатуры.Остатки КАК УчетНоменклатурыОстатки
        ПО УчетНоменклатурыОстатки.Номенклатура = РасходнаяНакладнаяСостав.Номенклатура
ГДЕ
    РасходнаяНакладнаяСостав.Ссылка = &Документ

СКД оптимизирует в:

ВЫБРАТЬ
    Состав.Номенклатура, 
    Состав.Номенклатура.Представление КАК Представление, 
    Состав.Количество,
    УчетНоменклатурыОстатки.КоличествоОстаток
ИЗ
    (ВЫБРАТЬ 
             РасходнаяНакладнаяСостав.Номенклатура КАК Номенклатура,
             СУММА(РасходнаяНакладнаяСостав.Количество) КАК Количество
         ИЗ
             Документ.РасходнаяНакладная.Состав КАК РасходнаяНакладнаяСостав
         ГДЕ РасходнаяНакладнаяСостав.Ссылка = &Документ
         СГРУППИРОВАТЬ ПО РасходнаяНакладнаяСостав.Номенклатура) КАК Состав
     ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.УчетНоменклатуры.Остатки(,
                                                   Номенклатура В (
                                                        ВЫБРАТЬ 
                                                            Документ.РасходнаяНакладная.Состав.Номенклатура 
                                                        ИЗ
                                                            Документ.РасходнаяНакладная.Состав 
                                                        ГДЕ
                                                            Документ.РасходнаяНакладная.Состав.Ссылка = &Документ)
                                                   ) КАК УчетНоменклатурыОстатки 
         ПО УчетНоменклатурыОстатки.Номенклатура = Состав.Номенклатура

Или нет?

NitroJunkie
() автор топика
Последнее исправление: NitroJunkie (всего исправлений: 1)
Ответ на: комментарий от NitroJunkie

Не понял. То есть если inline’ишь Остатки в запрос, то платформа не проталкивает предикат, а если через временную таблицу проталкивает (тут это скорее на CTE похоже, потому как в императивном? коде проталкивание это адский ад, нужно следить за последействием)

Отбор проталкивает.

И как вы говорите СКД и делает.

Вот такое не сделает. Проталкивает отбор пользователей. Типа

Остатки(, Номенклатура В (&НоменклатураВыбраннаяПользователем));

А здесь по временной таблице, поэтому только руками.

monk ★★★★★
()
Ответ на: комментарий от monk

Так а если пользовательский отбор чуть более сложный, чем просто одна номенклатура? То есть пользователь отобрал по полю которое получается соединением (как в примере скажем РасходнаяНакладнаяСостав.Ссылка = &Документ)? Что тогда будет?

Что в таком случае вообще разработчик вообще может / должен сделать?

NitroJunkie
() автор топика
Последнее исправление: NitroJunkie (всего исправлений: 1)
Ответ на: комментарий от NitroJunkie

Нет. СКД только про оптимизацию через наложение отборов пользователя.

Вот из

ВЫБРАТЬ
    РасходнаяНакладнаяСостав.Номенклатура,
    УчетНоменклатурыОстатки.КоличествоОстаток
ИЗ
    Документ.РасходнаяНакладная.Состав КАК РасходнаяНакладнаяСостав
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.УчетНоменклатуры.Остатки КАК УчетНоменклатурыОстатки
        ПО УчетНоменклатурыОстатки.Номенклатура = РасходнаяНакладнаяСостав.Номенклатура
ГДЕ
    РасходнаяНакладнаяСостав.Ссылка = &Документ

может сделать

ВЫБРАТЬ
    РасходнаяНакладнаяСостав.Номенклатура,
    УчетНоменклатурыОстатки.КоличествоОстаток
ИЗ
    Документ.РасходнаяНакладная.Состав КАК РасходнаяНакладнаяСостав
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.УчетНоменклатуры.Остатки(, Номенклатура В (&П1)) КАК УчетНоменклатурыОстатки
        ПО УчетНоменклатурыОстатки.Номенклатура = РасходнаяНакладнаяСостав.Номенклатура
ГДЕ
    РасходнаяНакладнаяСостав.Ссылка = &Документ И Номенклатура В (&П1)
monk ★★★★★
()
Ответ на: комментарий от monk

Проблема таких проталкиваний, что это частный случай. Шаг влево, шаг вправо, и она ломается. А тогда на террабайтных базах все начинает ложиться. Пока не доделали навернутый cost-based оптимизатор у нас так и было (все же люди которые пишут на lsFusion чаще всего не разбираются в этих всех соединениях и т.п.). Хотя с другой стороны не спорю, лучше чем ничего.

Но до lsFusion с cost-based проталкиванием расти и расти :) Там вообще ничем таким загоняться не надо, чисто делаешь логику, а за производительность платформа отвечает.

NitroJunkie
() автор топика
Последнее исправление: NitroJunkie (всего исправлений: 5)
Ответ на: комментарий от NitroJunkie

Я вам больше скажу, в lsFusion нечеткий поиск есть

Так нечеткий поиск это не проблема тк это умеет дажа сама БД аля Postgres (pg_trgm). Я даже когда-то прикручивал к 1С фасеточный поиск с помощью Apache Solr, но не суть.

Проблема - это четкий поиск, который остается быстрым на больших объемах данных. В 1С этого смогли добиться, а у lsFusion все плохо, даже со специальными индексами. Это напрямую влияет на отзывчивость интерфейса и скорость работы. Невозможно каждый день работать с формами которые подлагивают на секунды при поиске.

И как раз в отличии от 1С, lsFusion умеет в predicate push down на лету, то есть берет окно выборки скажем 30 записей

1С больше десятилетия умеет в подобный predicate push down. По ссылке что я выше указал это все есть.

Я знаю кучу проектов на террабайты данных (розничные сети) где разработчики даже что такое SQL не знают (все эти ЛЕВЫЕ СОЕДИНЕНИЯ и прочее).

Обманываете.

  1. Розницы с терабайтами данных это магазины уровня Лента/Магнит, а там во всю используется кластеризация и этот терабайт размазан по кластеру как масло по хлебу.
  2. На точках используются синхронизация либо выгрузки/загрузки. Каждая точка имеет свой набор данных, например, ассортимент товаров отличается и терабайта в конкретном магазине нет никогда.
  3. Разработчики которые вообще не знаю SQL и на пушечный выстрел не подпускаются к проектам из пункта 1.

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

Obezyan
()
Ответ на: комментарий от NitroJunkie

Но до lsFusion с cost-based проталкиванием расти и расти

Ну вы серьезно рассчитываете вот этим произвести впечатление?

Стоимостная оценка запроса встроена в оптимизатор запросов SQL.

Obezyan
()
Ответ на: комментарий от Obezyan

Проблема - это четкий поиск, который остается быстрым на больших объемах данных. В 1С этого смогли добиться, а у lsFusion все плохо, даже со специальными индексами. Это напрямую влияет на отзывчивость интерфейса и скорость работы. Невозможно каждый день работать с формами которые подлагивают на секунды при поиске.

Чего смогли добиться? Поиск быстрее чем за log сделать? Издеваетесь? При наличии индекса lsFusion ищет мгновенно, а в отсутствии что можно сделать?

1С больше десятилетия умеет в подобный predicate push down. По ссылке что я выше указал это все есть.

Не умеет же. Мы собственно с monk выше только это обсудили (что умеет только один частный случай, и тот почему-то только в СКД)

Розницы с терабайтами данных это магазины уровня Лента/Магнит, а там во всю используется кластеризация и этот терабайт размазан по кластеру как масло по хлебу.

Нет. Террабайт это обычная сеть из 200 супермаркетов со сложной логикой. Ну да или 2000 с простой. И как раз lsFusion за счет оптимизаторов + оптимальной структуре БД позволяет и без кластера работать.

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

На lsFusion все в одной базе. Синхронизация это что-то из 90-х.

Разработчики которые вообще не знаю SQL и на пушечный выстрел не подпускаются к проектам из пункта 1. Резюмируя, ваша лапша с обилием восклицательных знаков может подействовать на далекого от темы пользователя, но не того кто 12 лет жизни потратил на комплексную автоматизацию предприятий.

Ну в lsFusion ERP именно так: https://lsfusion-erp.com/ Хотите приезжайте, организую экскурсию, где все своими глазами увидите.

NitroJunkie
() автор топика
Последнее исправление: NitroJunkie (всего исправлений: 1)
Ответ на: комментарий от Obezyan

Ну вы серьезно рассчитываете вот этим произвести впечатление? Стоимостная оценка запроса встроена в оптимизатор запросов SQL.

Да ладно. В Postgres скажем predicate push down вообще нет. https://habr.com/ru/companies/lsfusion/articles/463095/#commjppd Да и в остальных СУБД не айс, можете почитать остальные пункты и посмотреть реальные планы (если не верите, можете проверить сами, там скрипты есть).

NitroJunkie
() автор топика
Ответ на: комментарий от NitroJunkie

Не умеет же.

Это стандартный функционал SQL доступный в 1С в спомощью ключевого слова ПЕРВЫЕ.

Мы собственно с monk выше только это обсудили

Мне было лень читать. Вот вам неплохой пример со стоимостной оценкой оптимизатора запросов и с поиском по некластеризованным индексам с предикатами и прочее что вы преподносите как какую-то иновацию.

На lsFusion все в одной базе. Синхронизация это что-то из 90-х.

Кек, на этом можно максимум розницу автоматизировать, не более того.

Ну в lsFusion ERP именно так: https://lsfusion-erp.com/ Хотите приезжайте, организую экскурсию, где все своими глазами увидите.

F такому отделу разработчиков приложения которое хранит данные в SQL базе.

Я давно не работаю в этой сфере, просто зацепился глаз как в откровенно рекламном посте в обсуждении пошли попытки сравнения с 1С. Вы очевидно находитесь в разных лигах и попытки рассказать что, а вот у нас есть то чего нет у конкурентов выглядят как просто незнание платформы этих самых конкурентов. Лучше оставьте сравнение с 1С конкурентам их весовой категории, например, SAP R3.

В 1С Bootstrap иконок нет, это да. Тут не поспоришь.

Obezyan
()
Ответ на: комментарий от Obezyan

Это стандартный функционал SQL доступный в 1С в спомощью ключевого слова ПЕРВЫЕ.

Вы точно знаете, что такое predicate push down? С какого боку тут ПЕРВЫЕ? Лучше реально прочитайте нашу переписку с monk, она короткая.

Кек, на этом можно максимум розницу автоматизировать, не более того.

В смысле? Как раз розница с точки зрения автоматизации самая сложная. Потому как тысячи одновременных пользователей в 1к километров друг от друга. А фантазии менеджеров такие, что в одном https://github.com/lsfusion-solutions/erp под миллион строк декларативного (!) кода (это как 30 млнов 1Скового), а у некоторых клиентов еще сверху столько же.

F такому отделу разработчиков приложения которое хранит данные в SQL базе.

А где ему их хранить? На листиках.

Я давно не работаю в этой сфере, просто зацепился глаз как в откровенно рекламном посте в обсуждении пошли попытки сравнения с 1С. Вы очевидно находитесь в разных лигах и попытки рассказать что, а вот у нас есть то чего нет у конкурентов выглядят как просто незнание платформы этих самых конкурентов. Лучше оставьте сравнение с 1С конкурентам их весовой категории, например, SAP R3.

Ну тут соглашусь про разные лиги. Если честно не знаю на 1С ни одного внедрения на > 200 супермаркетов в одной базе с логикой уровня ERP (единственное специализированное решение на 1С аля Астор больше 60 не тянет, есть вроде парочка внедрений, где все ложилось после этого объема), так как такую нагрузку 1С просто физически не потянет.

NitroJunkie
() автор топика
Последнее исправление: NitroJunkie (всего исправлений: 2)
Ответ на: комментарий от NitroJunkie

Да ладно. В Postgres скажем predicate push down вообще нет.

Шта? Вы сейчас на серьезных щщах? Там и предикаты и inline conditionals и много чего еще. Например, в запросах с объединением чтобы предикат протолкнулся дальше нужно использовать UNION ALL вместо UNION. С аггрегирующими функциями ситуация похуже, но и там выкрутились и сделали virtual tables и window functions.

В 1С это называется временные таблицы и оконные функции, если я правильно помню.

https://habr.com/ru/companies/lsfusion/articles/463095/#commjppd

Начал читать комменты, вы были правы, ваши разработчики не знают SQL.

Obezyan
()
Последнее исправление: Obezyan (всего исправлений: 1)
Ответ на: комментарий от NitroJunkie

Вы точно знаете, что такое predicate push down?

Да куда мне, обезъяну. У меня и все что после WHERE/LIKE - тоже предикаты.

Как раз розница с точки зрения автоматизации самая сложная.

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

Obezyan
()
Ответ на: комментарий от Obezyan

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

Для формы поиска розница сложнее. Потому что производственник может ждать 2 минуты пока проведётся документ, а кассир в супермаркете нет. Поэтому, кстати, 1С: Управление Торговлей 11 в рознице приживается очень плохо и приходится ставить в магазины 1С: Розницу, а на склад 1С: Управление Торговлей (в Рознице аналитики нет).

monk ★★★★★
()
Последнее исправление: monk (всего исправлений: 1)
Ответ на: комментарий от NitroJunkie

Нет. Террабайт это обычная сеть из 200 супермаркетов со сложной логикой. Ну да или 2000 с простой. И как раз lsFusion за счет оптимизаторов + оптимальной структуре БД позволяет и без кластера работать.

Наверное, вопрос должен звучать так: сколько товаров в ассортименте? И работает ли у продавца подбор по остаткам (то есть, может ли покупатель спросить о наличии товара, а продавец посмотреть, и если есть, зарезервировать)?

На lsFusion все в одной базе. Синхронизация это что-то из 90-х.

Если Интернет лёг, супермаркет закрывается?

monk ★★★★★
()
Ответ на: комментарий от monk

Вот кому-то lsFusion ERP прекрасно закрывает все потребности. Поэтому, если Linux аналог Windows, то lsFusion аналог 1С.

Linux, безусловно, аналог windows. Оба продукта существуют, делают одно и (не)полностью друг друга заменяют. И у них еще много аналогов - android, ios, макось, тизен, хармоньОС и еще больше неназванного, с разными нишами, специализацией, распространенностью и совершенством.

А продукта 1С попросту не существует. У меня, например, работают два продукта 1С, 1С бухгалтерия и 1С ЗУП. И ни одной ERP. Получается, не только lsFusion ERP, но и сама 1С не является аналогом 1С? Иначе зачем я должен поддерживать две разные 1С для бухгалтера и кадровика?

Я ни одной системы ERP и даже CRM, не видел, которую можно было бы внедрить в режиме поставил и пользуйся. Везде куча доделок, интеграций и своих процессов. Так что ERP это всегда прежде всего платформа, конструктор, а не конечное решение, под которое на предприятие создают свой отдел разработки и внедрения.

Никогда не видел, сколько народу сопровождают икону erp, SAP R3? И что она умеет делать из коробки? Вот и этот продукт развивают в первую очередь, как платформу и в новости все новшества, это абстрактные примитивы платформы. Если ты вообразил себе какой нибудь джанго, аналог мифического продукта «яндекс», хотя тебе ясно написали, аналог чего конкретно они делают, то кто в этом виноват?

usermod
()
Ответ на: комментарий от Obezyan

Шта? Вы сейчас на серьезных щщах? Там и предикаты и inline conditionals и много чего еще. Например, в запросах с объединением чтобы предикат протолкнулся дальше нужно использовать UNION ALL вместо UNION. С аггрегирующими функциями ситуация похуже, но и там выкрутились и сделали virtual tables и window functions.

В 1С это называется временные таблицы и оконные функции, если я правильно помню.

Причем тут временные, виртуальные таблицы и оконные функции? Вы о чем?

Predicate push down, это когда условие верхнего запроса проталкивается внутрь подзапроса (как правило агрегирующего, потому как да, обычные даже Postgres часто умеют инлайнить).

Собственно кидал выше ссылку из ИТС (https://its.1c.ru/db/metod8dev#content:2657:hdoc) если вам лень искать:

Когда запрос в стиле:

ВЫБРАТЬ
    РасходнаяНакладнаяСостав.Номенклатура,
    УчетНоменклатурыОстатки.КоличествоОстаток
ИЗ
    Документ.РасходнаяНакладная.Состав КАК РасходнаяНакладнаяСостав
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.УчетНоменклатуры.Остатки КАК УчетНоменклатурыОстатки
        ПО УчетНоменклатурыОстатки.Номенклатура = РасходнаяНакладнаяСостав.Номенклатура
ГДЕ
    РасходнаяНакладнаяСостав.Ссылка = &Документ

Автоматически оптимизируется в:

ВЫБРАТЬ
    Состав.Номенклатура, 
    Состав.Номенклатура.Представление КАК Представление, 
    Состав.Количество,
    УчетНоменклатурыОстатки.КоличествоОстаток
ИЗ
    (ВЫБРАТЬ 
             РасходнаяНакладнаяСостав.Номенклатура КАК Номенклатура,
             СУММА(РасходнаяНакладнаяСостав.Количество) КАК Количество
         ИЗ
             Документ.РасходнаяНакладная.Состав КАК РасходнаяНакладнаяСостав
         ГДЕ РасходнаяНакладнаяСостав.Ссылка = &Документ
         СГРУППИРОВАТЬ ПО РасходнаяНакладнаяСостав.Номенклатура) КАК Состав
     ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.УчетНоменклатуры.Остатки(,
                                                   Номенклатура В (
                                                        ВЫБРАТЬ 
                                                            Документ.РасходнаяНакладная.Состав.Номенклатура 
                                                        ИЗ
                                                            Документ.РасходнаяНакладная.Состав 
                                                        ГДЕ
                                                            Документ.РасходнаяНакладная.Состав.Ссылка = &Документ)
                                                   ) КАК УчетНоменклатурыОстатки 
         ПО УчетНоменклатурыОстатки.Номенклатура = Состав.Номенклатура

В пострес тоже такой оптимизации нет: https://habr.com/ru/companies/lsfusion/articles/463095/#commjppd

SELECT income.quantity
	FROM product
	JOIN
		(SELECT product, SUM(quantity) AS quantity
			FROM shipmentDetail 
			JOIN shipment ON shipmentDetail.shipment = shipment.id
			GROUP BY product
		) income ON income.product = product.id
	WHERE product."group" = 54
"  Hash Cond: (shipmentdetail.product = product.id)"
"  ->  HashAggregate  (cost=252763.56..253394.04 rows=50439 width=36) (actual time=11579.912..11603.696 rows=50000 loops=1)"
"        Group Key: shipmentdetail.product"
"        ->  Hash Join  (cost=2985.02..202764.28 rows=9999855 width=9) (actual time=46.117..5967.219 rows=10000001 loops=1)"
"              Hash Cond: (shipmentdetail.shipment = shipment.id)"
"              ->  Seq Scan on shipmentdetail  (cost=0.00..173528.55 rows=9999855 width=13) (actual time=0.017..1158.157 rows=10000001 loops=1)"
"              ->  Hash  (cost=1735.01..1735.01 rows=100001 width=4) (actual time=45.798..45.798 rows=100001 loops=1)"
"                    Buckets: 131072  Batches: 1  Memory Usage: 4540kB"
"                    ->  Seq Scan on shipment  (cost=0.00..1735.01 rows=100001 width=4) (actual time=0.018..19.940 rows=100001 loops=1)"
"  ->  Hash  (cost=136.88..136.88 rows=49 width=4) (actual time=0.202..0.202 rows=48 loops=1)"
"        Buckets: 1024  Batches: 1  Memory Usage: 10kB"
"        ->  Bitmap Heap Scan on product  (cost=4.67..136.88 rows=49 width=4) (actual time=0.045..0.181 rows=48 loops=1)"
"              Recheck Cond: ("group" = 54)"
"              Heap Blocks: exact=46"
"              ->  Bitmap Index Scan on product_group  (cost=0.00..4.66 rows=49 width=0) (actual time=0.025..0.025 rows=48 loops=1)"
"                    Index Cond: ("group" = 54)"
"Planning Time: 0.658 ms"
"Execution Time: 11608.602 ms"

Где тут predicate push down? Запрос 11с вместо 0.1с выполняется (в ссылке ниже есть план оптимизированного запроса)

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

NitroJunkie
() автор топика
Последнее исправление: NitroJunkie (всего исправлений: 1)
Ответ на: комментарий от Obezyan

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

Серьезно? И какой ассортимент там? 2к товаров? Тут да, можно даже позабивать на эффективное выполнение, в крайнем случае минуту лишнюю подождешь.

В рознице количество товаров до миллиона доходит. Собственно там таблиц меньше миллиона записей нет. И одновременных пользователей больше нескольких тысяч. Один раз predicate push down не пройдет и у вас сервак ляжет с ротацией shared buffer’ов (уйдя в дикий disk read). Производств с такими объемами наверное штук 100 на всю Россию. А в одной базе и того меньше.

NitroJunkie
() автор топика
Ответ на: комментарий от usermod

А продукта 1С попросту не существует. У меня, например, работают два продукта 1С, …

Так «не существует» или «их не менее двух»?

Получается, не только lsFusion ERP, но и сама 1С не является аналогом 1С?

Я писал про платформу, а не про решение. lsFusion ERP является приблизительным аналогом 1С: Управление Торговлей 11. lsFusion является аналогом 1С: Предприятие 8.

monk ★★★★★
()
Ответ на: комментарий от monk

Наверное, вопрос должен звучать так: сколько товаров в ассортименте? И работает ли у продавца подбор по остаткам (то есть, может ли покупатель спросить о наличии товара, а продавец посмотреть, и если есть, зарезервировать)?

В продовольственных супермаркетах, непосредственно розничные продажи физикам естественно в отдельном контуре. Но все остальное от печати ценников, расценок, до заказов распредцентрам, резерва и отгрузки по безналу, собственного производства и т.п. с подборами в одной базе, резервами и вот этим всем. Ассортимент больше миллиона товаров иногда бывает. В непродовольственной розницы POS’ы в одной базе, но там объемы конечно поменьше.

Если Интернет лёг, супермаркет закрывается?

Ну резерв связи никто не отменял, это прям все сразу должно лечь. Плюс иногда внутренние резервные POS’ы держат в локальной сети. Но как вы помните на майские да, много кто закрывался.

NitroJunkie
() автор топика
Последнее исправление: NitroJunkie (всего исправлений: 1)
Ответ на: комментарий от NitroJunkie

В рознице количество товаров до миллиона доходит.

Это абстрактное утверждение или среди организаций, успешно применяющих lsFusion ERP такие есть?

У торговых 1С при количестве элементов в справочнике номенклатура более 100 тысяч начинаются проблемы.

monk ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.