Глава 10. БУХГАЛТЕРСКИЕ ПРОВОДКИ
Шаблоны операций, системные таблицы TEMPLATE, TEMPLATE_DEF
Allegro позволяет осуществлять как ручные бухгалтерские проводки, так и
автоматические. Автоматические проводки формируются на основе документов и шаблонов
операций. Каждый тип документа может иметь несколько шаблонов операций
. Шаблоны операций можно легко настраивать. Изменив шаблон операции
, мы всегда можем изменить способ проведения всех документов определенного
типа. Это создает большую гибкость как при разработке конфигурации
, так и при ее дальнейшем использовании. Каждый шаблон
имеет название операции и название хранимой процедуры, которая создает
набор проводок в формате журнала операций. Если мы перенастроим
шаблон, программа автоматически изменит текст этой хранимой процедуры.
Каждый шаблон содержит, кроме того, условие срабатывания,
что позволяет по-разному проводить одни и те же
типы документов, в зависимости от каких-то признаков
в самих документах. Кроме того, в шаблоне может
быть указан диапазон дат, для которых он действует.
Это означает возможность провести документы до какой-то даты
с помощью одного шаблона, а после этой даты –
с помощью другого шаблона.
Каждый шаблон содержит имя атрибута (поля) документа,
откуда берется дата операции.
Каждый шаблон содержит набор «записей по счетам», в
каждой из которых указывается:
- вид записи (в дебет или в кредит)
- бухгалтерский счет (счет указывается явно или в виде ссылки
на поле документа, из которого следует получить внутренний номер
ACC_ID счета)
- объект аналитического учета (указывается ссылка на поле документа,
из которого следует брать внутренний номер ID объекта)
- сумма (указывается ссылка на поле документа, из которого
берется сумма этой записи)
- слой (указывается явно или в виде ссылки на поле
документа, из которого берется внутренний номер LAYER_ID
слоя)
- количество (указывается ссылка на поле документа, из которого
берется количество этой записи)
На самом деле даже ручные проводки осуществляются программой при помощи
шаблонов. Ручные проводки хранятся в типе документов «Ручная
операция» (шапки - в таблице GAAP, записи
по счетам – в таблице GAAP_POS). Хранимая
процедура шаблона ручных операций называется GAAP_TEMPLATE.
Ниже показаны структуры таблиц, в которых хранятся сведения о
шаблонах операций, на основе которых программа формирует тексты соответствующих
хранимых процедур.
Системная таблица TEMPLATE
Название поля |
Тип данных |
Назначение |
TEMPLATE_ID |
INTEGER |
Внутренний номер ID шаблона |
NAME |
VARCHAR(50) |
Название бухгалтерской операции |
STOREDPROC_NAME |
VARCHAR(31) |
Название хранимой процедуры, возвращающей проводки в формате журнала операций |
SWITCH_SOURCE_FIELD |
VARCHAR(31) |
Имя поля документа, в котором содержится условие проведения.
Если значение этого поля в документе равно значению поля SWITCH
_VALUE шаблона, то операция будет проведена. |
SWITCH_VALUE |
INTEGER |
Значение условия проведения |
OPER_DATE_SOURCE_FIELD |
VARCHAR(31) |
Имя поля документа, из которого берется дата операции |
DOC_TYPE_ID |
INTEGER |
Внутренний ID типа документа |
START_DATE |
DATE |
Стартовая дата диапазона срабатывания шаблона. Если NULL, то
начало диапазона дат совпадает с глобальной датой начала периода. |
END_DATE |
DATE |
Крайняя дата диапазона срабатывания шаблона. Если NULL, то
ограничений по сроку работы шаблона нет |
IS_CHANGED |
SMALLINT |
Признак того, что шаблон был изменен. Используется для
перепроведения всех документов этого типа с использованием данного шаблона.
0 – шаблон не изменялся
1 – шаблон
был изменен пользователем |
Системная таблица TEMPLATE_DEF
Название поля |
Тип данных |
Назначение |
TEMPLATE_ID |
INTEGER |
Внутренний номер ID шаблона |
OPER_POS |
INTEGER |
Порядковый номер строки генерируемого набора |
IS_CREDIT |
INTEGER |
Тип записи (явно)
0 – в дебет
1 – в кредит |
IS_CREDIT_SOURCE_FIELD |
VARCHAR(31) |
Имя поля документа, в котором содержится тип записи.
Если тип записи указан явно, то NULL |
ACC_ID |
INTEGER |
Внутренний ACC_ID счета (явно) |
ACC_ID_SOURCE_FIELD |
VARCHAR(31) |
Имя поля документа, из которого берется ACC_ID
счета. Если счет указан явно, то NULL |
OBJECT_ID_SOURCE_FIELD |
VARCHAR(31) |
Имя поля документа, из которого берется ID объекта аналитического
учета. |
AMOUNT_MINUS |
SMALLINT |
Признак того, что знак суммы следует изменить на противоположный
0 – знак не изменять
1 – изменить
знак суммы |
AMOUNT_SOURCE_FIELD |
VARCHAR(31) |
Имя поля документа, из которого берется сумма |
AMOUNT_FORMULA |
VARCHAR(255) |
Формула для расчета суммы. Могут использоваться символы вида Sn
, где n-номер строки набора, а S
-сумма в этой строке. Например, 1.
2*S3 будет означать сумму третьей строки набора,
умноженную на 1,2 |
LAYER_ID |
INTEGER |
Внутренний LAYER_ID слоя (явно) |
LAYER_ID_SOURCE_FIELD |
VARCHAR(31) |
Имя поля документа, из которого берется LAYER_ID
. Если слой указан явно, то NULL |
QUANTITY_MINUS |
SMALLINT |
Признак того, что знак количества следует изменить на противоположный
0 – знак не изменять
1 – изменить
знак количества |
QUANTITY_SOURCE_FIELD |
VARCHAR(31) |
Имя поля документа, из которого берется количество |
QUANTITY_FORMULA |
VARCHAR(255) |
Формула для расчета количества. Могут использоваться символы вида Qn
, где n-номер строки набора, а Q
-количество в этой строке. Например, Q1 будет
означать количество первой строки набора |
Для примера приведем текст хранимой процедуры, автоматически сформированный шаблоном
ручных операций:
CREATE PROCEDURE GAAP_TEMPLATE(OP_DATE1 DATE, OP_DATE2 DATE, FOR_DOC_ID INTEGER)
RETURNS(
OPER_DATE DATE,
ACC_ID INTEGER,
LAYER_ID INTEGER,
OBJECT_ID INTEGER,
TEMPLATE_ID INTEGER,
DOC_ID INTEGER,
IS_CREDIT INTEGER,
DEBIT DECIMAL(18, 2),
CREDIT DECIMAL(18, 2),
QDEBIT DECIMAL(18, 3),
QCREDIT DECIMAL(18, 3),
DOC_N INTEGER,
OPER_POS INTEGER
)
AS
DECLARE VARIABLE AMOUNT DECIMAL(18,2);
DECLARE VARIABLE QUANTITY DECIMAL(18,3);
DECLARE VARIABLE V1 INTEGER;
DECLARE VARIABLE V2 INTEGER;
DECLARE VARIABLE V3 INTEGER;
DECLARE VARIABLE V4 DECIMAL(18,2);
DECLARE VARIABLE V5 INTEGER;
DECLARE VARIABLE V6 DECIMAL(18,3);
DECLARE VARIABLE S1 DECIMAL(18,2);
DECLARE VARIABLE Q1 DECIMAL(18,3);
BEGIN
TEMPLATE_ID = 1;
FOR SELECT
GAAP.ID,
GAAP.OPER_DATE,
GAAP_POS.IS_CREDIT,
GAAP_POS.ACC,
GAAP_POS.OBJ,
GAAP_POS.AMOUNT,
GAAP_POS.LAYER,
GAAP_POS.QUANTITY,
GAAP_POS.N
FROM
GAAP, GAAP_POS
WHERE
((:OP_DATE1 IS NULL) OR (GAAP.OPER_DATE >= :OP_DATE1)) AND
((:OP_DATE2 IS NULL) OR (GAAP.OPER_DATE <= :OP_DATE2)) AND
((:FOR_DOC_ID IS NULL) OR (GAAP.ID = :FOR_DOC_ID)) AND
GAAP.ID = GAAP_POS.ID
INTO :DOC_ID, :OPER_DATE, :V1, :V2, :V3, :V4, :V5, :V6, :DOC_N
DO
BEGIN
IS_CREDIT = V1;
ACC_ID = V2;
OBJECT_ID = V3;
OPER_POS = 1;
AMOUNT = V4;
S1 = AMOUNT;
QUANTITY = V6;
Q1 = QUANTITY;
LAYER_ID = V5;
IF (IS_CREDIT = 0) THEN
BEGIN
DEBIT = AMOUNT; QDEBIT = QUANTITY; CREDIT = 0; QCREDIT = 0;
END
ELSE
BEGIN
DEBIT = 0; QDEBIT = 0; CREDIT = AMOUNT; QCREDIT = QUANTITY;
END
SUSPEND; /*waiting for fetch operation*/
END
END
С помощью простого запроса к этой процедуре мы можем,
например, получить все ручные проводки, датированные с 01
.01.2003 по 01.03.2003
:
select * from gaap_template(’01.01.2003’,’01.03.2003’,NULL)
Если же нас интересует одна отдельно взятая «Ручная операция
», скажем с ID=11043, то мы можем
получить ее с помощью запроса:
select * from gaap_template(NULL, NULL, 11043)
|