Если делать альтернативу 1С, то какие брать готовые компоненты?

Автор trdm, 01 апреля 2024, 11:18

« назад - далее »

Злоп

Цитата: AlexGM от 18 мая 2024, 05:21На киоске считали штрихкод - идет вызов функции "ОбработатьШК("20000001")" - на сервере 1С все отрабатывает и отправляет клиенту ответ с измененными полями - клиент обновляет интерфейс. Вся тяжелая работа с БД и вычисления - на сервере, клиент работает в основном с отображением информации.
Типа:
На клиенте формируется текстовый запрос
"ОбработатьШК("20000001")", передаётся на "сервер приложений", сервер приложений по ОЛЕ (?) выполняет это код в сессии 1С, получает результат и отдаёт клиенту...
Типа так?

Djelf

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

AlexGM

   Подробнее механизм выглядит так:
1. С клиента на сервер уходит команда, которая будет исполнятся в 1С.
2. Сервер передает команду в отображаемый файл, предварительно проверив, запущена ли 1С.
3. На стороне 1С запущена внешняя компонента, считывающая команду из отображаемого файла.
4.1 Если 1С 7.7, внешняя компонента передает команду на выполнение через EvalExr или ExecBath - похоже, но не OLE. Доступны функции, процедуры, переменные глобального модуля.
4.2 Если 1С 8.3, на выполнение команда передается чуть иначе - в обслуживающей обработке вызываются функции EvalExp и ExecBatch соответственно, могут быть другие названия - сохранены для единообразия. В этих функциях команда выполняется через функции "Вычислить" и "Выполнить". Доступны функции, процедуры, переменные обработки.
5. Результат выполнения возвращается в отображаемый файл.
6. Сервер видит ответ в отображаемом файле и передает его клиенту.

   Позднее на гите дополню описание, есть вариант работы клиента через HTTP+JSON, выложу обработку для работы с 1С 8.3.

Злоп

3. "На стороне 1С запущена внешняя компонента, считывающая команду из отображаемого файла"
- компонента считывает по факту появления/изменения файла?

Злоп

Если не брать в расчёт быстродействие самого вычисления в 1с на сервере - запрос-ответ быстро проходит?

Злоп

4.1 а почему понадобилась прокладка в виде ВК на стороне 1с-на-сервере именно в части передачи на выполнение в ту же самую 1с? Просто интересно...

Злоп

Цитата: Djelf от 18 мая 2024, 13:03Злоп, ну зайди на гитхаб уже, там на первой странице все расписано достаточно понятно.
Я там как говорится "узнал всё буквы, но не смог прочитать слово" ;-)

Злоп

"5. Результат выполнения возвращается в отображаемый файл."
- в отображаемый файл результат кладёт ВК или 1С? (Думаю что ВК).
т.е. ВК читает из файла "запрос", типа
"ПолучитьАктивнуюНоменклатуру()",
передаёт на исполнение, 1с исполняет типа
  ...
  Возврат ТЗноменклатура;
Конецфункции // ПолучитьАктивнуюНоменклатуиу

И полученную ТЗ кладёт в отображаемый файл?

AlexGM

  Это не файл в традиционном понимании. Физически на диске его нет, он в памяти - File mapping, winapi. Основные потери времени в сети. Сама проверка события в цикле с небольшой задержкой, чтобы процессор не грузить. Пробовал через сообщения винды реализовать, но сложно отлавливать их на стороне 1С. На сервере под это сейчас отдельная go-рутина создается (как бы поток, но дешевле).
  По скорости запрос-ответ по факту все прозрачно, на быстрых операциях на киоске нет ощущения, что он задумывается. Если на стороне 1С тяжелый запрос - там да, приходится выводить окно ожидания.
  ВК на стороне 1С получилась в ходе эволюции: найдены были два пути выполнения кода, через OLE и через ВК. Первоначально была попытка запуска 1С через OLE, но таким сложно управлять. При запуске процесса есть много информации о нем, возможность управление через winapi. А из ВК есть доступ интересным интерфейсам. Там же, в ВК сделан клиент TCP и можно интегрироваться с разными серверами приложений в рамках сети.
  Плюс OLE в том, что не нужен файл для передачи команд и простота реализации на стороне 1С - не нужна даже обработка вспомогательная и ее автозапуск. Однако, был выбран путь на универсальность, для использования разных приложений. И когда начали переходить на 8-ку она взлетела с минимальными доработками. Но сложность закрытия тогда поставила на этом направлении крест. Еще были только индивидуальные экземпляры, при дисконнектах они оставались. После закрытия сервера продолжали висеть.

AlexGM

Цитата: Злоп от 18 мая 2024, 15:41"5. Результат выполнения возвращается в отображаемый файл."
- в отображаемый файл результат кладёт ВК или 1С? (Думаю что ВК).
т.е. ВК читает из файла "запрос", типа
"ПолучитьАктивнуюНоменклатуру()",
передаёт на исполнение, 1с исполняет типа
  ...
  Возврат ТЗноменклатура;
Конецфункции // ПолучитьАктивнуюНоменклатуиу

И полученную ТЗ кладёт в отображаемый файл?

Да, это работа ВК, 1С ведь ничего не знает про отображаемые файлы. Команд два типа, EvalExpr возвращает вычисленное выражение, ExecBatch успешность выполнения. Результат вызова ВК укладывает в файл и ставит флаг "Ответ готов".

   Однако, на стороне ВК таблица значений уже не совсем таблица значений. Сейчас лучше передавать базовые типы.

AlexGM

   Журнал работы киоска для примера. Команды с клиента в фигурных скобках, ответ в квадратных. Сначала устанавливаются переменные (они же параметры) сессии. Далее прописывается путь внешней обработки с логикой работы киоска. через функцию глобального модуля глВКВызов достаются внутренние функции обработки (использована процедура ПриПовторномОткрытии). Точность журнала 1 сек, все ответы идут в ее пределах.

06:22:08> {Set Version 14/10/2021}
06:22:08> [200]
06:22:08> {Set CodePage 1}
06:22:08> [200]
06:22:08> {Set Timeout 60}
06:22:08> [200]
06:22:08> {Set UserIndex 6}
06:22:08> [200]
06:22:12> {EB глВК_ОбработкаТип=1; глВК_Обработка=КаталогИБ()+"Служебная\Автозапуск\"+НазваниеНабораПрав()}
06:22:12> [250]
06:22:12> {EE глВКВызов("250")}
06:22:12> [250] 250250
Строка ЕИ шт␁
08:23:31> {EE глВКВызов("АнализШК(""2180000014882"")")}
08:23:31> [250] 2500
Строка ПРЕДЪЯВЛЕНОЗАМЕСЯЦ 68,360 н/ч␁Строка НЕПРИНЯТОЗАМЕСЯЦ 15,990 н/ч␁Строка РАБОЧИЙ ␁
08:23:33> {EE глВКВызов("АнализШК(""2280003721210"")")}
08:23:33> [250] 250
Таблица ВЫПОЛНЕНИЕ ␁Строка ИТК 0␁Строка ИТВ 0␁Строка ПОЗИЦИЯ ␁Строка ПАРТИЯ 00␁Строка ОТДЕЛЕНИЕ ␁Строка ЧЕРТЕЖ ␁Строка ОШИБКА ␁
08:23:42> {EE глВКВызов("ПоискОперации(""010"")")}
08:23:42> [250] 2501
Таблица ВЫПОЛНЕНИЕ ␁Строка ВРЕМЯОП 0.02␁Строка МОЖНОПРИНЯТЬ 24␁Строка НОРМА многостан.␁Строка СОДЕРЖАНИЕ Разряд работ:4; Время Тшк: 0.02
Слесарная␁Строка КОЛИЧЕСТВО 24␁
08:23:45> {EE глВКВызов("Принять(24)", 1)}
08:23:45> [250] 2501
Строка КОЛИЧЕСТВО ␁
08:23:51> {EE глВКВызов("ПоискОперации(""020"")")}
08:23:51> [250] 2501
Таблица ВЫПОЛНЕНИЕ ␁Строка ВРЕМЯОП 0.2␁Строка СОДЕРЖАНИЕ Разряд работ:5; Время Тшк: 0.2
Фрезерная␁Строка КОЛИЧЕСТВО 24␁
08:23:52> {EE глВКВызов("Принять(24)", 1)}
08:23:52> [250] 2501
Строка КОЛИЧЕСТВО ␁
08:23:59> {EE глВКВызов("ПоискОперации(""030"")")}
08:23:59> [250] 2501
Таблица ВЫПОЛНЕНИЕ ␁Строка КОЛИЧЕСТВО 24␁
08:24:00> {EE глВКВызов("Принять(24)", 1)}
08:24:00> [250] 2501
Строка КОЛИЧЕСТВО ␁
08:24:10> {EE глВКВызов("ПоискОперации(""040"")")}
08:24:10> [250] 2501
Таблица ВЫПОЛНЕНИЕ ␁Строка ВРЕМЯОП 0.15␁Строка СОДЕРЖАНИЕ Разряд работ:5; Время Тшк: 0.15
Фрезерная␁Строка КОЛИЧЕСТВО 24␁
08:24:11> {EE глВКВызов("Принять(24)", 1)}
08:24:11> [250] 2501
Строка КОЛИЧЕСТВО ␁
08:24:20> {EE глВКВызов("ПоискОперации(""050"")")}
08:24:20> [250] 2501
Таблица ВЫПОЛНЕНИЕ ␁Строка КОЛИЧЕСТВО 24␁
08:24:21> {EE глВКВызов("Принять(24)", 1)}
08:24:21> [250] 2501
Строка КОЛИЧЕСТВО ␁
08:24:40> {EE глВКВызов("АнализШК(""2180000014882"")")}
08:24:40> [250] 2500
Строка ПРЕДЪЯВЛЕНОЗАМЕСЯЦ 85,640 н/ч␁Строка НЕПРИНЯТОЗАМЕСЯЦ 33,270 н/ч␁
08:24:42> {EE глВКВызов("Выход()")}
08:24:42> [250] 250
Строка ПРЕДЪЯВЛЕНОЗАМЕСЯЦ ␁Строка НЕПРИНЯТОЗАМЕСЯЦ ␁Строка РАБОЧИЙ ␁Строка ВЫПОЛНЕНИЕ ␁Строка ИТК ␁Строка ИТВ ␁Строка ПОЗИЦИЯ ␁Строка ПАРТИЯ ␁Строка ЧЕРТЕЖ ␁Строка ВРЕМЯОП ␁Строка МОЖНОПРИНЯТЬ ␁Строка НОРМА ␁Строка СОДЕРЖАНИЕ ␁
08:24:43> {EE глВКВызов("Выход()")}
08:24:43> [250] 250

Злоп

А ВК постоянно держит связь с сервером приложений или общение с сервером приложений только исключительно через файл отображения?

AlexGM

Цитата: Злоп от 18 мая 2024, 16:45А ВК постоянно держит связь с сервером приложений или общение с сервером приложений только исключительно через файл отображения?
ВК то не подозревает ни о чем, особенно о сервере приложений. Для нее главное - отображаемый файл и флаг "Пришла команда". Отработать команду (вызывать функцию соответствующую с параметрами) и положить результат обратно. Кусок кода из ВК, обращение к 1С для выполнения команды:

    if lCmd='ec' then begin
      try
        Result_EC:='';
        lVal:='';
        lRes:='250';
        pEvent._AddRef;
        pEvent.ExternalEvent('TLNExt5', 'Command', lParam);
      except
        on E: Exception do begin
          lVal:=E.Message;
          lRes:='300';
        end;
      end;
    end;
    if lCmd='eb' then begin
      v77:=pConnect.AppDispatch;
      IDispatch(v77)._AddRef;

      lVal:='';
      lRes:='250';
      try
        lr:=v77.ExecuteBatch(lParam);
        if lr=0 then begin
          lVal:='';
          lRes:='301';
        end;
      except
        on E: Exception do begin
          lVal:=E.Message;
          lRes:='300';
        end;
      end;
    end;
    if lCmd='ee' then begin
      v77:=pConnect.AppDispatch;
      IDispatch(v77)._AddRef;

      lVal:='';
      lRes:='250';
      try
        lVal:=v77.EvalExpr(lParam);
      except
        on E: Exception do begin
          lVal:=E.Message;
          lRes:='301';
        end;
      end;
    end;

   По первой строке видно, что есть еще команда "EC", генерирующая в 1С внешнее событие. Работы по этому направлению кажутся перспективными, но логика не реализована дальше. Событие в 1С приходит, но нужно отправить ответ - в отличие от EE и EB здесь асинхронный механизм.
   Интерфейс pConnect ВК получает от 1С при создании. Из него возможно обращение к некоторым интерфейсам 1С, окно сообщений, управление окнами (можно создать свое), управление строкой статуса, расширение встроенного языка.

   Для сравнения, тот же участок для 8-ки. В ней можно передать в ВК ссылку на саму внешнюю обработку (F1C) и вызывать функции этой обработки напрямую:

  if lCmd='ee' then begin
    try
      lVal:=F1C.EvalExpr(lParam);
    except
      on E: Exception do begin
        lVal:='301'+#9+E.Message;
      end;
    end;
  end;

  if lCmd='ec' then begin
    try
      lVal:=F1C.ExecCmd(lParam);
    except
      on E: Exception do begin
        lVal:='301'+#9+E.Message;
      end;
    end;
  end;

  if lCmd='eb' then begin
    try
      lVal:=F1C.ExecBatch(lParam);
    except
      on E: Exception do begin
        lVal:='301'+#9+E.Message;
      end;
    end;
  end;

Злоп

 "флаг "Пришла команда".
- а откуда ВК этот флаг видит?

Злоп

Если жто всё доведено до ума и рабо о способно без особых глюков - это хорошее дело