Глава 11. МНОГОМЕРНЫЕ РЕГИСТРЫ 
Автоматическое проведение документов в регистрах 
Так как хранимые процедуры шаблонов в любой момент предоставляют нам 
необходимый «кусок» записей регистра, остается лишь сохранить 
этот набор в таблице регистра. Если мы хотим «
перепровести» уже существующий документ (например, после внесения 
в него изменений), то нужно сначала удалить старые записи 
из регистра по данному документу, а затем вставить новые 
записи, поставляемые хранимой процедурой шаблона. Упростить вставку записей 
в регистр можно с помощью вызова хранимой процедуры <имя
_главной_таблицы_документа>_R_CHANGE
. Эта хранимая процедура создается программой автоматически при настройке шаблонов 
записей по регистрам. Текст этой процедуры зависит от того
, какие шаблоны имеет конкретный тип документа. 
Идеология системы Allegro предполагает, что все необходимые для проведения 
данные уже подготовлены и хранятся в самих документах. В 
частности, если документ списывает стоимость товаров, уходящих со 
склада, то эта стоимость должна быть предварительно вычислена и 
сохранена в соответствующем  поле документа. Вычисление стоимости может производиться 
на основе запросов к таблице регистра или таблицам итогов в 
процессе создания документа, однако при проведении документа с помощью 
хранимой процедуры  <имя_главной_таблицы_документа
>_R_CHANGE эта информация может лишь использоваться, 
но не модифицироваться. 
Процедура <имя_главной_таблицы_документа>_
R_CHANGE имеет три входных параметра: 
 
  
    | Название параметра | 
    Тип данных | 
    Назначение | 
   
  
    | ID | 
    INTEGER | 
    Внутренний ID документа (NULL – все документы этого типа
) | 
   
  
    | N | 
    INTEGER | 
    Внутренний номер позиции документа (NULL – все позиции) | 
   
  
    | REG_TEMPLATE_ID | 
    INTEGER | 
    Внутренний ID шаблона (NULL – все шаблоны для документа 
этого типа) | 
   
 
 
Параметры ID и REG_TEMPLATE_ID не могут 
одновременно принимать значение NULL. Если такое произошло, процедура 
не создаст записей в регистре. 
Если параметр ID принимает значение NULL, то перепроводятся все 
документы этого типа одним шаблоном, для которого указан REG
_TEMPLATE_ID. 
Если параметр N отличен от NULL, то перепроводится одна 
строка подчиненной таблицы (позиция документа). 
Если параметр ID отличен от NULL, а параметр REG
_TEMPLATE_ID равен NULL, то конкретный документ 
перепроводится всеми имеющимися шаблонами во всех регистрах, которые они 
затрагивают. 
Пример хранимой процедуры, осуществляющей перепроведение документов типа «межскладское 
перемещение»: 
CREATE PROCEDURE DISPLACEMENT_R_CHANGE (ID INTEGER
, N INTEGER, 
REG_TEMPLATE_ID INTEGER) 
AS 
DECLARE VARIABLE PERIOD_START DATE; 
BEGIN 
/*Текст данной процедуры создан системой Allegro автоматически.*/ 
/*Не меняйте этот текст. Ваши изменения могут быть 
утеряны*/ 
IF ((ID IS NULL) AND (REG
_TEMPLATE_ID IS NULL)) THEN 
EXIT; 
/*Выбираем дату начала периода*/ 
SELECT START_DATE FROM PERIOD_PROPERTIES INTO 
:PERIOD_START; 
/*Удаляем прежние записи из регистра GOODS_REG
*/ 
DELETE FROM GOODS_REG 
WHERE 
((:ID IS NULL) OR (DOC_
ID = :ID)) AND 
((:N IS NULL) OR (DOC_
N = :N)) AND 
((:REG_TEMPLATE_ID IS NULL) 
OR (REG_TEMPLATE_ID = :REG
_TEMPLATE_ID)); 
/*Вставляем новые записи в регистр*/ 
IF ((REG_TEMPLATE_ID IS NULL
) OR (REG_TEMPLATE_ID = 101
)) THEN 
INSERT INTO GOODS_REG(ID, DOC
_ID, DOC_N, REG_TEMPLATE
_ID, OP_DATE, 
ACC, GOODS, INCOME, INCOME_AMOUNT
, OUTCOME, OUTCOME_AMOUNT) 
SELECT GEN_ID(GOODS_REG_
ID_GEN, 1), DOC_ID, 
DOC_N, REG_TEMPLATE_ID, 
OP_DATE, 
ACC, GOODS, INCOME, INCOME_AMOUNT
, OUTCOME, OUTCOME_AMOUNT 
FROM DISPLACEMENT_REG_TEMPLATE(NULL, 
NULL, :ID, :N) 
WHERE OP_DATE >= :PERIOD_START
; 
END 
Итак, для перепроведения конкретного документа какого-то типа
, нам достаточно вызвать хранимую процедуру <имя_главной
_таблицы_документа>_R_CHANGE, передав 
в нее входным параметром ID документа. Например, так 
можно полностью перепровести в регистрах документ «Межскладского перемещения» 
с ID = 11035: 
execute procedure displacement_r_change(11035, NULL, NULL);
 
Разработчик для вызова этой команды может воспользоваться также процедурой встроенного 
языка: 
procedure MakeRegEntries(const MainTableName: string;
        doc_id,doc_n, reg_template_id: integer; ATransaction: TIBTransaction);
Процедура MakeRegEntries вызывает эту же SQL команду в контексте определенной 
транзакции. В качестве параметров нужно передать название главной таблицы 
документа, внутренний ID документа, который следует перепровести, 
внутренний идентификатор позиции (N) документа, внутренний идентификатор 
шаблона и указатель на компонент транзакции. При вызове этой 
функции из текста скриптового проекта конфигурирующий в соответствующих параметрах передает 
вместо NULL значение 0,если не хочет уточнять какой
-то из целочисленных параметров, например: 
MakeRegEntries(‘DISPALCEMENT’, 11035,0,0);
   //перепроведение в регистрах всех позиций документа
   //«межскладское перемещение» с ID=11035
 
Так как все действия по перепроведению документов производятся на сервере
, это происходит без ощутимых затрат времени (практически мгновенно
). 
 
 
               |