Справка Инфо-Бухгалтер 10

Обмен данными при расчете на сервере

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

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

Параметры вызывающего и вызываемого алгоритмов должны быть обязательно инвариантных типов. Как правило, в качестве параметров используются переменные типа АЛГ_МАССИВ, АЛГ_ПАРАМ. Тип АЛГ_МАССИВ используется для хранения вложенных параметров, поэтому с его помощью можно создавать структуры данных любой сложности для передачи между клиентом и сервером.

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

Пример ниже иллюстрирует процесс формирования отчета общей суммы товаров на складе по всей ветке "ТОВАРЫ" плана аналитики. Расчет происходит не путем обращения к серверу по каждому объекту, а путем передачи строкового кода ветки аналитики. Получив код ветки аналитики, сервер умножает значения свойств для каждого объекта. Расчитанные данные суммы и соответствующее ей название объекта аналитики упаковываются в переменные типа АЛГ_МАССИВ, АЛГ_ПАРАМ для передачи их обратно на клиент. Далее на клиенте эти переменные интерпретируются и ими заполняется отчет.

Передача параметра на сервер и интерпретация расчетов с сервера
ТИП Отчет(ОТЧЕТ)
[
  ПОДМЕНА до_открытия = {Формирование};
  АЛГ_МАССИВ: рез_расчета;
  
  ФУНКЦИЯ ЛОГИКА: Формирование
    РЕЗУЛЬТАТ = ДА
    ПЕРЕМ ЦЕЛОЕ: номер_стр
    ПЕРЕМ СТОЛБЕЦ_СХЕМЫ: столбец1, столбец2, столбец3
    столбец1 = [имя = "номер", заголовок = "№",фикс = ДА]
    столбец2 = [имя = "наим", заголовок = "наименование"]
    столбец3 = [имя = "сумма", заголовок = "сумма"]

    ПЕРЕМ СХЕМА: сх = [изм_порядка = ДА, изм_загол = ДА, изм_оформл = ДА, 
    столбцы = (столбец1, столбец2, столбец3)]
    УСТ_СХЕМУ_ПО_УМОЛЧ(сх)
    ЕСЛИ УСТ_ИМЯ_СХЕМЫ("отчет_сумма") ТО
      ПЕРЕМ СХЕМА: схема
      СЧИТАТЬ_СХЕМУ(схема)
    КОНЕЦ_ЕСЛИ
   ПЕРЕМ ЦЕЛОЕ: сч
   сч = 1
   ЦИКЛ ИНДЕКС(товар = мас.парам[*])
     ПЕРЕМ номер_стр = ДОБАВИТЬ_СТРОКУ("строка" + СТР(сч))
     ПЕРЕМ АЛГ_ПАРАМ: эл
     эл = товар
     ЯЧЕЙКА("номер", сч, сч)
     ЯЧЕЙКА("наим", сч, эл.парам["название"])
     ЯЧЕЙКА("сумма", сч, эл.парам["сумма"]) 
     сч++
    КОНЕЦ_ЦИКЛА
  КОНЕЦ_ФУНКЦИИ
  
]

ФУНКЦИЯ Отправ_сервер(СТРОКА: код; ПЕРЕМ АЛГ_МАССИВ: мас)
  ВЫПОЛНИТЬ_СЕРВ({"серверный_расчет.ibx"} (код, ПЕРЕМ мас), ДА)
КОНЕЦ_ФУНКЦИИ

ВЫЧИСЛИТЬ
  ПЕРЕМ код = "ТОВАРЫ" 
  ПЕРЕМ АЛГ_МАССИВ: мас
  Отправ_сервер(код, мас)
  ПЕРЕМ Отчет: отчет
  отчет.рез_расчета = мас
  отчет.ПОКАЗАТЬ
КОНЕЦ
серверный_расчет.ibx
ВЫЧИСЛИТЬ(СТРОКА: код; ПЕРЕМ АЛГ_МАССИВ: мас)
  ПЕРЕМ ФИЛЬТР_ОБЪЕКТОВ: ф
  ПЕРЕМ МАСКА_АН: маска 
  ПЕРЕМ АНАЛИТИКА: сч
  ПЕРЕМ АЛГ_ПАРАМ: пр
  ЦИКЛ УРОВЕНЬ(код, ф, маска, сч)
    ПЕРЕМ сумма = сч._свойства["цена"].значение * сч._свойства["колич"].значение
    пр.парам["название"] = сч._название
    пр.парам["сумма"] = сумма
    мас.парам += пр
  КОНЕЦ_ЦИКЛА
КОНЕЦ

См. также: