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

Серверные алгоритмы модификации объектов аналитики

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

Для хранения серверных алгоритмов модификации используются предустановленные имена свойств:

Если сохранить алгоритм под каким-либо другим именем свойства– он не будет интерпретироваться как серверный алгоритм модификации объекта аналитики, даже если обладает соответствующей сигнатурой. Регистр символов в имени алгоритма также имеет значение.


Примечание Предустановленные имена свойств для серверных алгоритмов модификации можно изменить в настройках сервера приложений (Команды администратора-Сервер-Редактор конфигурации в программе Radmin).

Последовательность запуска алгоритмов следующая:

  1. начало транзакции
  2. проверка прав доступа и т.п.
  3. серверный алгоритм ДО_МОДИФИКАЦИИ
  4. действие по модификации (добавление, изменение, удаление)
  5. серверный алгоритм ПОСЛЕ_МОДИФИКАЦИИ
  6. завершение транзакции.
(ДО_МОДИФИКАЦИИ и ПОСЛЕ_МОДИФИКАЦИИ – условные обобщенные имена для всех соответствующих алгоритмов модификации)

Алгоритм ДО_МОДИФИКАЦИИ принимает с клиентского места модифицируемый (добавленный, измененный или удаленный) объект аналитики и набор параметров. При этом наличие параметров зависит от того, разрешена ли передача параметров алгоритму ДО_МОДИФИКАЦИИ клиентским методом модификации. Алгоритм ДО_МОДИФИКАЦИИ может изменять полученные параметры. Алгоритм ПОСЛЕ_МОДИФИКАЦИИ также принимает в качестве параметров модифицируемый объект аналитики и измененный набор параметров от алгоритма ДО_МОДИФИКАЦИИ. Условие передачи параметров алгоритму ПОСЛЕ_МОДИФИКАЦИИ также задается в клиентском методе - если передача параметров запрещена, параметры от алгоритма ДО_МОДИФИКАЦИИ не будут получены. Результатом выполнения алгоритма ПОСЛЕ_МОДИФИКАЦИИ может быть, например, внесение изменений в какие-либо другие объекты аналитики, связанные с модифицированным объектом. Алгоритм ПОСЛЕ_МОДИФИКАЦИИ может изменять параметры и передавать их обратно в клиентский метод (опять же в случае, если в клиентском методе разрешен возврат параметров). Таким образом, поддерживается сквозная передача параметров между клиентским методом и серверными алгоритмами модификации; при этом клиентский метод может запретить передачу параметров на любом из этапов. В случае, если передача параметров запрещена, в алгоритм передается пустая переменная типа АЛГ_ПАРАМ. Права доступа к объекту, передаваемые во все алгоритмы модификации, являются входным параметром и не могут изменяться в алгоритмах. Права доступа можно использовать для анализа условий модификации объекта или для добавления других объектов с такими же правами в алгоритмах "после_модификации".

  1. Параметры алгоритмов ДО_ДОБАВЛЕНИЯ и ПОСЛЕ_ДОБАВЛЕНИЯ:

    ВЫЧИСЛИТЬ (ПЕРЕМ <T>: новый_объект; 
               ПЕРЕМ АЛГ_ПАРАМ: парам; 
               ПЕРЕМ ПРАВА_ДОСТУПА: доступ; 
               ПЕРЕМ ЛОГИКА: рез)
    //…
    КОНЕЦ
    
    • новый_объект - входной и выходной параметр в ДО_ДОБАВЛЕНИЯ, входной параметр в ПОСЛЕ_ДОБАВЛЕНИЯ. Добавляемый на клиентском месте объект аналитики. Вместо идентификатора <T> задается имя объектного типа, который соответствует одному из родительских объектов аналитики. Возможно задать в качестве идентификатора и базовый объектный тип АНАЛИТИКА.
    • парам - входной и выходной параметр. Набор параметров.
    • доступ - входной параметр. Права доступа к добавляемому объекту.
    • рез - выходной параметр. Логическое значение результата выполнения серверного алгоритма.

    Пример

    Пример иллюстрирует использование алгоритма ПОСЛЕ_ДОБАВЛЕНИЯ, в ходе работы которого создаются связи после добавления нового объекта аналитики. Создание нового объекта аналитики в ветке "ТОВАРЫ" происходит при помощи клиентского алгоритма добавления объектов аналитики, в котором так же вызывается окно для выбора объектов аналитики ветки "ПРОИЗВОДИТЕЛИ", с которыми будет связан созданный объект аналитики.

    ВЫЧИСЛИТЬ(ПЕРЕМ АНАЛИТИКА: об;         // вход
              ПЕРЕМ АЛГ_ПАРАМ: парам;      // вход/выход
              ПЕРЕМ ПРАВА_ДОСТУПА: доступ; // вход
              ПЕРЕМ ЛОГИКА: рез)           // вход/выход
    
      ПЕРЕМ АССОЦ: ассоциации
      ПЕРЕМ АЛГ_МАССИВ: пр = парам.парам["добав_связь"]
      ЦИКЛ ИНДЕКС(знач = пр.парам[инд])
        ассоциации.объекты[знач] = ДА
      КОНЕЦ_ЦИКЛА
      ЕСЛИ ассоциации.ЗАПИСАТЬ(об.КОД_АБС, "ПРОИЗВОДИТЕЛИ") ТО
        ОТЛАДКА("да")
      ИНАЧЕ
        ОТЛАДКА("нет")
      КОНЕЦ_ЕСЛИ
      рез = ДА
    КОНЕЦ
    

    Клиентский алгоритм создания нового объекта аналитики и выбора ассоциируемых с ним других объектов аналитики приведен ниже.

    Показатьподробное объявление типов для диалогового окна
    ТИП ДобОбъект(ДИАЛОГ)
    [
      СТРОКА: заголовок = "Добавление объекта в ветку Товары";
      ЧИСЛО: ширина = 355;
      ЧИСЛО: высота = 242;
      ЧИСЛО: верхний = 94;
    
      КНОПКА: кн_отмена = [ левый = 280,
        верхний = 205,
        высота = 25,
        ширина = 65,
        табиндекс = 6,
        текст = "Отмена",
        нажатие = отмена_нажатие ];
    
      КНОПКА: кн_ок = [
        левый = 200,
        верхний =205,
        высота = 25,
        ширина = 65,
        табиндекс = 5,
        доступный = НЕТ,
        текст = "Ок",
        нажатие = ок_нажатие ];
    
      ТЕКСТ: Текст2 = [ левый = 15,
        верхний = 50,
        высота = 25,
        ширина = 65,
        табиндекс = 4,
        текст = "Название:" ];
    
      РЕДАКТОР: ред_название = [ левый = 90,
        верхний = 50,
        высота = 25,
        ширина = 200,
        табиндекс = 2 ];
    
      ТЕКСТ: Текст1 = [ левый = 15,
        верхний = 15,
        высота = 25,
        ширина = 35,
        табиндекс = 3,
        текст = "Код:" ];
    
      РЕДАКТОР: ред_код = [ левый = 90,
        верхний = 15,
        высота = 25,
        ширина = 120,
        табиндекс = 1,
        изменение = код_изменение ];
    
      ФУНКЦИЯ ок_нажатие(ПЕРЕМ КНОПКА: кнопка)
        ЗАКРЫТЬ("OK")
      КОНЕЦ_ФУНКЦИИ
    
      ФУНКЦИЯ отмена_нажатие(ПЕРЕМ КНОПКА: кнопка)
        ЗАКРЫТЬ("")
      КОНЕЦ_ФУНКЦИИ
    
      ФУНКЦИЯ код_изменение(ПЕРЕМ РЕДАКТОР: ред)
        ЕСЛИ ред.текст <> "" ТО
          кн_ок.доступный = ДА
          ОБНОВИТЬ
        ИНАЧЕ
          кн_ок.доступный = НЕТ
          ОБНОВИТЬ
        КОНЕЦ_ЕСЛИ
       КОНЕЦ_ФУНКЦИИ
    
    ]
    
    КОНСТ ветка = "ПРОИЗВОДИТЕЛИ";
    ВЫЧИСЛИТЬ(ПЕРЕМ АНАЛИТ_КОНТЕКСТ: контекст; // вход
              ПЕРЕМ АНАЛИТИКА: об;             // вход/выход
              ПЕРЕМ ПРАВА_ДОСТУПА: права;      // вход/выход
              ПЕРЕМ МОДИФ_ПАРАМ: парам;        // вход/выход
              ПЕРЕМ ПУБЛ_ПАРАМ: публ;          // вход/выход
              ПЕРЕМ СТРОКА: рез)               // вход/выход
    
      // OK - CANCEL - CONTINUE
      ПЕРЕМ ДобОбъект: длг;
      парам.после = ДА
      ЕСЛИ длг.ПОКАЗАТЬ_МОДАЛЬНЫЙ = "OK" ТО
        об._код = контекст.корень + "/" + длг.ред_код.текст
        об._название = длг.ред_название.текст
        ПЕРЕМ ДИАЛОГ_АНАЛИТ: выб_длг
        выб_длг.заголовок = "Выберите производителей"
        выб_длг.абс_код = ДА
        выб_длг.выбор_множ = ДА
        выб_длг.состояния[1] = [корень = ветка]
        рез = "OK"
     ИНАЧЕ
        рез = "CANCEL"
      КОНЕЦ_ЕСЛИ
      ЕСЛИ выб_длг.ПОКАЗАТЬ = ДА ТО
        ПЕРЕМ АССОЦ: ассоциации
        ПЕРЕМ АЛГ_МАССИВ: алг_масс
        ЦИКЛ ИНДЕКС(знач = выб_длг.выд_множ[инд])
          ассоциации.объекты[знач.код] = ДА
          алг_масс.парам[инд] = знач.код
        КОНЕЦ_ЦИКЛА
        парам.парам.парам["добав_связь"] = алг_масс
      КОНЕЦ_ЕСЛИ
    КОНЕЦ
  2. Параметры алгоритмов ДО_ИЗМЕНЕНИЯ и ПОСЛЕ_ИЗМЕНЕНИЯ:

    ВЫЧИСЛИТЬ (ПЕРЕМ <T>: старый_объект; 
               ПЕРЕМ <T>: новый_объект; 
               ПЕРЕМ АЛГ_ПАРАМ: парам; 
               ПЕРЕМ ПРАВА_ДОСТУПА: доступ; 
               ПЕРЕМ ЛОГИКА: рез)
    //…
    КОНЕЦ
    
    • старый_объект - входной параметр. Объект аналитики на клиентском месте до операции изменения.
    • новый_объект - входной и выходной параметр в ДО_ИЗМЕНЕНИЯ, входной параметр в ПОСЛЕ_ИЗМЕНЕНИЯ. Объект аналитики на клиентском месте после изменения.
    • парам - входной и выходной параметр. Набор параметров.
    • доступ - входной параметр. Права доступа к новому объекту (к объекту после изменения).
    • рез - выходной параметр. Логическое значение результата выполнения серверного алгоритма.

    Пример

    Пример иллюстрирует использование алгоритма ПОСЛЕ_ИЗМЕНЕНИЯ, в ходе работы которого при редактировании названия выбранного объекта аналитики на сервере происходит проверка количества символов в названии - если количество символов в названии объекта меньше трех, то результат выполнения серверного алгоритма инициализируется значением НЕТ, чтобы повторно вызвать клиентский алгоритм редактирования объекта аналитики. Так же создается специальный параметр, который потом будет передан клиентскому алгоритму в качестве одного из полей параметра модификации.

    ВЫЧИСЛИТЬ(ПЕРЕМ Товары: об_старый;     // вход
              ПЕРЕМ Товары: об_новый;      // вход
              ПЕРЕМ АЛГ_ПАРАМ: парам;      // вход/выход
              ПЕРЕМ ПРАВА_ДОСТУПА: доступ; // вход
              ПЕРЕМ ЛОГИКА: рез)           // вход/выход
    
    ЕСЛИ ДЛИНА(об_новый._название) > 3 ТО
      парам.парам["повторввод"] = ДА
      рез = НЕТ
    ИНАЧЕ
      парам.парам["повторввод"] = НЕТ
      рез = ДА
    КОНЕЦ_ЕСЛИ
    КОНЕЦ
    

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

    ВЫЧИСЛИТЬ(ПЕРЕМ АНАЛИТ_КОНТЕКСТ: контекст; // вход
              ПЕРЕМ Товары: об;             // вход/выход
              ПЕРЕМ МОДИФ_ПАРАМ: мп;        // вход/выход
              ПЕРЕМ ПУБЛ_ПАРАМ: публ;          // вход/выход
              ПЕРЕМ СТРОКА: рез)               // вход/выход
    
      // OK - CANCEL - CONTINUE
      мп.после = ДА
      мп.возврат = ДА
      ЕСЛИ &мп.парам.парам["повторввод"] ТО
        ЕСЛИ мп.парам.парам["повторввод"] ТО
          СООБЩЕНИЕ("название должно быть от трех символов! повторите ввод")
        КОНЕЦ_ЕСЛИ
      КОНЕЦ_ЕСЛИ
      рез = "CONTINUE"
    КОНЕЦ
  3. Параметры алгоритмов ДО_УДАЛЕНИЯ и ПОСЛЕ_УДАЛЕНИЯ:

    ВЫЧИСЛИТЬ (ПЕРЕМ <Т>: удал_объект; 
               СТРОКА: замена; 
               ПЕРЕМ АЛГ_ПАРАМ: парам; 
               ПЕРЕМ ПРАВА_ДОСТУПА: доступ; 
               ПЕРЕМ ЛОГИКА: рез)
    // …
    КОНЕЦ
    
    • удал_объект - входной параметр. Удаляемый на клиентском месте объект аналитики.
    • замена - входной параметр. Ссылка на абсолютный путь к другому объекту аналитики, которым будут заменены ссылки на удаляемый объект в других объектах и операциях.
    • парам - входной и выходной параметр. Набор параметров.
    • доступ - входной параметр. Права доступа к удаляемому объекту.
    • рез - выходной параметр. Логическое значение результата выполнения алгоритма.

    Пример

    Пример иллюстрирует использование алгоритма ДО_УДАЛЕНИЯ, в ходе работы которого при удалении выбранного объекта аналитики происходит поиск и удаление всех связанных с ним объектов.

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

    Удаление выбранного объекта аналитики происходит при помощи клиентского алгоритма удаления объекта.

    ВЫЧИСЛИТЬ(ПЕРЕМ АНАЛИТ_КОНТЕКСТ: контекст; // вход
              ПЕРЕМ АНАЛИТИКА: об;             // вход
              ПЕРЕМ СТРОКА: замена;            // вход/выход
              ПЕРЕМ МОДИФ_ПАРАМ: мп;           // вход/выход
              ПЕРЕМ СТРОКА: рез)               // вход/выход
    
      // OK - CANCEL - CONTINUE
      мп.до = ДА
      УДАЛИТЬ_ОБЪЕКТ(об._код, "")   
      рез = "OK"
    КОНЕЦ
    

См. также: