Руководство разработчика

Алгоритмы модификации

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

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

  1. начало транзакции;
  2. вызов алгоритма "до-";
  3. внесение изменений в базу;
  4. вызов алгоритма "после-";
  5. завершение транзакции.

Объекты аналитики образуют иерархическую структуру данных, с помощью которой платформа представляет различную справочную и служебную информацию. Так ветки плана аналитики в контексте прикладного решения могут ассоциироваться, например, с бухгалтерским планом счетов, справочником контрагентов и т.п. Прикладные решения могут хранить на служебных ветках плана аналитики свои конфигурационные данные. Объекты аналитики могут зависеть друг от друга различными способами. Например, в контексте прикладной задачи значения какого-то свойства двух объектов должны быть согласованы между собой. Также объекты могут быть ассоциированы с другими объектами с отношением "многие ко многим". Поддержание таких зависимостей реализуется в коде алгоритмов модификации. Рассмотрим работу алгоритмов модификации на примере алгоритма "до добавления" объекта аналитики:

ВЫЧИСЛИТЬ(ПЕРЕМ АНАЛИТИКА: об;
          ПЕРЕМ АЛГ_ПАРАМ: парам;
          ПЕРЕМ ПРАВА_ДОСТУПА: доступ;
          ПЕРЕМ ЛОГИКА: рез)
    //...
    рез = ДА
КОНЕЦ

Значения всех свойств, код, название и другие данные объекта аналитики передаются алгоритму в параметре "об". Отдельно передаются права доступа в параметре "доступ". Дополнительные параметры, задаваемые прикладным решением, передаются в структуре данных "парам". Все эти три параметра являются входными и выходными, т.е. алгоритм может изменить любые из них (хоть код объекта аналитики) и изменения будут учтены при сохранении. Выходной логический параметр "рез" позволяет запретить запись изменений, если ему будет установлено значение НЕТ. Дальнейшая обработка при этом производиться не будет, транзакция будет отменена, а функция добавления вернет ошибку "добавление отменено алгоритмом модификации".

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

Создать проект алгоритма модификации очень просто. Выберите в мастере создания проекта шаблон с именем "До добавления объекта". Укажите, для какого объекта добавить алгоритм. Имя свойства "ДО_ДОБАВЛЕНИЯ" будет подставлено автоматически. После завершения работы мастера будет сгенерирован исходный текст наподобие приведенного выше.

Для операций алгоритмы модификации привязываются к типу операции. Код алгоритмов сохраняется в плане аналитики на служебных ветках в свойствах типа "алгоритм". Имена таких свойств могут быть любыми, кроме имен зарезервированных для алгоритмов объектов аналитики: ДО_ДОБАВЛЕНИЯ и т.д.

Для примера добавим алгоритм "после добавления" для типа операции "Отпуск" в журнале "ЖурналОтпусков". Для создания проекта в мастере проектов выберем шаблон "После добавления операции". Введем код объекта аналитики и имя свойства, которые будут хранить код. Например, код объекта служебной ветки плана аналитики "ЗАРПЛАТА/АЛГОРИТМЫ/Отпуска" и имя свойства "ПослеДобавления". Мастер создаст следующую заготовку тела программы:

ВЫЧИСЛИТЬ(СТРОКА: журнал;
          ПЕРЕМ ОПЕРАЦИЯ: оп;
          ПЕРЕМ АЛГ_ПАРАМ: парам;
          ПЕРЕМ ПРАВА_ДОСТУПА: доступ;
          ПЕРЕМ ЛОГИКА: рез)
    //...
    рез = ДА
КОНЕЦ

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

Специальной разновидностью алгоритмов модификации, применяемой только к операциям, являются алгоритмы расчета итогов. Алгоритмы итогов позволяют производить распределенное по времени вычисление сумм, остатков и т.п. Расчет итогов построен на вычислении численного вклада операции в один или несколько итоговых показателей. Такими показателями могут быть, например, сумма документа или количество товара. Алгоритму не сообщается, в какой ситуации он вызван, что происходит с операцией. Это обеспечивает согласованное поведение при любых изменениях операции. Например, при добавлении операции и последующем ее удалении, вклады в итоговые показатели со знаком "+" и со знаком "-" компенсируют друг друга. Следующие схемы показывают моменты вызова алгоритмов итогов и знак применения вклада операции:

Добавление:

  1. вызов алгоритма "до добавления";
  2. вызов алгоритмов итогов со знаком "+";
  3. добавление операции в базу;
  4. вызов алгоритма "после добавления".

Изменение:

  1. вызов алгоритма "до изменения";
  2. вызов алгоритмов итогов со знаком "-" (для старого значения операции);
  3. изменение операции в базе;
  4. вызов алгоритмов итогов со знаком "+" (для нового значения операции);
  5. вызов алгоритма "после изменения".

Удаление:

  1. вызов алгоритма "до удаления";
  2. вызов алгоритмов итогов со знаком "-";
  3. удаление операции в базе;
  4. вызов алгоритма "после удаления".
В Инфо-Бухгалтер 10 алгоритмы модификации обеспечивают взаимозависимость прикладных данных. Описание взаимосвязей осуществляется на внутреннем языке с использованием типов АНАЛИТИКА, ОПЕРАЦИЯ и др., хорошо известных прикладным программистам по реализации клиентских программ. В СУБД такие задачи решаются созданием сохраненных процедур, написанных с помощью расширений языка SQL, наложением ограничений на данные и другими средствами, специфическими для конкретной СУБД.