Некоторое время назад ко мне обратился знакомый, хозяин одного из филиалов крупной сети по доставке суши и пицц. Их нынешняя ERP его вообще не устраивала, так как не было контроля за кухней и доставщиками, а так как кухонь по городу у него 5, то это была серьёзная проблема. Он предложил мне написать под него новую систему. Единственное условие – так как он во франшизе, и особо с головниками портить отношения не хотел, необходимо интегрировать с существующей системой максимально скрытно.

Первый вопрос, который у меня возник – это средство разработки. Можно было взять что-то новомодное типа NodeJS для сервера, и отдавать web-интерфейс клиентам – самый простой, но самый тормозной вариант (аналогичные решения требуют i3). Можно прописывать отдельно серверную часть, отдельно каждое приложение (windows/android/ios). Или NodeJS сервер, и C# (xamarin если точнее) под все клиенты единый код. Или взять последнюю Rad studio и написать на единой кодовой базе всё. Так как я понимал, что разный код, описывающий одни и те же вещи – это потенциальная проблема, и что я буду работать над проектом один, я выбрал последний вариант.

Второй вопрос – это архитектура. Можно по-быстрому набросать на форму компоненты, ручками или через LiveBindings всё связать, и быстро получить результат. Но любое небольшое изменение в каком-то алгоритме требует пересборки и обновления всех программ, а это большие затраты по времени на тестирование, чтобы в другом месте ничего не сломалось. Поэтому я принял решение использовать xml для описания всех таблиц и интерфейсов, а всю логику убрать в скрипты.

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

image

На скриншоте видно, что элемент связан с таблицей Orders, но отображает не её содержимое, а ссылку на customer, колонку FirstName (имя заказчика). Так же при нажатии будет вызван обработчик atApplyChanges, который применит все изменения на форме, и закроет её. Без единой строчки кода! Естественно, когда в таблице Orders что-то будет меняться, то вызовется скрипт, который проверит корректность изменения. Что-то типа:

Немного скрипта
CurOrderState := GetNewValueF('Orders','OrderState');
LastOrderState := GetOldValueF('Orders','OrderState');
IsCashbackOnCurier := GetNewValue('Orders','CashbackOnDeliverer') = 'True';
PayType := GetNewValueF('Orders','PayType');
OldPayType := GetOldValueF('Orders','PayType');
OrderTurn := GetNewValueF('Orders','Turn');
CurTurn := GetConstantValue('CurrentTurn');
OrderNo := GetNewValue('Orders','OrderNo');
OrderPrice := GetNewValueF('Orders','Price');

PaySum := GetNewValueF('Orders','PaySum');
LastPaySum := GetOldValueF('Orders','PaySum');

CurTurn := GetConstantValue('CurrentTurn');
CurCashbox := GetConstantValue('CurrentCashbox');

if (OrderTurn > 0) and (OrderTurn <> CurTurn) then
begin
   ShowMessage('Нельзя производить действия с заказом другой смены. Заказ №'+IntToStr(OrderNo));
   exit;
end;

if (LastOrderState = 9) then
begin
   ShowMessage('Нельзя производить действия с завершенным заказом');
   exit;
end;

if (LastOrderState = 8) then
begin
   ShowMessage('Нельзя производить действия с отменённым заказом');
   exit;
end;

if (LastOrderState <> 8) and (CurOrderState = 8) then
begin
   TransactionCanAccept;
   exit;
end;

if (CurOrderState > 2) and (CurTurn  < 1) then
begin
   ShowMessage('Смена не открыта. Действие не может быть совершено');
   exit;
end;

if (CurOrderState > 4) and (CurCashbox  < 1) and (CurOrderState <> 8) then
begin
   ShowMessage('Касса не открыта. Действие не может быть совершено');
   exit;
end;

//Запрет изменения сумм, так как есть кассовые доки.
if IsCashbackOnCurier then
begin
   if PaySum <> LastPaySum then
   begin
      ShowMessage('Уже нельзя менять суммы оплаты');
      exit;
   end;
   Price := GetNewValueF('Orders','Price');
   LastPrice := GetOldValueF('Orders','Price');
   if Price <> LastPrice then
   begin
      ShowMessage('Уже нельзя менять суммы оплаты');
      exit;
   end;
end;

// Формируем сдачу
if (CurOrderState >= 6) and (CurOrderState < 8) and (PayType = 1) and (not IsCashbackOnCurier) then
begin
   if (PaySum - OrderPrice) > 0 then
   begin
      ss := 'Выдача сдачи для заказа №'+IntToStr(OrderNo);
      CreateCashboxDoc(ss,1,OrderPrice - PaySum);
      IsCashbackOnCurier := True;
      SetValue('Orders','CashbackOnDeliverer',True);
   end;
end;

//Отмена сдачи для курьера по статусу
if (CurOrderState < 6) and IsCashbackOnCurier then
begin
   if (PaySum - OrderPrice) > 0 then
   begin
      CreateCashboxDoc('Отмена выдачи сдачи для заказа №'+IntToStr(OrderNo),1,PaySum - OrderPrice);
      IsCashbackOnCurier := False;
      SetValue('Orders','CashbackOnDeliverer',False);
   end;
end;

// Формируем возврат сдачи
if (CurOrderState >= 8) and IsCashbackOnCurier then
begin
   if (PaySum - OrderPrice) > 0 then
   begin
      ss := 'Возврат сдачи для заказа №'+IntToStr(OrderNo);
      CreateCashboxDoc(ss,1,PaySum - OrderPrice);
      IsCashbackOnCurier := False;
      SetValue('Orders','CashbackOnDeliverer',False);
   end;
end;

// Формируем приходник на сумму заказа
if (CurOrderState = 9) and (LastOrderState <> 9) and (PayType = 1) then
begin
   ss := 'Розничная выручка с заказа №'+IntToStr(OrderNo);
   CreateCashboxDoc(ss,2,OrderPrice);
end;

// Назначаем смену и филиал при переходе из статуса новый дальше
if (LastOrderState < 3) and (CurOrderState >= 3) then
begin
   if CurTurn <= 0 then
   begin
      ShowMessage('Смена не открыта. Движение заказа не возможно.');
      exit;
   end;
   SetValue('Orders','Turn',CurTurn);
   CurFilial := GetConstantValue('FilialID');
   SetValue('Orders','Filial',CurFilial);
end;

if (CurOrderState <= 2) and (LastOrderState > 2) then
begin
   SetValue('Orders','Turn',0);
end;
TransactionCanAccept;


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

Следующий момент, который безумно напрягает во всех нынешних решениях – это латентность. Любое действие приводит к select из базы. Т.е. время пинга+передачи пакета+select+gzip — это минимальное время, через которое у оператора что-то произойдёт. А когда праздники и мало того, что повышенная нагрузка на оператора да ещё и сервер начинает тормозить, вот тут начинаются реальные денежные потери. Что бы этого не происходило, я сделал кэширование всех нужных данных в ОЗУ, и выборку оттуда через запросы. Сервер напрягается лишь транзакциями update/insert, а потом изменённые и новые данные рассылает всем подписчикам.

С отображением информации тоже пришлось сделать интересные оптимизации. Так как у нас нет select из 10 таблиц, то как, например, из таблицы деталей доставки выяснить, куда везти заказ (у меня точка хранится в таблице домов ФИАС)? Примерно вот так:

     fids := CComponentBaseLink.ClassGetPrintValue('Orders_Delivery_Details','Order|Orders->CustomerAddress|Customer_address->FiasHouse|Fias_Houses->ID',orid);
      if not StrToInteger(fids,fid) then
         Continue;
      las := g_Base.GetTblValueByID('Fias_Houses','PointLatitude',fid);
      los := g_Base.GetTblValueByID('Fias_Houses','PointLongitude',fid);

Т.е. прошли через 3 промежуточные таблицы и сопоставили заказ с точкой на карте, что бы её нарисовать. Всё очень быстро, и без единого обращения на сервер. И нарисовали в браузере ручками через соответствующее api. То есть так как у гугла большие проблемы с картами в России “в замкадье”, на андроиде использую яндекс, у которого эти проблемы выражены гораздо меньше. Через api 1.1 даже кода разработчика получать не надо, что бы отобразить пункты назначения и пробки например.

Естественно, всё это надо было как-то сопрягать с (пока) основной бизнес-системой. Основная бизнес-система (не буду её называть) печатает на принтере заказы. Небольшое использование сниффера показало, что печатается pdf. Через пол дня была готова моя программа, которая полностью копировала протокол оригинальной (до байта, спасибо, что исходники компонент дельфи доступны и там можно легко поправить заголовок не заморачиваясь с raw socket), но помимо печати на принтере парсила эти pdf и вычитывала оттуда заказ, загружая его в базу. Но этот метод носил некоторые ограничения. Во-первых, выгружалась не вся нужная информация, а пару полей приходилось перезаполнять оператору, а во-вторых, это была лишь синхронизация по заказам. Например, рейсы доставки приходилось формировать и там и там. Поэтому был написан прокси, который анализировал всю проходящую через него информацию и эта проблема решилась.

Курьерское приложение.


image

Оно отсылает в фоне на сервер трек. То есть оператор может в реальном времени наблюдать за перемещением курьеров. Так же для подтверждения доставки заказа курьер должен находиться в некотором заданном радиусе от точки доставки. Но при этом может отсутствовать интернет. И тогда программа передаст информацию о том, что заказ доставлен, как только интернет появится. Естественно, можно из программы запустить яндекс-навигатор, который автоматически проложит путь до адреса; можно посмотреть все адреса на карте, или позвонить клиенту, нажав 2 кнопки, и так далее.

В общем, система получилась очень мощной, с большим количеством возможностей реализованных, и с ещё большим количеством заложенных. И… оказалась не нужна. В последний момент заказчик стал изменять изначальные требования: начал в приказном тоне говорить, чтобы я делал так-то и так-то, потому что иначе это работать не будет (к слову, это требования полного переписывания всего на другом ЯП, просто «чтобы было»)… На резонный вопрос “а ведь работает”, “работает быстрее, чем текущая система” и т.д. меня будто не слышал. На этом мы расстались. В общем, сейчас у меня есть интересная, почти готовая, ERP система. Там не хватает каких-то отчётов, хорошо бы допилить (если это будет востребовано) изначально заложенный функционал автоматического разброса заказов по кухням, в зависимости от пробок и текущей загрузки точек и т.д. Доработать это, а так же реализовать дополнительный функционал – совершенно не сложно. А до тех пор моя ERP система ищет нового заказчика, а я новую работу. :)

P.S. Многим, я думаю, будет интересно узнать какого вообще разрабатывать кросс-платформенные приложения на RAD Studio. Выскажу своё субъективное и предвзятое мнение: на последней студии, со всеми апдейтами работать можно. Есть некоторые проблемные компоненты типа TWebBrowser, у которого сложности с удалением себя под всеми OS. Или проблемы у компонент типа TGrid на тач устройствах. Но это всё решаемо. Так же есть большая проблема, что установленный apk ~ это 100Mb. Да, жесть, согласен, но в остальном лишь преимущества. Единая кодовая база, куча компонент из коробки на все случаи жизни, причём под FireMonkey они стали гораздо гибче, чем vcl. Так что основная проблема нынешней Rad studio – это цена. Всё остальное в ней весьма достойно.

Комментарии (122)


  1. brrr
    22.12.2017 00:10

    Их нынешняя ERP его вообще не устраивала, так как не было контроля за кухней и доставщиками

    Так может стоило более подробно разобраться и донастроить? Мне тоже не нравиться Linux/Windows/MacOS… Может не стоило убегать от проблем?)) И хочется услышать, что за система была изначально у знакомого? И по описанию то, что вы делали ну никак не ERP, скорее CRM


    В общем, система получилась очень мощной, с большим количеством возможностей реализованных, и с ещё большим количеством заложенных.

    В общем, сейчас у меня есть интересная, почти готовая, ERP система.

    Там не хватает каких-то отчётов

    ERP система ищет нового заказчика

    "Огласите весь список пожалуйста", что же умеет в итоге система-то, чего не умеют другие? Почему интересная? Что значит почти готовая?


    В целом мне кажется статья получилась скомканная. Я не понял прелестей ни Delphi, ни RAD studio, и не понял о чем система, почему же она "мощная".


    1. VolCh
      22.12.2017 00:27

      Контроль за персоналом это уже точно ERP фича, да и логистика тоже.


      1. brrr
        22.12.2017 00:49

        Нет. ERP имеет весьма формализованное представление.


      1. gks
        23.12.2017 12:00

        ERP = MRP I + MRP II + финансовый контур
        MRP I — это специальный алгоритм управления запасами для производства
        MRP II — Это управление производственными мощностями
        То есть тут нет ни одного пункта из ERP,
        Транспортная логистика, работа с персоналом не входят в ERP
        ERP II = ERP + CRM
        У вас часть CRM + HRM


        1. akadone Автор
          23.12.2017 12:07

          Вся производственная мощность — это и есть персонал, которому надо говорить в какой момент что делать. Это распределение нагрузок и пр. И это именно ERP система. Естественно в архитектуру это заложено, но сейчас например нет одной из главных вещей — автоматическое распределение заказов по точкам с учётом текущей нагрузки и пробок. Так же и некоторых других.
          Пока решались другие проблемы: например что заказ начинался делаться через 10 минут после поступления. А всего на приготовление и упаковку 20 мин.


          1. Dementor
            23.12.2017 13:52

            И это именно ERP система.

            Возможно у вас именно ERP и вы полностью повторили функциональность SAP R3, но почему вы в статье рассказывали исключительно только про CRM (работа с клиентами), HRM (работа с персоналом) и TMS (работа с доставкой)? Вам же подсказывают про MRP I и MRP II. Где ваши анализы сезонных продаж (с учетом праздников) и составление на их основе планов производства и закупки ингредиентов (закупите больше — увеличите затраты из-за просрочки неиспользованного; закупите меньше — получите недополученную прибыль и уменьшение лояльности покупателей)? Где ваши расчеты по заготовке полуфабрикатов (последний элемент для суши и пиццы вообще очень важен, так как эти классы продуктов компонуют из заготовок, срок жизни которых от пары часов до суток, а потом нужно буквально утилизировать «деньги»)?


            1. akadone Автор
              23.12.2017 15:57

              Не хочу спорить кто что подразумевает под этой аббревиатурой. Исходная система заказчика имела куда более скромные возможности, но тоже носило гордое название Farfor ERP. Хотя по факту там только приём заказов, пара выгрузок, да десяток отчётов.


            1. VolCh
              24.12.2017 16:51

              ERP в широком смысле — это управленческая стратегия. ERP-система — система, помогающая эту стратегию реализовать, как правило, без перехода в другие системы, но не обязательно. ERP-система может импортировать первичные данные из одних (например, фискальных) систем и экспортировать в другие (например, OLAP). Так же имеется тенденция выделять в отдельные системы (пускай и интегрированные с ERP) то, что обычно было их модулями/подсистемами. например CRM модули.


              1. Dementor
                24.12.2017 18:03
                +1

                VolCh, не люблю цитировать википедию, но уж больно хорошо у них написано:

                Enterprise Resource Planning, планирование ресурсов предприятия
                ERP (англ. Enterprise Resource Planning, планирование ресурсов предприятия) — организационная стратегия интеграции производства и операций, управления трудовыми ресурсами, финансового менеджмента и управления активами, ориентированная на непрерывную балансировку и оптимизацию ресурсов предприятия посредством специализированного интегрированного пакета прикладного программного обеспечения, обеспечивающего общую модель данных и процессов для всех сфер деятельности. ERP-система — конкретный программный пакет, реализующий стратегию ERP. (с) Википедия


                1. akadone Автор
                  24.12.2017 19:47

                  Подскажите, пожалуйста, что не так с целью оптимизации и контроля за производством: в каждый конкретный момент система говорит что делать конкретному сотруднику, перераспределяет нагрузки между кухнями, контролирует выполнение и так далее. Почему это не ERP? Не понимаю.
                  В этом бизнесе опоздание и пересорт — самые частые косяки. Не заметны убытки от того, что испортилась какая-то залежавшаяся рыба на фоне 2-х отказов за день из-за косяка повара, который по запарке перепутал ингредиенты. Или косяка, что нет доставщика на точке в важный момент, так как все 4-5 стоят в пробках из-за не оптимально составленных рейсов.


                  1. Dementor
                    24.12.2017 23:45

                    Нельзя просто взять сказать «я сделал ERP-систему» и далее рассказывать о том, как парсишь PDF-документ и с телефона передаешь GPS-трек. Нельзя, потому что самое быстрое внедрение уже готовой ERP-системы про которое я слышал заняло три месяца (настройки, обучение, перенос данных). Внедрения с доработками идут по году. А написание систем для управления ресурсами предприятия «с нуля» занимает годы.

                    Что еще не так в статье? Не сказано, чем именно не устраивала система FARFOR, какие блоки автоматизации процессов были доработаны и какие вообще написаны заново, как именно была выполнена связка с основной системой? Я так и не понял — у вас «прокси» на корпоративный софт с вашим дополнительным функционалом или отдельная самостоятельная полноценная система, которая никак не зависит от легаси и имеет с ней двухстороннюю синхронизацию как отключаемую опцию? В целом, ну никак не показана ценность созданной системы. У меня сложилось впечатление, что вы просто какой-то плагин сделали, который работает исключительно поверх чужой программы.


          1. gks
            25.12.2017 09:37

            Попробую зайти из далека и объяснить принципиальные вещи.
            Существует две производственные модели:
            1. Выталкивающий типа, когда делается анализ рынка и строится производственный план. И далее весь произведенный товар выкидывается на рынок и его толкают.
            2. Вытягивающего типа, когда делается заказ, и уже производственная система производит товар согласно заказу.
            Как не сложно догадаться, ваша система вытягивающего типа. ERP система — это система поддерживающая первый, выталкивающий тип производства.
            Поэтому ваша система просто по определению не может быть ERP. Там другие алгоритмы и модели управления производством. Поэтому, ERP звучит очень модно и люди часто используют это слово для продвижения своей системы. Тут ничего плохого нет. Только у вас не ERP. Вам нужно позиционироваться как системы вытягивающего типа, там своя терминология, и тоже не менее популярна. Например, бережливое производство LEAN Production.
            ru.wikipedia.org/wiki/%D0%91%D0%B5%D1%80%D0%B5%D0%B6%D0%BB%D0%B8%D0%B2%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE


    1. akadone Автор
      22.12.2017 00:34

      Так может стоило более подробно разобраться и донастроить?

      Что донастраивать, если просто НЕТ этого функционала? Ни из коробки, ни вообще.
      В целом мне кажется статья получилась скомканная. Я не понял прелестей ни Delphi, ни RAD studio, и не понял о чем система, почему же она «мощная».

      Что именно не понятно?


      1. brrr
        22.12.2017 01:01

        Ответьте для начала на мои вопросы в коментарии


        1. akadone Автор
          23.12.2017 12:08

          Прочитайте для начала текст статьи. Там всё описано. Зачем задавать вопрос, если статью не читал?


          1. Whuthering
            23.12.2017 13:35

            Я вот внимательно прочитал, и даже не один раз, но тоже могу сказать, что ответов на вопросы, затронутых автором комментария, там нет. Может все-таки ответите?


            1. akadone Автор
              23.12.2017 16:08

              Что умеет система, чего не умеют другие? Система заточена под конкретный бизнес. Аналогов в данной области ей нет. Просто нет, так как там конкуренты типа ArchiDelivery и Farfor ERP. То есть ни о чём. Я за пару месяцев вывел функционал на более высокий уровень, чем они пиля годами и 10-ю программистами. Но область достаточно специфичная, крупные игроки её или всерьёз не воспринимают, или вовсе не знают о ней. Почему — свечку не держал.
              Про остальное -достоинства RAD Studio — в статье постарался подробно изложить. А о донастройке систетемы — сам не понял о чём автор поста сказал. Причём тут windows/linux/mac вообще.


              1. brrr
                24.12.2017 00:35

                То есть целые команды и продукты ни о чем? Только наш «одинокий рейнджер/ниндзя» знает и могёт лучше, чем все эти… Да тут мания величия на лицо. Хотя лучше всего вашу статью вашу статб описывает комментарий ниже https://m.habrahabr.ru/post/345274/comments/#comment_10582048


                1. akadone Автор
                  24.12.2017 15:15

                  Когда целая команда из 8 человек за месяц не может найти куда пропадают заказы с планшета — говорит о многом.
                  Что же до того комментария — вот как я могу постороннему человеку продемонстрировать работу своего ПО? Дать логин/пароль? Может сразу админский?
                  P.S. Я предпочитаю троллей не кормить.


                  1. FyvaOldj
                    24.12.2017 19:09

                    > Когда целая команда из 8 человек за месяц не может найти куда пропадают заказы с планшета — говорит о многом.

                    Говорит что руководство не умеет адекватно взаимодействовать с ИТшниками (наприме: некорректно ставят задачи, не адекватно платят, не требуют результатов/не контролируют). Тут бы новому исполнителю ИТшнику насторожиться бы. А нет — полезем головой в петлю. Хоть предоплату то взяли?

                    Приятно конечно мнить себя в восемь раз более эффективным чем коллеги. Однако это было бы так если бы этот одиночка-«гений» сумел бы внедрить систему.

                    А невнедренная система ни о чем не говорит.
                    Может ее при внедрении переделывать да доделывать на 90% еще.


                    1. akadone Автор
                      24.12.2017 19:55

                      Руководство поставило им простую задачу: на кухню и упаковку надо поставить планшеты, курьерам телефоны. Было это где-то в сентябре (могу чуть путать). И это не просто IT отдел, а целая контора (в гугле быстро ищется). Они рулят серверами, допиливают функционал. Нюансов их внутренней кухни я не знаю, но в середине декабря их решение по планшетам было почти готово. Последний месяц они искали «куда деваются заказы с планшета». Это цитата.

                      А невнедренная система ни о чем не говорит.

                      Да. Это так. Внедрение началось, достаточно успешно, и тут заказчик «включил заднюю». Поэтому я и решил посоветоваться с хар-сообществом, но вместо позитива меня заминусовали. Ну что же. Бывает и такое.


                      1. FyvaOldj
                        24.12.2017 22:23

                        . Поэтому я и решил посоветоваться с хар-сообществом, но вместо позитива меня заминусовали. Ну что же. Бывает и такое

                        То есть вариант что здесь люди знающие и если они говорят что вы сделали ни то — вы исключаете и им не верите?


                      1. Dementor
                        24.12.2017 23:54

                        Поэтому я и решил посоветоваться с хар-сообществом, но вместо позитива меня заминусовали.

                        Я хоть и не плюсовал, но и не минусовал. Как-то нейтрален к вашей истории. Но вам не нужно сейчас включать обиженного и жаловаться на непонимание сообществом. Если хотели посоветоваться, то нужно было открыто просить совета в статье, а не пиарить RAD Studio и не пытаться искать потенциальных заказчиков на оказавшуюся ненужной программу.


                  1. brrr
                    25.12.2017 00:52

                    Мне не понятна ваша реакция.
                    Лейтмотив вашей статьи и комментариев — это противопоставление вас одного целому пласту науки о проектировании ПО и профсообществу. Статья более, чем туманна:
                    Вы восхваляете свои решения, но при этом выдаете либо "эскизы" кода, либо вовсе умалчиваете о реализации, говоря обобщенно.
                    Вы описываете предпосылки создания субъективным желанием без даже малейших попыток анализа существующих решений.
                    Вы описываете систему немногочисленными возможностями, тут же называете ее "мощной", но абсолютно умалчиваете об инфраструктуре решения, не называете ни сроков реализации, ни заявленных требований, ни критериев качества по которым можно оценить результаты.
                    Вы пытаетесь акцентировать внимание на ЯП и инструменты разработки, которые к вашей т.н. ERP имеют посредственное отношение.


                    вот как я могу постороннему человеку продемонстрировать работу своего ПО? Дать логин/пароль? Может сразу админский?

                    А демонстрация системы ограничивается только передачей админского пароля?


                    Вместо того, чтобы хамить и обзывать троллями, вы бы могли просто нас просвятить и выпустить две отдельные статьи одна — презентация системы, другая — о том, как здорово работать в RAD studio. Блесните знаниями и опытом более детально.


  1. izzholtik
    22.12.2017 00:14

    А как происходит обновление информации в кэше клиента?

    p.s. настоящие люди умеют распознавать такие капчи :)


    1. vism
      22.12.2017 09:42

      тоже очень интересно, я как это прочитал, офонарел аж!


  1. electronus
    22.12.2017 00:44

    А какова же истинная причина «заднего хода» заказчика?


  1. yarosroman
    22.12.2017 01:28

    А у меня вопрос один, вы студию купили или с торрентов скачали, а друг вас кинул с оплатой?


    1. bgBrother
      22.12.2017 13:08

      Возможны разные пути «бесплатно» получить лицензию: named через работодателя или «одолжить» concurrent лицензию у друга. Простите, но я считаю, что нет смысла здесь это обсуждать и, тем более, намекать о пиратстве практически ничего о авторе не зная.

      Правила лицензирования Rad Studio


      1. bgBrother
        22.12.2017 13:09

        Если это вовсе никакой не намёк, прошу извинить.


  1. kxl
    22.12.2017 01:32

    опАздание?


    1. kalaider
      22.12.2017 16:39

      За что минусуем, товарищи? Мне тоже глаз режет. Хотя о таком все-таки лучше в личку.


      1. kxl
        23.12.2017 11:05

        Согласен, насчет лички, это если в статье ошибка, понятное дело. Тут же… я думаю, заказчик оценил.


        1. kalaider
          23.12.2017 15:17

          После прочтения самой статьи того же мнения.


  1. antonksa
    22.12.2017 03:02

    ОпАздание

    Пез… ц image


  1. kuftachev
    22.12.2017 04:41

    "Мощная ERP", один человек делал… Что-то совсем не сходится. Я бы ещё понял, если бы лёгкая и персонализированная под конкретного заказчика без лишнего функционала...


  1. Suvitruf
    22.12.2017 05:15

    Эх, сразу вспоминаю университет и свою «мощную ERP», которую писал для диплома. Спасибо за статью, всплакнул.


  1. Areso
    22.12.2017 06:08

    Нет ТЗ и договора — результат ХЗ и без денег.


  1. Shtucer
    22.12.2017 08:48
    +1

    Многим, я думаю, будет интересно узнать какого вообще разрабатывать кросс-платформенные приложения на RAD Studio

    Либо после слова "какого" пропущено слово на букву "х", либо… впрочем, меня и этот вариант устраивает.


  1. cleaner_it
    22.12.2017 09:18

    Каждый должен написать свой велосипед) Это, конечно, не ERP, но для небольшой компании может быть востребовано — только описание нужно сделать толковое. Про то, как разошлись с заказчиком, можно не говорить, достаточно сказать, что система в бета-релизе. Желаю удачи.


    PS: Грамматические и орфографические ошибки нужно вычитывать перед публикацией.


  1. vism
    22.12.2017 09:37
    +2

    Когда читал статью, был в шоке.
    Сам в основном занимаюсь разработкой ERP, CRM.

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

    ERP такая штука, которая всегда подвержена доработкам и изменениям, притом доработкам, порой очень нелогичным (которые не укладываются в логику).
    Такие системы должны быть:
    1. Очень гибкие — чтоб можно было менять и дорабатывать все что угодно, особо при этом не ломая другие модули
    2. Написаны на популярных и простых технологиях — если вдруг за такой код, как вы делали, вас в лес увезут, чтоб другой программист мог дальше работать. Ваш код легче выкинуть, чем копаться в ваших изобретениях.

    И да, согласен с этим комментом habrahabr.ru/post/345274/#comment_10581006

    И вобще, я засмеялся когда прочел это

    потому что иначе это работать не будет (к слову, это требования полного переписывания всего на другом ЯП, просто «чтобы было»)

    Вы там зазвездились? Вы сделали и пусть работают как хотят с вашими костылями? )))
    И что за дер… код вы написали, при котором все переписывать надо?) Да и в целом сразу не догадались, чтоб будут такие проблемы?)

    Выбрали ЯП для задачи, которую намного лучше решать другими ЯП -> Сами в статье написали что нихрена оно не удобно и вы написали свой редактор форм (Карррл, уже тут надо было СТОП) -> на нем все закодили. А потом вдруг оно не гибким оказалось? Пришлось не код под функционал, а функционал под код подстраивать?? КАААРЛ!!!

    А как вы сделали рассылку кэша по клиентам?
    Я так понял вы при каждом обновлении рассылали кэш по всем клиентам? в Оперативку всю базу по сути??? Вы там совсем упали с высоты, слово на букву е.. чтоли???

    Пошел пить валидол…


    1. VolCh
      22.12.2017 09:52

      Судя по наличию слова «подписчики», клиенты подписываются на изменения интересующих их сущностей.


      1. vism
        22.12.2017 10:02

        То есть для руководителя и помощника руководителя, для полноценной работы по сути все должно грузиться?)
        Допустим база клиентов в 150К с адресами, историей заказов и т.п.
        Оно как на сервере… захадркожена пагинация которая на клиенте и отдаются клиенты в соответствии с текущей страницей или все сразу?
        Если отдается в соответствии с текущей страницей, всякие фильтры, сортировки — это уже отдельно на сервере вычисляется из кэша и отдается или как?
        Если отдается вся база в 150К пользователей с зависимостями, как оно там на клиенте сортируется, да и в целом хранится)


        1. VolCh
          22.12.2017 11:42
          -1

          Клиент сам решает на что подписаться и сообщает серверу о своём решении. Обычно, да, текущая страница списка +- несколько для плавной прокрутки, если говорить об отображении списков. Детализация — по месту решается, если строка списка отличается от полного представления несколькими полями, то проще сразу отдать их, если разница в разы или на порядки, то сделать отдельный запрос.


          1. vism
            22.12.2017 12:03

            вы мне паттерн описываете, или то как было реализовано у автора статьи?


    1. kuftachev
      22.12.2017 14:38
      +1

      У нас, когда столкнулись с сайтом на Ruby, люди сделали какашку, а нам предлагали взять после них на поддержку, родилась шутка, что сайты нужно было делать на Erlang, а дальше как в анекдоте:


      Украинец и еврей отбились от каравана в пустыне, каждый естественно прихватил самое дорогое себе, украинец -мешок с салом, еврей — мешок с золото. Еврею кушать хочется, и говорит:


      • Давай играть в рынок. Ты будешь продать сало, а я буду покупателем.
      • Хорошо.
      • Сколько у тебя стоит 100 грамм сала?
      • Мешок золота.
      • Не может быть, почему так дорого?
      • Ну не знаю, у меня так, походи по рынку, может дешевле найдешь.

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


    1. Whuthering
      22.12.2017 16:40

      Вот те же мысли при прочтении.
      Я примерно догадываюсь, как появилась эта статья — некоторое время назад автор бил пяткой в грудь и прославлял RAD Studio, нелицеприятно отзываясь о тех, кто выдвигал какие-то сомнения и контраргументы. Когда автора попросили привести современных, сложных и широкоиспользуемых проектов сделанных в RAD Studio, был рассказ про «мою крутую систему которая умеет столько всего и не тормозит», а когда попросили показать, как оно работает и устроено — замолчал. И вот появилась статья.

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


      1. brrr
        24.12.2017 00:40

        Отличное резюме для этой статьи. Мне кажется в анамнезе у автора немного мании величия)))


        1. vladob
          24.12.2017 01:13

          молодость?


  1. o4karek
    22.12.2017 09:42

    Склад, сборка и доставка — это совсем не ERP.
    Ну и написать ERP в одно лицо если и можно, то на это придется потратить лет 5+ и при этом очень неплохо разбираться в экономике. И немного программировать :)
    Но самое интересное начнется потом, когда созданную «ERP» кто-то купит :)
    Начнутся ошибки, хотелки (которые зачастую противоречат одна другой), падение производительности под нагрузкой (хотя-бы человек 150-200 одновременно), а самое главное — поддержка под текущее законодательство.
    И весь описанный выбор фреймворков, классов и прочего инструментария окажутся такими не важными и не интересными…


    1. vism
      22.12.2017 09:55

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

      Бизнес всегда меняется, предприниматель всегда крутится и меняет что-то. Под это обычно и система меняется.

      Но как оказалось, не все это понимают)))


      1. o4karek
        22.12.2017 10:02

        Да если ERP под одно предприятие, не большое, как у заказчика из статьи, то в принципе можно

        Только это будет не ERP :)
        Ведь всякие SAP-ы и прочие 1C-ы, не говоря о Галактиках — они ведь удавятся от бессилия.
        И да, никто не спорит, что можно написать заказную систему для конкретного заказчика. Но при этом надо понимать, что «писатель» попал в рабство на всю жизнь. Он будет неотъемлемой частью написанного. Даже когда ему опостылет это писать :)
        Ну и стоит посмотреть на этого «заказчика», который, кажется, не понимал, на что он подписывается в описанном случае.


        1. vism
          22.12.2017 10:14

          Да, часто это проблема. Но, есть заказчик — найдется и исполнитель :)
          Когда это пишется на популярных технологиях и фрэймворках профессионалом, не все так страшно.
          Я когда пишу код, всегда пишу с тем расчетом, что в любой момент разработчик может сменится. И чтоб другой, кто увидит мой код и возьмет его доработку, мог как можно легче разобраться и приступить.

          Ну и когда растет система, если один разработчик, надо бить в колокола и объяснять заказчику, что нужна команда, документация и т.п. Иначе с разбитым корытом останется :)


          1. o4karek
            22.12.2017 10:20

            У меня нет понимания, как может один человек хорошо разбираться с таком объеме предметной области. А если понимания не будет — будет стандартная софтина, созданная из говна и палок. Не потому, что писатель кривой, а потому, что понимания предмета нет.
            Т.е. код и его качество — это вторичный вопрос (увы) по сравнению с качество постановки задачи.


            1. VolCh
              22.12.2017 11:57

              Эксперты со стороны заказчика должны, прежде всего. разбираться и передать разработчику необходимую ему для реализации часть своих знаний предметной области. Что передали, то и получат. Да, хорошо, если разработчик разбирается, и может заметить, что, например, не переданы некоторые детали и уточнить их, или заметить, что требования не включают решения стандартных для отрасли проблем, с которыми заказчик ещё не столкнулся, но в обозримом будущем с большой вероятностью столкнётся. Но это не обязательно для успешного внедрения. Тут как раз качество кода роляет — насколько код готов к оперативным изменениям, когда заказчик увидит, что он получил не то, что хотел, а то, что озвучил.


              1. o4karek
                22.12.2017 12:08

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

                Это не то, чтобы заблуждение, но такое внедрение, скорее всего, будет обречено на провал. Причина очень простая — заказчик будет пытаться всех своих текущих тараканов затащить в новую систему. При этом далеко не факт, что текущие тараканы: а) законны, б) корректны и в) оптимальны с точки зрения бизнеса заказчика. Их тянут по одной причине — они привычны!
                Постановщик со стороны исполнителя обязан разбираться в предмете и обладать квалификацией для поддержания корректного и аргументированного спора по предмету.
                И качество кода, повторюсь, здесь вторично. Первичная — общая архитектура системы, структура базы данных. Именно это определяет возможность модернизировать систему.
                Если, условно говоря, у вас свойство «пол» физ.лица — это булево, то любое качество кода не позволит этой системе быть успешно внедренной на территории некоторых стран :)


                1. VolCh
                  22.12.2017 14:38

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


                  Архитектуру я неразрывно связываю с качеством кода. А вот структуру базы уже нет — это тактические решения, а не архитектурные. Если, конечно, архитектура не завязана на конкретное хранилище, типа решения всю бизнес-логику хранить в хранимых процедурах PostgreSQL.


                  1. o4karek
                    22.12.2017 15:23

                    Если автоматизировать имеющиеся бизнес-процессы, то это одно.

                    Если автоматизировать бардак — получится автоматизированный бардак :)
                    Ещё вариант может быть: ....

                    А есть такие же, только перламутровые? :)
                    Я в данном случае не пытаюсь убедить вас в чем-то. Я озвучиваю свой опыт из очень большой практики автоматизации предприятий (10+ лет).
                    Любая доработка системы является компромиссом между хотелкой заказчика, предметной компетентностью исполнителя и возможностями дорабатываемой системы.
                    Вы поймите, если я закажу вам систему «как 1с» только дешевле — я от вас если что-то и получу, то очень не скоро. Ну т.е. совсем не скоро. И сильно не факт, что дешевле, чем купить готовое у той же 1С. А если добавить еще несколько хотелок — то, возможно, и никогда не получу.
                    Ну и (ИМХО): для экономического софта качество базы данных — это ключевое, стратегическое качество софтины. Ибо если существующая структура БД не позволяет обеспечить некоторые хотелки, это тянет за собой столько подпрыгиваний и такой геморой, что хочется убиться.


                    1. VolCh
                      22.12.2017 15:39

                      Вы поймите, если я закажу вам систему «как 1с» только дешевле — я от вас если что-то и получу, то очень не скоро. Ну т.е. совсем не скоро.

                      Ну, например, относительно быстро вы можете получить от меня систему ведения кассы на торговой точке, если только это вам и нужно от 1С. Но, вообще, 1С не очень пример, поскольку относительно дешевая. SAP или Галактика лучше :)


                      Ну и (ИМХО): для экономического софта качество базы данных — это ключевое, стратегическое качество софтины.

                      Не согласен в целом. Всё зависит от архитектуры — если она сильно завязана на схему данных, то вы правы. Если она, как говорится, storage agnostic, то выбор конкретной системы хранения не повлияет на функциональность. Не знаю как сейчас обстоят дела в той же 1С, но помнится были времена, когда она предлагала несколько вариантов хранения данных на выбор.


                      1. o4karek
                        22.12.2017 16:16

                        получить от меня систему ведения кассы на торговой точке, если только это вам и нужно от 1С

                        Вот это я точно не посоветую делать на 1с. Особенно, если кэшлайн длинный, номенклатура 700+ тысяч и проходимость хорошая.
                        И да, у меня будет много вопросов по вашему предложению :)
                        Если она, как говорится, storage agnostic, то выбор конкретной системы хранения не повлияет на функциональность.

                        Если вы под этим термином понимаете независимость от конкретной СУБД, то я вообще о другом. Я говорю именно о структуре базы данных. Какие там таблицы, что в них лежит и как эти таблицы связаны. В какой СУБД это лежит — вопрос 145. И если структура базы «плохая» — на функциональность это влияет напрямую и драматически.


                        1. VolCh
                          22.12.2017 16:38

                          Говоря "таблицы", вы, скорее всего, уже подразумеваете реляционные СУБД или даже SQL. Да и в целом, скорее всего, имеете в виду не функциональность, а нефункциональные требования типа скорости работы и потребляемой памяти.


                          1. o4karek
                            22.12.2017 17:20

                            Говоря «таблицы», вы, скорее всего, уже подразумеваете реляционные СУБД или даже SQL.

                            Да, SQL СУБД.
                            Да и в целом, скорее всего, имеете в виду не функциональность, а нефункциональные требования типа скорости работы и потребляемой памяти.

                            Конечно нет. Имеется ввиду и то и то.


                            1. VolCh
                              22.12.2017 17:36

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


                              1. o4karek
                                22.12.2017 17:45

                                Как структура СУБД может повлять на функциональность?

                                У меня не получается осмыслить эту фразу :(

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


                                1. VolCh
                                  22.12.2017 17:49

                                  ну условно, как повлияет на функциональность полностью нормализованная у нас база, полностью денормализованная или вообще EAV какая-то?


                                  1. o4karek
                                    22.12.2017 20:26

                                    Скорее всего никак :) Ибо речь опять не о том.

                                    Дальше будет притянутый за уши пример.
                                    Пример: у вас есть таблица, которая хранит продажи со структурой: Товар, Количество, СуммаРубль, СуммаДоллар
                                    Такая таблица доставит вам массу проблем, как только вы захотите продавать товар не только в долларах. Причем не только для задачи зафиксировать факт. А еще надо отчеты какие-то строить…
                                    Такая таблица: Товар, Количество, Валюта1, Сумма1, Валюта2, Сумма2
                                    Создаст значительно меньше проблем при двухвалютном учете, но трехвалютный уже не потянет. Специфика предметной области даст понимание, нужен нам трехвалютный учет или нет. Вот это и есть структура базы.
                                    А теперь на секунду представляем себе, что самая первая структура данных успешно работала N лет. В базе накоплено X Гигабайт данных, с которыми работают M отчетов и всего остального. И теперь надо это все резко сделать многовалютным. И это надо сделать а) примерно вчера и б) база не будет остановлена больше, чем на пару минут/часов/дней (но всегда меньше, чем надо).
                                    И вот тут сразу забывается качество кода, фреймворк, на котором все написано, и вся прочее. А начинаются размышления на тему: какрыбку съесть и кости сдать за деньги минимально дешево перелить данные из «старой» таблицы в «новую» и как потом сделать так, чтобы весь тот софт, который раньше работал с простыми циферками, стал быстро и правильно (!) работать с непростыми циферками.
                                    На мой непросвященный взгляд — это и есть главная сложность. А на чем и как рисуются формочки и печатаются отчетики — это не самое интересное. SAP вон вполне себе работает на визуальных технологиях терминального века и ничего, живой :)
                                    Ведь не зря вендоры экономического софта меряются не фреймворками и модными технологиями, а [десятками] тысяч работающих в одной базе пользователей и поддержкой актуального законодательства.


                                    1. VolCh
                                      23.12.2017 11:44

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


                                      1. Areso
                                        23.12.2017 18:39

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

                                        Расскажите, пожалуйста, это Борису Нуралиеву. А то мы тут мучаемся с их наиболее распиаренным продуктом (якобы флагманским) 1С:ERP. Каждый раз приходится простой согласовывать, причем простой где-то в середине ночи.


                                        1. VolCh
                                          24.12.2017 16:55

                                          Я говорю о системах, где у вас достаточно полный контроль над кодовой базой. Грубо, о "самописе", в котором вы можете, например, без особых проблем организовать запись в две таблицы (старая и новая) новых данных, пока где-то в фоне переливаются сотни гигабайт старых.


                                        1. FyvaOldj
                                          24.12.2017 18:55

                                          Расскажите, пожалуйста, это Борису Нуралиеву. А то мы тут мучаемся с их наиболее распиаренным продуктом (якобы флагманским) 1С:ERP. Каждый раз приходится простой согласовывать, причем простой где-то в середине ночи.

                                          Ваш оппонент забыл упомянуть чем приходиться платить за "изменение без даунтайма" и пояснить почему все таки при всех их недостатках по гибкости от реляционных СУБД полностью не отказались до сих пор.


                                      1. o4karek
                                        25.12.2017 09:34

                                        Изменение структуры данных задача относительно простая,

                                        Для понимания вопроса — можете озвучить свой реальный опыт по изменению структуры таблиц в боевой БД размером гигов 100 и порядка 100 активных пользователей или ваш опыт чисто теоретический?
                                        По сравнению с задачей доработки бизнес-логики.

                                        При правильной структуре БД доработки бизнес-логики, можно считать, бесплатны. Хотя смотря что называть бизнес-логикой :)


                                        1. VolCh
                                          25.12.2017 16:41

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


                                          Бизнес-логика — логика предметной области, не имеющая отношения в общем случае к техническим деталям типа СУБД или ЯП.


                      1. SergeyUstinov
                        22.12.2017 23:05

                        Не согласен в целом. Всё зависит от архитектуры — если она сильно завязана на схему данных, то вы правы. Если она, как говорится, storage agnostic, то выбор конкретной системы хранения не повлияет на функциональность. Не знаю как сейчас обстоят дела в той же 1С, но помнится были времена, когда она предлагала несколько вариантов хранения данных на выбор.

                        Качество базы данных — это не СУБД, а качество логической структуры (ER диаграммы). Если структура хорошая, то её можно для начала хоть на SQLite реализовать, а потом переносить на другие субд, и все обойдется относительно небольшими переделками. А если структура базы плохая — такую ERP ничего не спасет.


                        1. VolCh
                          23.12.2017 11:46

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


  1. michael_vostrikov
    22.12.2017 09:46

    к слову, это требования полного переписывания всего на другом ЯП, просто «чтобы было»

    То есть у вас есть нестандартная среда разработки (редактор форм), свой скриптовый язык, движок для него написан на устаревшем языке, компилятор которого к тому же стоит немало, и вы считаете, что это недостаточные причины просить использовать другой язык? Где и за какие деньги ему искать программиста искать для доработки, если с вами связь потеряется или вы будете слишком заняты на другой работе? А потом еще ждать, пока программист в документации на все это разберется (у вас ведь она есть).


    И вопросов по реализации здесь тоже хватает.


    1. michael_vostrikov
      22.12.2017 19:46

      Почитал комменты автора, думаю эти вопросы написать не помешает.


      Скрытый текст
      необходимо интегрировать с существующей системой максимально скрытно
      “работает быстрее, чем текущая система”

      Ну так вы не весь функционал сделали, а только часть, естественно она будет быстрее работать.


      типа NodeJS для сервера, и отдавать web-интерфейс клиентам – самый простой, но самый тормозной вариант (аналогичные решения требуют i3)

      Почитайте что-ли как делаются API (серверные) и что такое WebSocket. А для вашего черно-белого интерфейса никакого i3 не надо.


      но любое небольшое изменение в каком-то алгоритме требует пересборки и обновления всех программ
      а всю логику убрать в скрипты

      Отказались от скриптового серверного NodeJS, но в результате все равно сделали скрипты на сервере. К чему тогда слова про единую кодовую базу?


      ShowMessage('Нельзя производить действия с завершенным заказом');
      TransactionCanAccept;

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


      не надо повторно пересобирать программы и обновлять всё везде. Достаточно клиенту перелогиниться.

      Ну так в web, от которого вы отказались, все это есть из коробки. Достаточно страницу обновить.


      во всех нынешних решениях – это латентность. Любое действие приводит к select из базы

      Во всех решениях на Delphi? Возможно. О чем это говорит? Что она плохо подходит для таких приложений.


      я сделал кэширование всех нужных данных в ОЗУ, и выборку оттуда через запросы. Сервер напрягается лишь транзакциями update/insert
      Всё очень быстро, и без единого обращения на сервер

      А если оператор захочет вчерашний заказ открыть? Вы всю таблицу с заказами на клиент вытаскиваете? Судя по контексту второй фразы, еще и с промежуточными таблицами. Вместо i3 требуем оперативную память.


      тоже пришлось сделать интересные оптимизации

      Ага, специально взяли себе проблему и героически ее решаем.


      'Order|Orders->CustomerAddress|Customer_address->FiasHouse|Fias_Houses->ID'

      Это все в виде ассоциативных массивов, без всякой типизации?


      спасибо, что исходники компонент дельфи доступны и там можно легко поправить заголовок не заморачиваясь с raw socket

      Даа, изменили системные компоненты? То есть у стороннего программиста, скачавшего установщик с сайта, оно в принципе не заработает?


      1. Whuthering
        23.12.2017 13:39

        Хорошие вопросы. Интересно было бы послушать ответы (а не «читайте статью, там все написано», когда на самом деле ничего не написано). Про i3 для JS тоже повеселило, кстати.


    1. Whuthering
      23.12.2017 13:37

      Может это у автора специально задумка такая была — написать на почти загнувшемся некоторое время назад и уже нераспространенном языке, навернуть своих костылей, запутать код — чтобы к нему потом всю жизню за поддержкой обращались и платили?) Жаль только, не прокатило… :)


  1. Areso
    22.12.2017 10:46

    Многие накинулись на автора, мол, непопулярный язык, странное решение (xml для описания форм), и т.д., но вот вопрос: а было ли в первоначальной постановке задачи хоть что-то про желаемый заказчиком набор технологий?
    И даже если был бы описан язык (к примеру, PHP+JS), то это никак бы не уберегло от непопулярных фреймворков, старых релизов (или наоборот, слишком новых, которые бы поддерживались 10% клиентских устройств), и вот таких вариантов с самописными (или не совсем) xml-template разметками.


    1. vism
      22.12.2017 11:01

      Это уже вопрос профессионализма автора и клиента. Клиент решил не делать свой отдел для разработки, а взять одного удаленного человека.
      Теперь он знает, что это путь в никуда.


      1. Areso
        22.12.2017 11:32

        Клиент без опыта (вроде очевидно), взял человека, предположительно, без опыта разработки больших систем напрямую конечному заказчику = результат немного предсказуем.
        Дело не в формате работы, имхо. Дело в качестве начальной проработки требований к ИС (как функциональных, так и общих).
        Т.е. с тезисом про профессионализм согласен, с тезисом про формат удаленщика-фрилансера — не согласен.


        1. vism
          22.12.2017 12:07

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


          1. Areso
            22.12.2017 12:20

            И бюджет на двух программистов. Если это не вчерашние студенты или не демпингующие специалисты из Горно-Алтайска (любой другой Тьмутаракани по-вашему вкусу), то это недешевое удовольствие.


          1. Areso
            22.12.2017 12:22

            Когда я выступал заказчиком на биржах, и сроки горели, я обычно заказывал реализацию у двух разных независимых фрилансеров. Обычно получалось. Но бюджет приходилось резервировать на 2х, ну, а оплата от 1Х до 2Х. Но объем работы был меньше.


    1. michael_vostrikov
      22.12.2017 12:13

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


    1. akadone Автор
      23.12.2017 11:43

      Заказчик от этого как раз котел уйти. Ставить на каждое место оператора i3 из-за того, что там JS — это бред.


      1. F0iL
        23.12.2017 15:30

        Грамотно написанное SPA на JS с интерфейсом без свистелок и перделок может реактивно летать в браузере даже на 600-мегагерцовом ARM'е с полугигом памяти. Поэтому бред это скорее «i3 нужен для JS» :) А говнокода с кривой архитектурой можно хоть на Delphi, хоть на C++, хоть на чем угодно навернуть.


        1. akadone Автор
          23.12.2017 16:17

          Возможно наверно. Но я ни разу такого не видел. Большинство интернет магазинов еле ворочаются у меня на i5. И там сидят хорошие программисты, а фильтр по товарам — это как-бы гораздо проще, чем отображение всего того, что нужно оператору в ERP системе.


          1. michael_vostrikov
            23.12.2017 22:38

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


            1. Areso
              23.12.2017 22:55

              Согласитесь, что фильтр и фасетный поиск — это не одно и то же). И далеко не каждый интернет-магазин может похвастать фасетным поиском. А вот простой фильтр вполне себе прозаичен
              SELECT * FROM smartphones WHERE cores >= 4 AND release_date >= 2016 AND RAM >= 2048
              Ну и вернуть это обратно.


              1. michael_vostrikov
                24.12.2017 00:20

                Вот сложность начинается в том, чтобы определить какие есть варианты кроме 2048, и что вместо этого будет для refrigerators. Фиксированный список опций в магазине на 1 товар это конечно несложно. Но автор же имеет в виду большие и медленные.


        1. Areso
          23.12.2017 18:27

          Соглашусь, но позволю себе заметить, что говнокод на Delphi/C++ будет быстрее оного на PHP/JS (надеюсь, вы не станете с этим спорить, а если все же захочется — добро пожаловать в Performance-Test в моем ГХ). Во-вторых, большинство современных программистов навешивают такое количество overhead'a на собственно нужный код, что это потом ворочается еле-еле.
          Поверьте мне, я знаю, о чем говорю — у меня третий компьютер — Raspberry Pi 3, и на нем пользоваться сайтами (большинством) настоящая боль. Недавно была нужда сделать заказ через интернет в МедиаМаркт. Я на неслабом устройстве (4ядра по 1600МГц, 2 ГБ ОЗУ) измучался, пока разместил заказ. Проклинал их программистов самыми разными проклятиями))


          1. Areso
            23.12.2017 18:46

            неслабом устройстве (4ядра по 1600МГц, 2 ГБ ОЗУ)

            имеется в виду смартфон.


      1. michael_vostrikov
        23.12.2017 22:43

        Это не требования JS, это требования той ERP. JS работал в браузерах когда никакого i3 в помине не было. Как напишете, такая и будет скорость.


        1. F0iL
          24.12.2017 01:24

          Вот и я о том же. Сделать ajax-запрос, отрендерить MVC-форму с данными и кнопочками, заполнить табличку, нарисовать меню — браузеры/js с подобным отлично справлялись еще 10 лет назад, если не больше, когда никаких i3 с гигами памяти даже в проекте не было :)


          1. Areso
            24.12.2017 10:06

            Справлялись, да. А теперь не справляются. У меня был нетбук с первым поколением Intel Atom N270 (1 физическое ядро 1.6GHz, 2 потока благодаря HT), 1 ГБ DDR2 RAM. В 2008 на нем можно было играть в игры, ходить в Интернет, запускать студию и т.п.
            Прошло почти 10 лет, старые игры на нем вполне работают (как и старая студия), а вот в Интернет на нем лучше не ходить. Совсем.


            1. F0iL
              24.12.2017 13:29

              Тут проблема не в браузерах и не в JS, а в разработчиках, дизайнерах, и, не побоюсь это сказать, в пользователях.
              Достаточно просто сравнить, насколько разбухли сами страницы сайтов со всеми их ресурсами за эти 10 лет — в наше время повсеместным и нормальным считаются тонны HiRes графики, визуальных эффектов, сложных стилей, и т.д., и при этом никакой оптимизации. Раньше на страницу размером в мегабайт недовольно ворчали
              (а еще раньше никто бы не дождался даже ее загрузки), сейчас уже можно встретить 10-20-30 мегабайтные морды, даже больше.
              В качестве контрпримера можно привести «мобильные версии» сайтов (те, что действительно мобильные версии, а не адаптивная верстка «больших» страниц) — все быстро, компактно и без излишеств.
              Проблема в том, что мало кто тестирует свой продукт на железе N-летней давности, и мало кто вообще ориентируется на подобное. Если бы разработчикам и QA принудительно выдавали low-end железо с 2G в качестве канала связи — все бы работало ооооочень по-другому. А если вы сам разработчик, и осознаете проблему — то все в ваших руках.


              1. Areso
                25.12.2017 06:29

                Ну, у меня есть пет-проект, где я, по крайней мере, стараюсь.
                В том числе делаю тесты на слабых устройствах.
                Вот, после очередного набора оптимизаций:
                290KB transfered, Finish 1.96 s, DOMContentLoaded 483 ms
                И там есть куда двигаться дальше.
                "http://cosmodream.ga/js-html-mycity/
                is faster than the top-performing sites in the Games industry"


      1. FyvaOldj
        24.12.2017 18:42

        Заказчик от этого как раз котел уйти. Ставить на каждое место оператора i3 из-за того, что там JS — это бред.

        Бредом это является только если ваша система планировалась бы для экономии железа на 100 точках.


        Для 5 точек дешевле не то что i3, а даже и i7 — по сравнению со стоимостью разработки описываемой системы


  1. maxzh83
    22.12.2017 11:19

    Думал, это осталось в прошлом: теплый ламповый Delphi; все эти прекрасные ":=", «TЧтоТо»; работа без тз, азарт, с которым бросаешься на задачу, не понимая масштабов трагедии и т.д. Спасибо за статью, почти как «Дискотека 90х».


    1. VolCh
      22.12.2017 11:58

      Не останется это в прошлом ещё долго, если не привязываться конкретно к Delphi.


      1. maxzh83
        22.12.2017 12:26

        Я не против, пусть живет. Просто нигде этого не видел давно (по работе, статьи и т.д.), вот и показалось. Когда-то давно писал на Delphi, вот и понастальгировал


    1. brrr
      22.12.2017 12:40

      Не знаю, за что минусанули вас, но я тоже подумал о прежних временах "автоматизации" :)
      И вспонимается модель зрелости процессов разработки ПО.


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


  1. F0iL
    22.12.2017 11:58

    if (LastOrderState <> 8) and (CurOrderState = 8) then

    в Delphi нет enum, или я что-то не понимаю в этом мире?)


    1. bgBrother
      22.12.2017 13:15

      Есть.


      1. F0iL
        22.12.2017 14:04

        Это был сарказм, видимо, не очень удачный :)


    1. akadone Автор
      23.12.2017 11:44

      Это не дельфи текст, а текст из скрипта. Перенести туда все enum и прочие кнстанты я пока не успел.


      1. F0iL
        23.12.2017 15:23

        То есть для скриптования у вас используется не PascalScript, умеющий enum и константы, а что-то свое?
        Или же вы сначала пишете код «абы как», а потом перепиливаете?
        Кажется, я начинаю понимать реакцию заказчика…


        1. akadone Автор
          23.12.2017 16:26
          +1

          PascalScript не работает под android. Точнее я не смог его заставить собраться без больших правок. Поэтому использую легковесный Pascalc. Там можно почти тоже самое.
          Кстати если разбирать конкретно этот момент — эти константы задаются в базе. Поэтому их надо тянуть не через enum, я через Table.RowName что немного сложнее. Поэтому первоначальные скрипты писались используя просто константы.
          А по поводу реакции заказчика — единственное его членораздельное замечание — почему приложение на андроиде запускается целых 4(!) секунды. Работает без лагов и прочих проблем, но запускается 4(!) секунды. В общем истиной причины разрыва я, к сожалению, не знаю.


  1. vkus
    22.12.2017 23:41

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

    А теперь по существу статьи: по сути и обсуждать нечего — автор перешел в своих изысканиях на второй уровень (создание скриптового языка на компилируемом + «нескучные» формы), опробовал это на бедолаге-заказчике, попутно окрестив свое творение ERP, и сейчас пытается найти хоть какое-то применение всему этому.

    Могло бы быть интереснее, если бы:

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


  1. goncharenko_d
    23.12.2017 11:28

    ERP — это и склад с его логистикой, и учет главного ресурса всех предприятий — персонала, и учет продаж закупок, по возможности, еще и учет производства, увязывание этого всего с бухгалтерским учетом с его планами счетов и отчетностью.
    Вы вначале упомянули «так как не было контроля за кухней и доставщиками» и описали учет заказов и доставки. А как же кухня? И где же ведется объединенный учет всего этого?


    1. akadone Автор
      23.12.2017 11:41

      Склад с логистикой нужен далеко не везде. В данном случае нужен учёт, что такой-то продукт заканчивается. Не более. Это настолько простая задача, что я её даже упоминать не стал. Естественно должно быть подробное описание как готовить такой-то сет или салат, так как текучку кадров ни кто не отменял, должны быть фото упакованных заказов, что бы если что не так, сразу понимать кто накосячил: кухня, упаковка или доставка. Это всё есть.
      Про кухню и упаковку — это отдельные модули, которые как раз внедрялись, когда произошло расстование с заказчиком.
      А ERP система это прежде всего контроль за персоналом. А потом сведение это всё в отчёты и анализ эффективности каждого объекта отчёта. Будь то сотрудники подразделения, и в целом доставка, или в целом филиал. Ну, например, когда на одном запарка и опоздания, а на другом в это время всего 3 заказа.
      Вот для этого и была создана моя система.


      1. VolCh
        23.12.2017 11:48

        А ERP система это прежде всего контроль за персоналом.

        Не согласен. Есть бизнесы, где персонала раз-два и обчёлся, причём этот персонал в основной деятельности на задействован, всё полностью автоматизировано.


        1. akadone Автор
          23.12.2017 11:58

          Согласен, но я про контекст задачи. Т.е. ресторанный бизнес. Тут в основном косячит персонал. Реже проблема с закончившимися продуктами и пр. Здесь нужна автоматизация только по распределению заказов по точкам и составлению рейсов курьерам. Всё остальное — это контроль в текущем времени — решение проблем с опозданиями и недовольными клиентами которым привезли не то или не вкусное.


  1. PravdorubMSK
    24.12.2017 15:34

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


  1. FyvaOldj
    24.12.2017 16:11

    И совершенно непонятно почему не была выбрана придуманная как раз для решения именно таких задач 1С Предприятие.


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


    Причем тут непонятны и позиции заказчика и позиции исполнителя. Наверное денег лишних много...


    Если лет 10 назад еще был смысл писать своеобразного дублера 1С Предприятия то сейчас это целесообразно только для очень узко заточенных решений


    1. VolCh
      24.12.2017 17:18

      Позиция исполнителя вполне понятна: 1С Предприятие не знает, не хочет с ним разбираться и(или) использовать. Или просто оценивает работу с 1С как менее выгодную по разным причинам.


      У заказчиков бывает, что предпочитают подобные решения по двум причинам (или их комбинации): считают, что в конечном счёте своя система будет дешевле и(или) более адаптированная под их нужды. Или просто не знают об альтернативах, есть знакомый разработчик, опимали задачу, он назвал приемлемую для заказчика цену и тот соглашается. Возможно даже поинтересовавшись стоимостью подобных разработок в каких-то фирмах, которые при одинаковой оценке трудозатрат разработчика называют сумму раза в два большую, по понятным причинам.


      1. Areso
        24.12.2017 17:54

        Далеко не каждый сумеет подружить мобильные устройства (очевидно, что заказчиком требовались [почти] нативные приложения) и 1С: Предприятие. Там своё, особенное кунг-фу. А если не использовать последние достижения науки и техники, я хотел сказать, платформы 1С: Предприятия, то мы еще упремся в какие-нибудь сторонние решения типа Агент Плюс (со своим же скриптовым языком, и отдельными лицензиями на каждое клиентское устройство). И да, там тоже надо быть парнем не промах.


        1. FyvaOldj
          24.12.2017 18:25

          Стоимость лицензий Агент+ по сравнению со стоимостью самописа очень даже невелика.


        1. Dementor
          24.12.2017 18:33

          Там своё, особенное кунг-фу.

          Нет там никакого кунг-фу. Был по обе стороны барикад (и как android-разработчик и как 1С-разработчик) еще до изобретения в платформе «1С: Предприятие 8» такой простой и приятной штуки как HTTP-сервисы, но и тогда не было особых причин для жалоб. Сейчас несложно организовать обмен с 1С по обычным HTTP-запросам (get, post, put, delete и всеми прочими), даже формат данных можно задавать самостоятельно — XML, JSON или что-то свое (но парсинг на стороне 1С придется делать самостоятельно).
          упремся в какие-нибудь сторонние решения типа Агент Плюс (со своим же скриптовым языком, и отдельными лицензиями на каждое клиентское устройство)

          Что вы хотели этим сказать? Что «работу» нужно «работать»? Так нам же за это деньги платят! :)
          В Агент Плюсе 1.5 применяется простой и всем известный Lua, а в двоечке действительно решили все сделать максимально как в 1С и выпустили конфигуратор, где можно точно так же как в 1С создавать новые объекты, описывать их интерфейс и писать код на 1С-подобном языке L9 (детальнее).


  1. zhavoronok
    25.12.2017 05:55

    Вся проблема в вашей статье — это заголовок и текст, читатель вашей статьи должен быть менеджером и программистом, отсюда этот формализм в комментах и скомканость в понимании статьи. Если вы затолкали это в раздел «Управление», то зачем здесь про весь этот код, скрипты, базы. Если вы сделали крутую систему, которая разворачивает всё производство начиная от планов, позволяет при этом отбалансировать мощности, рассчитать закупку, учесть сбыт и т.д., при этом смогли все это внедрить, то это круто. И вот об этом и надо было написать. Насколько реально повысилась эффективность (просрочки стало меньше, уменьшилось ли время доставки, готовки и т.д.), насколько выросла прибыль? А если хотели про фишки разработки и про новую студию рассказать, так и надо было отдельно в разработку писать.
    Обычно в таких ситуациях хуже другое, то, что сразу не видно — сопровождение и доработка. Почему все покупают обычно уже известные и готовые системы, потому что там во-первых, есть реальный кейс, как из этого получить прибыль, во-вторых — там есть лучшие практики логики, архитектуры, технологий, которые позволяют через год, два, пять не оказаться у разбитого корыта, когда очередной разработчик-одиночка потеряет энтузиазм под нагрузкой растущего бизнеса и устанет/задолбается реализовывать хотелки. При отсутствии документации, влезать в такие дебри никто не захочет. А разработка документации — это отдельный бюджет.
    Ваш клиент пошел на большой риск, и ему 10 раз надо подумать, как этот риск окупить. Я не говорю, что он поступил плохо, если все риски просчитаны и эффект сопоставим, то вопросов нет.


  1. alexey_public
    25.12.2017 13:11

    Хм… Оказался в такой же ситуации в этом году и тоже Delphi :-) Может тенденция :-))
    Был на фрилансере простой заказ на CRM для предприятия, проводящего освидетельствования водителей и автотранспорта с горящими сроками. Я решил на него отозваться, т.к. заказчик был территориально рядом (обычно заказчики в Москве и не хотят работать с теми, кто не может подъехать в офис и там пообщаться, было такое много раз, после чего я перестал реагировать на такие заказы).
    У меня есть готовая и отработанная платформа для ERP под win32 без веб-морды. Т.к. отработала более 10 лет, то быстрая реализация на ней всех требований по учету проверяемого автотранспорта, водителей, предприятий, всех сопроводительных документов и документов на автотранспорт и водителей заняла буквально 3-4 дня с базовой доводкой интерфейса, БД на бесплатной версии SQL Server, справочники, основной интерфейс учета, отчеты по проделанной работе. И это по нескольким от руки нарисованным листочкам заказчика, который сам не знал чего хотел, но срочно и сейчас.
    Ладно, принес, начинаю показывать и тихо прихожу в ужас, заказчик мыслит на уровне блокнота, но хочет много всего и не понимает как этим пользоваться. У него начинается расхождение хотелок и необходимости понять тот достаточно простой интерфейс (таблицы и формы редактирования их содержимого с простым и понятным набором полей). Дал структуру взаимосвязей таблиц, благо база небольшая и было все достаточно прозрачно по назначению, вот тут водители, они относятся к предприятиям и они необходимы, чтобы выпустить в рейс машину, на которой они уедут после освидетельствования.
    Да — структура базы в отличие от кода сразу была привязана к задачам предприятия, но это всего лишь CRM и специализированная для конкретного случая. К тому же упрощает работу по обслуживанию, мало ли что. А так все данные хорошо просматриваются.
    Но ладно думаю, как-нибудь пройдет, деньги очень небольшие, мне было интересно просто сделать что-то такое. Пусть думаю поработают, система запросто может переварить под сотню рабочих мест и миллионы строк записей в реалтайме на обычных ксеонах без каких-то усилий.
    Одним словом движок гораздо мощнее, чем им потребуется в обозримом будущем, а как вырастут — можно будет легко добавить любой разумный функционал.
    И вот через пару дней они меня просят приехать и обговорить то что они увидели в том что я сделал, а заодно я подкрутил некоторые места по интерфейсу, постаравшись реализовать его на максимально доступном понимаю уровне.
    И вот я приехал и началось — собрались абсолютно непричастные и раздались вопли — а вот хотим интерфейс как в банке! И чтобы вот тут и вот тут и вот эдак. При этом начинаем разбираться — и выясняется что они и работу в форме таблиц не понимают и взаимосвязей между сущностями, с которыми работают, до конца не уяснили.
    И при этом — они нажимают на то что им срочно, они открылись, только что открылись, к ним сейчас прибежит сотня клиентов и вот сейчас надо уже всех учитывать. Тихонько интересуюсь, а сколько работаем уже — два дня, а сколько клиентов пришлось учесть при помощи ручки и бумажки, ни одного, еще ни одного клиента у них не было :-)
    В общем после всех этих воплей уехал и начал задумываться, а надо ли оно мне, потраченного времени было уже в три раза больше, чем мне обещали заплатить. Но хотелось увидеть свой продукт в работе. И я продолжил, но уже без энтузиазма, понимая что их ждут проблемы. Ага, через пару дней позвонили и поинтересовались когда, хотя сроки в общем-то были оговорены(из-за всех выходных на пару дней больше). И вот тогда мне невзначай сообщили — мол уже ищут другого. Это было последней каплей. Обычно с клиентами я веду себя вежливо и никого никуда не послал. Просто моментально отказался от дальнейшей работы. Пусть теперь развлекаются со студентами (никто больше на эту сумму не согласится) и оплатой вызовов специалистов (своего админа и сервера у них не было). Что их ждет догадаться несложно.

    А вот основное внедрение и поддержка моей первой версии ERP было гораздо более интересным, там действительно было активно работающее предприятие — рекламное агентство с большим (более 500 страниц) оффлайновым журналом, с жесткими требованиями к реалтайму по всем данным, отчетам и прочему. Фиксации каждой мелочи, поддержка работы нескольких предприятий (они в процессе разделились на два отдельных со своими коллективами, но база общая на едином сервере, т.к. владелец общий), работы с клиентами и основной самый сложный функционал — это верстка этого самого журнала, сначала реалтайм, чтобы каждый мог увидеть текст и графику наполнения по всем полосам, и видеть что и куда ставить — в ERP, причем вид каждой страницы в интерфейсе ERP был полностью до каждого поля идентичен журналу, вплоть до шрифтов и их размеров, пришлось долго изучать все их параметры и автоматизировать работу с ними.
    А потом полностью автоматизированная верстка с учетом множества требований, вплоть до совмещения баннеров по заполнению (светлые или темные стороны баннеров вместе, причем учет и по вертикали и по горизонтали), с учетом их размеров, форматов заполнения, проданных местах в каждой полосе (сверху, снизу, в начале полосы, справа от развертки и т.д. и т.п.) и выгрузкой в Indesign где его уже выверяли и отправляли в печать. Было приятно — то что ранее делал целый отдел за день (еженедельно) а то и более перед выставкой, теперь занимало не более полчаса-часа у одного специалиста.
    Проработало много лет и активно дорабатывалось на ходу. А потом оффлайн умер, а онлайн уже не требовал такой сложной верстки и там все было сделано иначе и уже не мной.
    Но я не сдаюсь и работаю над следующей версией ERP :-) Вебморду обещаю прикрутить :-)