DEPO Firebird: проверка на реальной базе Fancy — генераторы, диалект 1, дата без времени
Обезличенная база Fancy (Firebird 2.5.9, диалект 1, кодировка NONE) с UDF ib_Fansy и штатными триггерами: установка, HANDBOOK, поручения IN/OUT, события до BJ_EXECUTED, операции и проводки, ошибки. - генераторы OD_DOCS_ID_GEN / OD_DOLS_ID_GEN (как в Fancy); - COMMENT без кавычек: в диалекте 1 "..." — строка; - FTV_M2M_DAY: дата без времени (в диалекте 1 CAST AS DATE время не отрезает); - README: установка в WIN1251, что подтвердилось, что проверить у клиента (UDF, кодировщик M2M, оператор). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
This commit is contained in:
@@ -19,7 +19,7 @@ BEGIN
|
||||
TIMENEW TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
TIMEBEG TIMESTAMP,
|
||||
TIMEEND TIMESTAMP,
|
||||
"COMMENT" BLOB SUB_TYPE TEXT,
|
||||
COMMENT BLOB SUB_TYPE TEXT,
|
||||
DIRECTION VARCHAR(4) NOT NULL,
|
||||
CONTRAGENT_M2M_CODE VARCHAR(255) NOT NULL,
|
||||
DEPONENT_NAME VARCHAR(255) NOT NULL,
|
||||
@@ -48,7 +48,7 @@ BEGIN
|
||||
SHARE INTEGER,
|
||||
PLACE INTEGER,
|
||||
DEPO INTEGER,
|
||||
"COMMENT" BLOB SUB_TYPE TEXT)';
|
||||
COMMENT BLOB SUB_TYPE TEXT)';
|
||||
|
||||
IF (NOT EXISTS (SELECT 1 FROM RDB$RELATIONS WHERE RDB$RELATION_NAME = 'FTV_M2M_EVENTS')) THEN
|
||||
EXECUTE STATEMENT 'CREATE TABLE FTV_M2M_EVENTS (
|
||||
@@ -59,7 +59,7 @@ BEGIN
|
||||
TIMENEW TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
TIMEBEG TIMESTAMP,
|
||||
TIMEEND TIMESTAMP,
|
||||
"COMMENT" BLOB SUB_TYPE TEXT,
|
||||
COMMENT BLOB SUB_TYPE TEXT,
|
||||
EVENT_TYPE VARCHAR(64) NOT NULL,
|
||||
EVENT_DATE TIMESTAMP NOT NULL,
|
||||
M2M_REJECT_CODE VARCHAR(1000),
|
||||
@@ -85,7 +85,7 @@ BEGIN
|
||||
EXECUTE STATEMENT 'CREATE TABLE FTV_M2M_SETTINGS (
|
||||
NAME VARCHAR(64) NOT NULL PRIMARY KEY,
|
||||
VAL INTEGER,
|
||||
"COMMENT" VARCHAR(255))';
|
||||
COMMENT VARCHAR(255))';
|
||||
|
||||
IF (NOT EXISTS (SELECT 1 FROM RDB$GENERATORS WHERE RDB$GENERATOR_NAME = 'FTV_M2M_GEN')) THEN
|
||||
EXECUTE STATEMENT 'CREATE GENERATOR FTV_M2M_GEN';
|
||||
@@ -145,23 +145,23 @@ SET TERM ^ ;
|
||||
EXECUTE BLOCK AS
|
||||
BEGIN
|
||||
IF (NOT EXISTS (SELECT 1 FROM FTV_M2M_SETTINGS WHERE NAME = 'WHOS')) THEN
|
||||
INSERT INTO FTV_M2M_SETTINGS (NAME, VAL, "COMMENT") VALUES ('WHOS', NULL, 'OD_DOCS.WHOS — юрлицо-депозитарий (Фонтвьель: 383118)');
|
||||
INSERT INTO FTV_M2M_SETTINGS (NAME, VAL, COMMENT) VALUES ('WHOS', NULL, 'OD_DOCS.WHOS — юрлицо-депозитарий (Фонтвьель: 383118)');
|
||||
IF (NOT EXISTS (SELECT 1 FROM FTV_M2M_SETTINGS WHERE NAME = 'OPER_USER')) THEN
|
||||
INSERT INTO FTV_M2M_SETTINGS (NAME, VAL, "COMMENT") VALUES ('OPER_USER', NULL, 'OD_OPERATORS.ID — оператор проводок (Фонтвьель: 84, SYSDBA)');
|
||||
INSERT INTO FTV_M2M_SETTINGS (NAME, VAL, COMMENT) VALUES ('OPER_USER', NULL, 'OD_OPERATORS.ID — оператор проводок (Фонтвьель: 84, SYSDBA)');
|
||||
IF (NOT EXISTS (SELECT 1 FROM FTV_M2M_SETTINGS WHERE NAME = 'FILER_CAT')) THEN
|
||||
INSERT INTO FTV_M2M_SETTINGS (NAME, VAL, "COMMENT") VALUES ('FILER_CAT', NULL, 'OD_DOC_CATS.ID категории D_FILER — входящая запись (Фонтвьель: 255)');
|
||||
INSERT INTO FTV_M2M_SETTINGS (NAME, VAL, COMMENT) VALUES ('FILER_CAT', NULL, 'OD_DOC_CATS.ID категории D_FILER — входящая запись (Фонтвьель: 255)');
|
||||
IF (NOT EXISTS (SELECT 1 FROM FTV_M2M_SETTINGS WHERE NAME = 'D_NUM')) THEN
|
||||
INSERT INTO FTV_M2M_SETTINGS (NAME, VAL, "COMMENT") VALUES ('D_NUM', NULL, 'OD_BALANCES.ID — 98010 НОСТРО депо базовый (Фонтвьель: 313)');
|
||||
INSERT INTO FTV_M2M_SETTINGS (NAME, VAL, COMMENT) VALUES ('D_NUM', NULL, 'OD_BALANCES.ID — 98010 НОСТРО депо базовый (Фонтвьель: 313)');
|
||||
IF (NOT EXISTS (SELECT 1 FROM FTV_M2M_SETTINGS WHERE NAME = 'K_NUM')) THEN
|
||||
INSERT INTO FTV_M2M_SETTINGS (NAME, VAL, "COMMENT") VALUES ('K_NUM', NULL, 'OD_BALANCES.ID — 98070 ЦБ на торгах (Фонтвьель: 836)');
|
||||
INSERT INTO FTV_M2M_SETTINGS (NAME, VAL, COMMENT) VALUES ('K_NUM', NULL, 'OD_BALANCES.ID — 98070 ЦБ на торгах (Фонтвьель: 836)');
|
||||
IF (NOT EXISTS (SELECT 1 FROM FTV_M2M_SETTINGS WHERE NAME = 'MARKET')) THEN
|
||||
INSERT INTO FTV_M2M_SETTINGS (NAME, VAL, "COMMENT") VALUES ('MARKET', NULL, 'OD_FACES.SELF_ID — ПАО Московская Биржа (Фонтвьель: 8106)');
|
||||
INSERT INTO FTV_M2M_SETTINGS (NAME, VAL, COMMENT) VALUES ('MARKET', NULL, 'OD_FACES.SELF_ID — ПАО Московская Биржа (Фонтвьель: 8106)');
|
||||
IF (NOT EXISTS (SELECT 1 FROM FTV_M2M_SETTINGS WHERE NAME = 'B_TYPE')) THEN
|
||||
INSERT INTO FTV_M2M_SETTINGS (NAME, VAL, "COMMENT") VALUES ('B_TYPE', NULL, 'OD_SYS_TABS DEPO96_DCLA.NUM — «Отчёт депозитария» (Фонтвьель: 31)');
|
||||
INSERT INTO FTV_M2M_SETTINGS (NAME, VAL, COMMENT) VALUES ('B_TYPE', NULL, 'OD_SYS_TABS DEPO96_DCLA.NUM — «Отчёт депозитария» (Фонтвьель: 31)');
|
||||
IF (NOT EXISTS (SELECT 1 FROM FTV_M2M_SETTINGS WHERE NAME = 'CORR_FACE')) THEN
|
||||
INSERT INTO FTV_M2M_SETTINGS (NAME, VAL, "COMMENT") VALUES ('CORR_FACE', NULL, 'OD_FACES.SELF_ID — НКО АО НРД, корреспондент входящей записи (Фонтвьель: 18174)');
|
||||
INSERT INTO FTV_M2M_SETTINGS (NAME, VAL, COMMENT) VALUES ('CORR_FACE', NULL, 'OD_FACES.SELF_ID — НКО АО НРД, корреспондент входящей записи (Фонтвьель: 18174)');
|
||||
IF (NOT EXISTS (SELECT 1 FROM FTV_M2M_SETTINGS WHERE NAME = 'FILER_RUBRICA')) THEN
|
||||
INSERT INTO FTV_M2M_SETTINGS (NAME, VAL, "COMMENT") VALUES ('FILER_RUBRICA', NULL, 'D_FILER.RUBRICA для отчёта НРД (Фонтвьель: 5, «уточнить в депозитарии»)');
|
||||
INSERT INTO FTV_M2M_SETTINGS (NAME, VAL, COMMENT) VALUES ('FILER_RUBRICA', NULL, 'D_FILER.RUBRICA для отчёта НРД (Фонтвьель: 5, «уточнить в депозитарии»)');
|
||||
END^
|
||||
SET TERM ; ^
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* Bridge&Join — процедуры обработки M2M для Fancy DEPO на Firebird 2.5.
|
||||
Перенос процедур MSSQL-версии (Фонтвьель, тексты от 22.10.2026, OPERATION — от 24.10.2026) на PSQL. Логика та же; отличия:
|
||||
- raiserror → FTV_M2M_FAIL: текст причины кладётся в контекст транзакции и поднимается исключение FTV_M2M_ERROR;
|
||||
- raiserror — FTV_M2M_FAIL: текст причины кладётся в контекст транзакции и поднимается исключение FTV_M2M_ERROR;
|
||||
FTV_M2M_JOB пишет этот текст в COMMENT (в Firebird 2.5 текст исключения в WHEN не доступен; контекст
|
||||
возвращает строку без кодировки — приводится к WIN1251, кодировке базы Fancy);
|
||||
- ошибка записи откатывает только её изменения (WHEN ANY = точка сохранения), в MSSQL-версии изменения
|
||||
@@ -11,7 +11,10 @@
|
||||
- SELECT … INTO, который в MSSQL молча брал последнюю из нескольких строк, — SELECT FIRST 1;
|
||||
- в цикле по строкам поручения бумага/счета сбрасываются перед поиском (в MSSQL ненайденное значение
|
||||
оставалось от предыдущей строки).
|
||||
Порядок создания: вспомогательные → WIRING → OPERATION → UPDATE_HANDBOOK → EVENTS → CREATE → JOB. */
|
||||
Тексты работают в обоих диалектах: база Fancy — диалект 1 (DATE хранит и время, "…" — строка, а не имя),
|
||||
поэтому COMMENT без кавычек, а дата без времени — через FTV_M2M_DAY. Проверено 27.10.2026 на обезличенной
|
||||
базе Fancy (Firebird 2.5, диалект 1, кодировка NONE) с UDF ib_Fansy и штатными триггерами.
|
||||
Порядок создания: вспомогательные, WIRING, OPERATION, UPDATE_HANDBOOK, EVENTS, CREATE, JOB. */
|
||||
|
||||
SET TERM ^ ;
|
||||
|
||||
@@ -42,6 +45,14 @@ BEGIN
|
||||
LPAD(CAST(FLOOR(EXTRACT(SECOND FROM T)) AS INTEGER), 2, '0');
|
||||
END^
|
||||
|
||||
/* Дата без времени (CONVERT(DATE, …) MSSQL-версии). В диалекте 1 CAST(… AS DATE) время не отрезает. */
|
||||
CREATE OR ALTER PROCEDURE FTV_M2M_DAY (T TIMESTAMP) RETURNS (D TIMESTAMP) AS
|
||||
BEGIN
|
||||
D = NULL;
|
||||
IF (T IS NOT NULL) THEN
|
||||
D = CAST(EXTRACT(YEAR FROM T) || '-' || EXTRACT(MONTH FROM T) || '-' || EXTRACT(DAY FROM T) AS TIMESTAMP);
|
||||
END^
|
||||
|
||||
|
||||
/* Директива «Обработать» для документа «Зачисление» или «Списание». Значения берутся только из самого
|
||||
документа; M2M-поручение и трансферные таблицы не используются. */
|
||||
@@ -151,7 +162,7 @@ DECLARE VARIABLE CLISER_ID INTEGER;
|
||||
DECLARE VARIABLE CLISER_NUM VARCHAR(64);
|
||||
DECLARE VARIABLE CLISER_DATE TIMESTAMP;
|
||||
DECLARE VARIABLE DIRECTION VARCHAR(64);
|
||||
DECLARE VARIABLE DD_DATE DATE;
|
||||
DECLARE VARIABLE DD_DATE TIMESTAMP;
|
||||
DECLARE VARIABLE DD_NUM VARCHAR(64);
|
||||
DECLARE VARIABLE SHARE INTEGER;
|
||||
DECLARE VARIABLE AMOUNT NUMERIC(18,7);
|
||||
@@ -167,7 +178,7 @@ DECLARE VARIABLE FILER_DATE TIMESTAMP;
|
||||
DECLARE VARIABLE STEP_ID INTEGER;
|
||||
DECLARE VARIABLE P VARCHAR(4000);
|
||||
DECLARE VARIABLE REP_NUM VARCHAR(255);
|
||||
DECLARE VARIABLE REP_DATE DATE;
|
||||
DECLARE VARIABLE REP_DATE TIMESTAMP;
|
||||
DECLARE VARIABLE CMT VARCHAR(4000);
|
||||
BEGIN
|
||||
EXECUTE PROCEDURE FTV_M2M_GET('WHOS') RETURNING_VALUES :WHOS;
|
||||
@@ -181,7 +192,7 @@ BEGIN
|
||||
|
||||
SELECT FIRST 1 H.DOC, D.NUM, D.D_DATE,
|
||||
CASE WHEN DC.SYS_NAME = 'I_CLISER_M2M_ZACH' THEN 'IN' WHEN DC.SYS_NAME = 'I_CLISER_M2M_SPIS' THEN 'OUT' END,
|
||||
CAST(D.D_DATE AS DATE), D.NUM, F.SHARE, F.AMOUNT, F.CLIENT, H.DEPONENT, F.PLACE
|
||||
D.D_DATE, D.NUM, F.SHARE, F.AMOUNT, F.CLIENT, H.DEPONENT, F.PLACE
|
||||
FROM D_CLISER_M2M_DOL F
|
||||
LEFT JOIN OD_DOLS L ON L.ID = F.DOL
|
||||
LEFT JOIN OD_DOCS D ON D.ID = L.DOC
|
||||
@@ -192,6 +203,7 @@ BEGIN
|
||||
|
||||
IF (CLISER_ID IS NULL) THEN
|
||||
EXECUTE PROCEDURE FTV_M2M_FAIL('Не найдено M2M-поручение по GUID + REFERENCE');
|
||||
EXECUTE PROCEDURE FTV_M2M_DAY(:DD_DATE) RETURNING_VALUES :DD_DATE;
|
||||
|
||||
/* Направление */
|
||||
SELECT FIRST 1 DC.ID FROM OD_DOC_CATS DC
|
||||
@@ -199,7 +211,7 @@ BEGIN
|
||||
INTO :D_CAT;
|
||||
|
||||
/* ID и номер операции */
|
||||
OPER_ID = GEN_ID(OD_DOC_ID_GEN, 1);
|
||||
OPER_ID = GEN_ID(OD_DOCS_ID_GEN, 1);
|
||||
EXECUTE PROCEDURE FU_NEXT_DOC_NUM (:D_CAT, :OPER_DATE, NULL, :OPER_ID) RETURNING_VALUES :NUM, :NEW_DATE;
|
||||
NUM = NUM || '_' || REFERENCE;
|
||||
|
||||
@@ -212,14 +224,14 @@ BEGIN
|
||||
(MSSQL-версия, правка программиста 24.10.2026). */
|
||||
P = TRIM(PARAMETERS);
|
||||
REP_NUM = LEFT(P, POSITION(' ' IN P || ' ') - 1);
|
||||
REP_DATE = CAST(RIGHT(P, POSITION(' ' IN REVERSE(P)) - 1) AS DATE);
|
||||
REP_DATE = CAST(RIGHT(P, POSITION(' ' IN REVERSE(P)) - 1) AS TIMESTAMP);
|
||||
|
||||
IF (DIRECTION = 'IN') THEN
|
||||
BEGIN
|
||||
CMT = 'Перевод M2M (без поручения), GUID ' || GUID || ', референс ' || REFERENCE;
|
||||
INSERT INTO U_OP_INV_ZACH
|
||||
(DOC, DD_TYPE, DD_DATE, DD_NUM, SHARE, AMOUNT, BLANKS, PLACE, D_NUM, DEPO, K_NUM, MARKET,
|
||||
CONDITION, IS_REG, TAX_R, B_TYPE, B_DATE, B_NUM, WIR_DATE, NOTIFY_DATE, REG_DATE, IS_BLOCK, FROM_FACE, REJECT_REASON, "COMMENT")
|
||||
CONDITION, IS_REG, TAX_R, B_TYPE, B_DATE, B_NUM, WIR_DATE, NOTIFY_DATE, REG_DATE, IS_BLOCK, FROM_FACE, REJECT_REASON, COMMENT)
|
||||
VALUES
|
||||
(:OPER_ID, 1 /* клиентское */, :DD_DATE, :DD_NUM, :SHARE, :AMOUNT, NULL, :PLACE, :ACC_D, :CLIENT, :ACC_K, :MARKET,
|
||||
NULL, NULL, NULL, :B_TYPE, :REP_DATE, :REP_NUM, :OPER_DATE, :OPER_DATE, :OPER_DATE, 0, :FACE, NULL, :CMT);
|
||||
@@ -229,20 +241,20 @@ BEGIN
|
||||
CMT = 'Перевод M2M, GUID ' || GUID || ', референс ' || REFERENCE;
|
||||
INSERT INTO U_OP_INV_SPIS
|
||||
(DOC, DD_TYPE, DD_DATE, DD_NUM, SHARE, AMOUNT, BLANKS, PLACE, D_NUM, DEPO, K_NUM, MARKET,
|
||||
OLD_CONDITIONS, IS_REG, TAX_R, B_TYPE, B_DATE, B_NUM, WIR_DATE, NOTIFY_DATE, REG_DATE, IS_BLOCK, FROM_FACE, REJECT_REASON, "COMMENT")
|
||||
OLD_CONDITIONS, IS_REG, TAX_R, B_TYPE, B_DATE, B_NUM, WIR_DATE, NOTIFY_DATE, REG_DATE, IS_BLOCK, FROM_FACE, REJECT_REASON, COMMENT)
|
||||
VALUES
|
||||
(:OPER_ID, 1 /* клиентское */, :DD_DATE, :DD_NUM, :SHARE, :AMOUNT, NULL, :PLACE, :ACC_D, :CLIENT, :ACC_K, :MARKET,
|
||||
NULL, NULL, NULL, :B_TYPE, :REP_DATE, :REP_NUM, :OPER_DATE, :OPER_DATE, :OPER_DATE, 0, :FACE, NULL, :CMT);
|
||||
END
|
||||
|
||||
/* Входящая запись (отчёт НРД) */
|
||||
FILER_ID = GEN_ID(OD_DOC_ID_GEN, 1);
|
||||
FILER_ID = GEN_ID(OD_DOCS_ID_GEN, 1);
|
||||
FILER_DATE = CURRENT_TIMESTAMP;
|
||||
EXECUTE PROCEDURE FU_NEXT_DOC_NUM ('D_FILER', :FILER_DATE, 1, :FILER_ID) RETURNING_VALUES :FILER_NUM, :NEW_DATE;
|
||||
INSERT INTO OD_DOCS (ID, NUM, D_CAT, D_DATE, STATE, DIRECTION, WHOS)
|
||||
VALUES (:FILER_ID, :FILER_NUM, :FILER_CAT, :FILER_DATE, 2, 1, :WHOS);
|
||||
|
||||
INSERT INTO D_FILER (DOC, PASS_KIND, RUBRICA, "COMMENT", DOC_NUM, DOC_DATE, CORR_FACE, FUND, ACCOUNT, PLACE, ORI_DATE, CHILD_CAT, MESS)
|
||||
INSERT INTO D_FILER (DOC, PASS_KIND, RUBRICA, COMMENT, DOC_NUM, DOC_DATE, CORR_FACE, FUND, ACCOUNT, PLACE, ORI_DATE, CHILD_CAT, MESS)
|
||||
VALUES (:FILER_ID, 8, :RUBRICA, 'Отчет (перевод через MOEX-МОСТ)', :REP_NUM, :REP_DATE, :CORR_FACE,
|
||||
:FACE, :CLIENT, :PLACE, :FILER_DATE, NULL, 'MS010 / ' || :GUID || ' / ' || :REFERENCE);
|
||||
|
||||
@@ -362,7 +374,7 @@ DECLARE VARIABLE CLIENT INTEGER;
|
||||
DECLARE VARIABLE FACE INTEGER;
|
||||
DECLARE VARIABLE CLISER_ID INTEGER;
|
||||
DECLARE VARIABLE DOL_ID INTEGER;
|
||||
DECLARE VARIABLE DD_DATE DATE;
|
||||
DECLARE VARIABLE DD_DATE TIMESTAMP;
|
||||
DECLARE VARIABLE DD_NUM VARCHAR(64);
|
||||
DECLARE VARIABLE OPER_ID INTEGER;
|
||||
DECLARE VARIABLE ST INTEGER;
|
||||
@@ -370,7 +382,7 @@ DECLARE VARIABLE EV_S VARCHAR(19);
|
||||
DECLARE VARIABLE NOW_S VARCHAR(19);
|
||||
BEGIN
|
||||
SELECT FIRST 1 ME.GUID, ME.REFERENCE, ME.EVENT_TYPE, ME.EVENT_DATE, ME.M2M_REJECT_CODE, ME.PARAMETERS, M.DIRECTION,
|
||||
H.DOC, F.DOL, CAST(D.D_DATE AS DATE), D.NUM, F.SHARE, F.AMOUNT, F.PLACE, F.CLIENT, H.DEPONENT
|
||||
H.DOC, F.DOL, D.D_DATE, D.NUM, F.SHARE, F.AMOUNT, F.PLACE, F.CLIENT, H.DEPONENT
|
||||
FROM FTV_M2M_EVENTS ME
|
||||
LEFT JOIN FTV_M2M M ON M.GUID = ME.GUID
|
||||
LEFT JOIN D_CLISER_M2M_DOL F ON F.DOL_REF = ME.REFERENCE
|
||||
@@ -384,7 +396,7 @@ BEGIN
|
||||
IF (EVENT_TYPE = 'HANDBOOK') THEN
|
||||
BEGIN
|
||||
EXECUTE PROCEDURE FTV_M2M_UPDATE_HANDBOOK RETURNING_VALUES :CMT;
|
||||
UPDATE FTV_M2M_EVENTS SET "COMMENT" = :CMT WHERE ID = :ID;
|
||||
UPDATE FTV_M2M_EVENTS SET COMMENT = :CMT WHERE ID = :ID;
|
||||
EXIT;
|
||||
END
|
||||
|
||||
@@ -399,7 +411,7 @@ BEGIN
|
||||
/* 3. Признак документа */
|
||||
EXECUTE PROCEDURE FTV_M2M_DT(:EVENT_DATE) RETURNING_VALUES :EV_S;
|
||||
EXECUTE PROCEDURE FTV_M2M_DT(CURRENT_TIMESTAMP) RETURNING_VALUES :NOW_S;
|
||||
INSERT INTO OD_INVALIDS (DOC, STATUS, "COMMENT", DO_ING)
|
||||
INSERT INTO OD_INVALIDS (DOC, STATUS, COMMENT, DO_ING)
|
||||
VALUES (:CLISER_ID, 0,
|
||||
:EV_S || ' - ' || :EVENT_TYPE || COALESCE(' (референс - ' || :REFERENCE || ')', '') || COALESCE(' (параметры - ' || :PARAMETERS || ')', ''),
|
||||
'Время начала обработки: ' || :NOW_S);
|
||||
@@ -474,6 +486,7 @@ DECLARE VARIABLE FILER_ID INTEGER;
|
||||
DECLARE VARIABLE FILER_NUM VARCHAR(255);
|
||||
DECLARE VARIABLE FILER_DATE TIMESTAMP;
|
||||
DECLARE VARIABLE DOL_ID INTEGER;
|
||||
DECLARE VARIABLE D_DAY TIMESTAMP;
|
||||
BEGIN
|
||||
EXECUTE PROCEDURE FTV_M2M_GET('WHOS') RETURNING_VALUES :WHOS;
|
||||
|
||||
@@ -508,7 +521,7 @@ BEGIN
|
||||
INTO :DEPONENT;
|
||||
|
||||
/* 1.5. Шапка документа */
|
||||
CLISER_ID = GEN_ID(OD_DOC_ID_GEN, 1);
|
||||
CLISER_ID = GEN_ID(OD_DOCS_ID_GEN, 1);
|
||||
D_DATE = CURRENT_TIMESTAMP;
|
||||
EXECUTE PROCEDURE FU_NEXT_DOC_NUM (:D_CAT, :D_DATE, NULL, :CLISER_ID) RETURNING_VALUES :NUM, :NEW_DATE;
|
||||
|
||||
@@ -549,7 +562,7 @@ BEGIN
|
||||
/* Счёт клиента */
|
||||
SELECT FIRST 1 C.ID FROM OD_CLIENTS C WHERE C.NUMBER = :DEPO_NUMBER INTO :DEPO;
|
||||
|
||||
DOL_ID = GEN_ID(OD_DOL_ID_GEN, 1);
|
||||
DOL_ID = GEN_ID(OD_DOLS_ID_GEN, 1);
|
||||
INSERT INTO OD_DOLS (ID, DOC) VALUES (:DOL_ID, :CLISER_ID);
|
||||
INSERT INTO D_CLISER_M2M_DOL (DOL, SHARE, AMOUNT, DOL_REF, PLACE, CLIENT) VALUES (:DOL_ID, :SHARE, :AMOUNT, :REFERENCE, :PLACE, :DEPO);
|
||||
|
||||
@@ -561,13 +574,14 @@ BEGIN
|
||||
IF (DIRECTION = 'OUT') THEN
|
||||
BEGIN
|
||||
EXECUTE PROCEDURE FTV_M2M_GET('FILER_CAT') RETURNING_VALUES :FILER_CAT;
|
||||
FILER_ID = GEN_ID(OD_DOC_ID_GEN, 1);
|
||||
FILER_ID = GEN_ID(OD_DOCS_ID_GEN, 1);
|
||||
FILER_DATE = CURRENT_TIMESTAMP;
|
||||
EXECUTE PROCEDURE FU_NEXT_DOC_NUM ('D_FILER', :FILER_DATE, 1, :FILER_ID) RETURNING_VALUES :FILER_NUM, :NEW_DATE;
|
||||
EXECUTE PROCEDURE FTV_M2M_DAY(:D_DATE) RETURNING_VALUES :D_DAY;
|
||||
INSERT INTO OD_DOCS (ID, NUM, D_CAT, D_DATE, STATE, DIRECTION, WHOS)
|
||||
VALUES (:FILER_ID, :FILER_NUM, :FILER_CAT, :FILER_DATE, 2, 1, :WHOS);
|
||||
INSERT INTO D_FILER (DOC, PASS_KIND, RUBRICA, "COMMENT", DOC_NUM, DOC_DATE, CORR_FACE, FUND, ACCOUNT, PLACE, ORI_DATE, CHILD_CAT, MESS)
|
||||
VALUES (:FILER_ID, 7, 8, 'M2M поручение на списание через MOEX-МОСТ', :NUM, CAST(:D_DATE AS DATE), :DEPONENT, :DEPONENT,
|
||||
INSERT INTO D_FILER (DOC, PASS_KIND, RUBRICA, COMMENT, DOC_NUM, DOC_DATE, CORR_FACE, FUND, ACCOUNT, PLACE, ORI_DATE, CHILD_CAT, MESS)
|
||||
VALUES (:FILER_ID, 7, 8, 'M2M поручение на списание через MOEX-МОСТ', :NUM, :D_DAY, :DEPONENT, :DEPONENT,
|
||||
:DEPO, :PLACE, :FILER_DATE, :D_CAT, :GUID);
|
||||
/* Связываем с M2M-поручением */
|
||||
UPDATE OD_DOCS SET ID = 0, KVIT = :FILER_ID WHERE ID = :CLISER_ID;
|
||||
@@ -597,7 +611,7 @@ BEGIN
|
||||
CMT = COALESCE(CAST(RDB$GET_CONTEXT('USER_TRANSACTION', 'FTV_M2M_ERR') AS VARCHAR(255) CHARACTER SET WIN1251), 'ошибка Fancy') || ' // FTV_M2M_PROCESS_CREATE // SQLCODE ' || SQLCODE || ', GDSCODE ' || GDSCODE;
|
||||
END
|
||||
END
|
||||
UPDATE FTV_M2M SET STATE = :ST, TIMEEND = CURRENT_TIMESTAMP, "COMMENT" = :CMT WHERE ID = :ID;
|
||||
UPDATE FTV_M2M SET STATE = :ST, TIMEEND = CURRENT_TIMESTAMP, COMMENT = :CMT WHERE ID = :ID;
|
||||
END
|
||||
|
||||
/* НОВЫЕ СОБЫТИЯ */
|
||||
@@ -616,7 +630,7 @@ BEGIN
|
||||
END
|
||||
/* без ошибки COMMENT не трогаем: в нём отчёт справочника (HANDBOOK) */
|
||||
IF (CMT IS NOT NULL) THEN
|
||||
UPDATE FTV_M2M_EVENTS SET STATE = :ST, TIMEEND = CURRENT_TIMESTAMP, "COMMENT" = :CMT WHERE ID = :ID;
|
||||
UPDATE FTV_M2M_EVENTS SET STATE = :ST, TIMEEND = CURRENT_TIMESTAMP, COMMENT = :CMT WHERE ID = :ID;
|
||||
ELSE
|
||||
UPDATE FTV_M2M_EVENTS SET STATE = :ST, TIMEEND = CURRENT_TIMESTAMP WHERE ID = :ID;
|
||||
END
|
||||
|
||||
@@ -33,6 +33,7 @@ GRANT EXECUTE ON PROCEDURE FU_NEXT_DOC_NUM TO PROCEDURE FTV_M2M_FAIL;
|
||||
GRANT EXECUTE ON PROCEDURE OD_PR_INS_WIRS TO PROCEDURE FTV_M2M_FAIL;
|
||||
GRANT EXECUTE ON PROCEDURE FTV_M2M_GET TO PROCEDURE FTV_M2M_FAIL;
|
||||
GRANT EXECUTE ON PROCEDURE FTV_M2M_DT TO PROCEDURE FTV_M2M_FAIL;
|
||||
GRANT EXECUTE ON PROCEDURE FTV_M2M_DAY TO PROCEDURE FTV_M2M_FAIL;
|
||||
GRANT EXECUTE ON PROCEDURE FTV_M2M_PROCESS_WIRING TO PROCEDURE FTV_M2M_FAIL;
|
||||
GRANT EXECUTE ON PROCEDURE FTV_M2M_PROCESS_OPERATION TO PROCEDURE FTV_M2M_FAIL;
|
||||
GRANT EXECUTE ON PROCEDURE FTV_M2M_UPDATE_HANDBOOK TO PROCEDURE FTV_M2M_FAIL;
|
||||
@@ -70,6 +71,7 @@ GRANT EXECUTE ON PROCEDURE FU_NEXT_DOC_NUM TO PROCEDURE FTV_M2M_GET;
|
||||
GRANT EXECUTE ON PROCEDURE OD_PR_INS_WIRS TO PROCEDURE FTV_M2M_GET;
|
||||
GRANT EXECUTE ON PROCEDURE FTV_M2M_FAIL TO PROCEDURE FTV_M2M_GET;
|
||||
GRANT EXECUTE ON PROCEDURE FTV_M2M_DT TO PROCEDURE FTV_M2M_GET;
|
||||
GRANT EXECUTE ON PROCEDURE FTV_M2M_DAY TO PROCEDURE FTV_M2M_GET;
|
||||
GRANT EXECUTE ON PROCEDURE FTV_M2M_PROCESS_WIRING TO PROCEDURE FTV_M2M_GET;
|
||||
GRANT EXECUTE ON PROCEDURE FTV_M2M_PROCESS_OPERATION TO PROCEDURE FTV_M2M_GET;
|
||||
GRANT EXECUTE ON PROCEDURE FTV_M2M_UPDATE_HANDBOOK TO PROCEDURE FTV_M2M_GET;
|
||||
@@ -145,6 +147,7 @@ GRANT EXECUTE ON PROCEDURE OD_PR_INS_WIRS TO PROCEDURE FTV_M2M_PROCESS_WIRING;
|
||||
GRANT EXECUTE ON PROCEDURE FTV_M2M_FAIL TO PROCEDURE FTV_M2M_PROCESS_WIRING;
|
||||
GRANT EXECUTE ON PROCEDURE FTV_M2M_GET TO PROCEDURE FTV_M2M_PROCESS_WIRING;
|
||||
GRANT EXECUTE ON PROCEDURE FTV_M2M_DT TO PROCEDURE FTV_M2M_PROCESS_WIRING;
|
||||
GRANT EXECUTE ON PROCEDURE FTV_M2M_DAY TO PROCEDURE FTV_M2M_PROCESS_WIRING;
|
||||
GRANT EXECUTE ON PROCEDURE FTV_M2M_PROCESS_OPERATION TO PROCEDURE FTV_M2M_PROCESS_WIRING;
|
||||
GRANT EXECUTE ON PROCEDURE FTV_M2M_UPDATE_HANDBOOK TO PROCEDURE FTV_M2M_PROCESS_WIRING;
|
||||
GRANT EXECUTE ON PROCEDURE FTV_M2M_PROCESS_EVENTS TO PROCEDURE FTV_M2M_PROCESS_WIRING;
|
||||
@@ -182,6 +185,7 @@ GRANT EXECUTE ON PROCEDURE OD_PR_INS_WIRS TO PROCEDURE FTV_M2M_PROCESS_OPERATION
|
||||
GRANT EXECUTE ON PROCEDURE FTV_M2M_FAIL TO PROCEDURE FTV_M2M_PROCESS_OPERATION;
|
||||
GRANT EXECUTE ON PROCEDURE FTV_M2M_GET TO PROCEDURE FTV_M2M_PROCESS_OPERATION;
|
||||
GRANT EXECUTE ON PROCEDURE FTV_M2M_DT TO PROCEDURE FTV_M2M_PROCESS_OPERATION;
|
||||
GRANT EXECUTE ON PROCEDURE FTV_M2M_DAY TO PROCEDURE FTV_M2M_PROCESS_OPERATION;
|
||||
GRANT EXECUTE ON PROCEDURE FTV_M2M_PROCESS_WIRING TO PROCEDURE FTV_M2M_PROCESS_OPERATION;
|
||||
GRANT EXECUTE ON PROCEDURE FTV_M2M_UPDATE_HANDBOOK TO PROCEDURE FTV_M2M_PROCESS_OPERATION;
|
||||
GRANT EXECUTE ON PROCEDURE FTV_M2M_PROCESS_EVENTS TO PROCEDURE FTV_M2M_PROCESS_OPERATION;
|
||||
@@ -219,6 +223,7 @@ GRANT EXECUTE ON PROCEDURE OD_PR_INS_WIRS TO PROCEDURE FTV_M2M_UPDATE_HANDBOOK;
|
||||
GRANT EXECUTE ON PROCEDURE FTV_M2M_FAIL TO PROCEDURE FTV_M2M_UPDATE_HANDBOOK;
|
||||
GRANT EXECUTE ON PROCEDURE FTV_M2M_GET TO PROCEDURE FTV_M2M_UPDATE_HANDBOOK;
|
||||
GRANT EXECUTE ON PROCEDURE FTV_M2M_DT TO PROCEDURE FTV_M2M_UPDATE_HANDBOOK;
|
||||
GRANT EXECUTE ON PROCEDURE FTV_M2M_DAY TO PROCEDURE FTV_M2M_UPDATE_HANDBOOK;
|
||||
GRANT EXECUTE ON PROCEDURE FTV_M2M_PROCESS_WIRING TO PROCEDURE FTV_M2M_UPDATE_HANDBOOK;
|
||||
GRANT EXECUTE ON PROCEDURE FTV_M2M_PROCESS_OPERATION TO PROCEDURE FTV_M2M_UPDATE_HANDBOOK;
|
||||
GRANT EXECUTE ON PROCEDURE FTV_M2M_PROCESS_EVENTS TO PROCEDURE FTV_M2M_UPDATE_HANDBOOK;
|
||||
@@ -256,6 +261,7 @@ GRANT EXECUTE ON PROCEDURE OD_PR_INS_WIRS TO PROCEDURE FTV_M2M_PROCESS_EVENTS;
|
||||
GRANT EXECUTE ON PROCEDURE FTV_M2M_FAIL TO PROCEDURE FTV_M2M_PROCESS_EVENTS;
|
||||
GRANT EXECUTE ON PROCEDURE FTV_M2M_GET TO PROCEDURE FTV_M2M_PROCESS_EVENTS;
|
||||
GRANT EXECUTE ON PROCEDURE FTV_M2M_DT TO PROCEDURE FTV_M2M_PROCESS_EVENTS;
|
||||
GRANT EXECUTE ON PROCEDURE FTV_M2M_DAY TO PROCEDURE FTV_M2M_PROCESS_EVENTS;
|
||||
GRANT EXECUTE ON PROCEDURE FTV_M2M_PROCESS_WIRING TO PROCEDURE FTV_M2M_PROCESS_EVENTS;
|
||||
GRANT EXECUTE ON PROCEDURE FTV_M2M_PROCESS_OPERATION TO PROCEDURE FTV_M2M_PROCESS_EVENTS;
|
||||
GRANT EXECUTE ON PROCEDURE FTV_M2M_UPDATE_HANDBOOK TO PROCEDURE FTV_M2M_PROCESS_EVENTS;
|
||||
@@ -293,6 +299,7 @@ GRANT EXECUTE ON PROCEDURE OD_PR_INS_WIRS TO PROCEDURE FTV_M2M_PROCESS_CREATE;
|
||||
GRANT EXECUTE ON PROCEDURE FTV_M2M_FAIL TO PROCEDURE FTV_M2M_PROCESS_CREATE;
|
||||
GRANT EXECUTE ON PROCEDURE FTV_M2M_GET TO PROCEDURE FTV_M2M_PROCESS_CREATE;
|
||||
GRANT EXECUTE ON PROCEDURE FTV_M2M_DT TO PROCEDURE FTV_M2M_PROCESS_CREATE;
|
||||
GRANT EXECUTE ON PROCEDURE FTV_M2M_DAY TO PROCEDURE FTV_M2M_PROCESS_CREATE;
|
||||
GRANT EXECUTE ON PROCEDURE FTV_M2M_PROCESS_WIRING TO PROCEDURE FTV_M2M_PROCESS_CREATE;
|
||||
GRANT EXECUTE ON PROCEDURE FTV_M2M_PROCESS_OPERATION TO PROCEDURE FTV_M2M_PROCESS_CREATE;
|
||||
GRANT EXECUTE ON PROCEDURE FTV_M2M_UPDATE_HANDBOOK TO PROCEDURE FTV_M2M_PROCESS_CREATE;
|
||||
@@ -330,6 +337,7 @@ GRANT EXECUTE ON PROCEDURE OD_PR_INS_WIRS TO PROCEDURE FTV_M2M_JOB;
|
||||
GRANT EXECUTE ON PROCEDURE FTV_M2M_FAIL TO PROCEDURE FTV_M2M_JOB;
|
||||
GRANT EXECUTE ON PROCEDURE FTV_M2M_GET TO PROCEDURE FTV_M2M_JOB;
|
||||
GRANT EXECUTE ON PROCEDURE FTV_M2M_DT TO PROCEDURE FTV_M2M_JOB;
|
||||
GRANT EXECUTE ON PROCEDURE FTV_M2M_DAY TO PROCEDURE FTV_M2M_JOB;
|
||||
GRANT EXECUTE ON PROCEDURE FTV_M2M_PROCESS_WIRING TO PROCEDURE FTV_M2M_JOB;
|
||||
GRANT EXECUTE ON PROCEDURE FTV_M2M_PROCESS_OPERATION TO PROCEDURE FTV_M2M_JOB;
|
||||
GRANT EXECUTE ON PROCEDURE FTV_M2M_UPDATE_HANDBOOK TO PROCEDURE FTV_M2M_JOB;
|
||||
|
||||
@@ -6,42 +6,61 @@
|
||||
| Файл | Что делает |
|
||||
|---|---|
|
||||
| `00_FTV_M2M_TABLES.sql` | таблицы `FTV_M2M*`, генераторы и триггеры ID, исключение `FTV_M2M_ERROR`, таблица привязок `FTV_M2M_SETTINGS` |
|
||||
| `10_FTV_M2M_PROCS.sql` | процедуры: `FTV_M2M_FAIL/GET/DT` (вспомогательные), `PROCESS_WIRING`, `PROCESS_OPERATION`, `UPDATE_HANDBOOK`, `PROCESS_EVENTS`, `PROCESS_CREATE`, `JOB` |
|
||||
| `10_FTV_M2M_PROCS.sql` | процедуры: `FTV_M2M_FAIL/GET/DT/DAY` (вспомогательные), `PROCESS_WIRING`, `PROCESS_OPERATION`, `UPDATE_HANDBOOK`, `PROCESS_EVENTS`, `PROCESS_CREATE`, `JOB` |
|
||||
| `20_FTV_M2M_GRANTS.sql` | права процедурам на таблицы Fancy и логину bj (`:BJ_USER`) на `FTV_M2M_JOB` и таблицы обмена |
|
||||
| `test/` | заглушки таблиц Fancy (по схеме MSSQL), прогон всех веток на встроенном Firebird 2.5.9 |
|
||||
|
||||
Порядок установки: 00 → заполнить `FTV_M2M_SETTINGS` → 10 → 20 (под SYSDBA или владельцем базы).
|
||||
|
||||
## Проверить и уточнить на базе клиента
|
||||
Файлы — в UTF-8, а база Fancy обычно в кодировке NONE с данными в WIN1251. Ставить в WIN1251, иначе русские
|
||||
тексты процедур попадут в базу в UTF-8:
|
||||
|
||||
Процедуры проверены только на заглушках, собранных по схеме Fancy MSSQL. Fancy на MSSQL — перевод
|
||||
Firebird-версии (`GEN_ID`, `f_*`, триггер `OD_DOCS_BU v4.59`), поэтому имена таблиц и колонок, скорее всего,
|
||||
совпадают. Подтвердить на копии базы клиента:
|
||||
```
|
||||
iconv -f utf-8 -t cp1251 10_FTV_M2M_PROCS.sql > 10.sql
|
||||
isql -ch WIN1251 -user SYSDBA -i 10.sql <сервер>:<путь к базе>
|
||||
```
|
||||
|
||||
1. **Генераторы ID**: `OD_DOC_ID_GEN`, `OD_DOL_ID_GEN`, `OD_STEPS_ID_GEN`, `OD_FACES_ID_GEN` — есть ли с такими
|
||||
именами (`SELECT RDB$GENERATOR_NAME FROM RDB$GENERATORS`).
|
||||
2. **`FU_NEXT_DOC_NUM`**: параметры `(CAT_SYS_NAME, D_DATE, DIRECTION, FOR_DOC)`, возвращает `(NUM, NEW_DATE)`;
|
||||
выполняемая (`EXECUTE PROCEDURE`), а не селективная.
|
||||
3. **`OD_PR_INS_WIRS`**: 31 входной параметр в порядке MSSQL-версии, 4 выходных (`NEW_ID, WIR_LIST, DEB_ID, KRD_ID`).
|
||||
4. **`D_CLISER_M2M.DOC_GUID`**: тип колонки. Процедуры пишут GUID строкой `CHAR(36)` в верхнем регистре; если
|
||||
в Fancy это `CHAR(16) CHARACTER SET OCTETS` или строка с фигурными скобками — менять сравнение и запись.
|
||||
5. **Флаги**: `OD_FACES.LAST_FLAG = 1`, `E_DATE = '9999-01-01'`, `OD_CLIENTS_REC.E_DATE = '9999-01-01'` — те же
|
||||
значения в Firebird-версии (не `'T'`/`'F'`).
|
||||
6. **Оператор**: под каким логином bj подключается к базе и заведён ли он в `OD_OPERATORS` (`USER_ID` = логин).
|
||||
`FU_NEXT_DOC_NUM` берёт `WHOS` и префикс номера из `OD_OPERATORS`/`OD_SETS` по текущему пользователю; триггеры
|
||||
Fancy проверяют права оператора (кроме `UPDATE … ID = 0`). В MSSQL-версии это обходилось `execute as SYSDBA`.
|
||||
7. **Привязки `FTV_M2M_SETTINGS`** — ID из справочников клиента: `WHOS` (депозитарий), `OPER_USER`, `FILER_CAT`
|
||||
(в IBExpert — кодировка подключения WIN1251, файл открыть в UTF-8).
|
||||
|
||||
## Проверено на базе Fancy
|
||||
|
||||
27.10.2026, обезличенная база Fancy: Firebird 2.5.9, ODS 11.2, диалект 1, кодировка NONE, UDF `ib_Fansy` и
|
||||
штатные триггеры Fancy. Прошли установка 00–20, справочник участников (HANDBOOK), поручения IN и OUT, события до
|
||||
`BJ_EXECUTED`: операции зачисления и списания, входящие записи по отчёту НРД, проводки через `OD_PR_INS_WIRS`.
|
||||
Ошибки (неизвестный контрагент, повтор GUID, неизвестное событие, нет строки поручения) — текст в `COMMENT`.
|
||||
|
||||
Подтвердилось: имена и колонки таблиц; `FU_NEXT_DOC_NUM (CAT_SYS_NAME, D_DATE, DIRECTION, FOR_DOC)` — выполняемая,
|
||||
принимает `SYS_NAME` или ID категории; `OD_PR_INS_WIRS` — 31 входной и 4 выходных параметра; `D_CLISER_M2M.DOC_GUID`
|
||||
— `VARCHAR(36)`; флаги `LAST_FLAG = 1`, `E_DATE = '9999-01-01'`; категории `I_CLISER_M2M_ZACH/SPIS`, `OP_INV_ZACH/SPIS`,
|
||||
`D_FILER`; состояние `WAIT_RESP_DECIS`; кодировщик НДЦ; таблицы `D_CLISER_M2M*`, `U_OP_INV_ZACH/SPIS`.
|
||||
|
||||
Исправлено по итогам: генераторы `OD_DOCS_ID_GEN`/`OD_DOLS_ID_GEN`; `COMMENT` без кавычек (в диалекте 1 `"…"` —
|
||||
строка); дата без времени — через `FTV_M2M_DAY` (в диалекте 1 `CAST(… AS DATE)` время не отрезает).
|
||||
|
||||
## Проверить у клиента
|
||||
|
||||
1. **UDF Fancy `ib_Fansy`**: без неё не читаются `OD_DOCS`, `OD_BALANCES` и не ставятся процедуры (вычисляемые
|
||||
поля и триггеры Fancy). На сервере Fancy она есть всегда. Тестовый стенд без Windows — Firebird 2.5 для
|
||||
Windows под wine с `ib_Fansy.dll` той же разрядности.
|
||||
2. **Кодировщик M2M** — юрлицо `OD_FACES` с `MNEM = 'M2M'`. В проверенной базе его не было; без него HANDBOOK и
|
||||
создание поручений падают с понятной ошибкой. Завести в Fancy или так (остальные поля заполнят триггеры Fancy):
|
||||
`INSERT INTO OD_FACES (ID, S_TYPE, NAME, MNEM) VALUES (GEN_ID(OD_FACES_ID_GEN, 1), 1, 'Кодировщик M2M (справочник участников НРД)', 'M2M');`
|
||||
3. **Оператор**: логин, под которым bj вызывает `FTV_M2M_JOB`, должен быть в `OD_OPERATORS` (`USER_ID` = логин,
|
||||
`U_FACE` = `OD_SETS.WHOS`). `FU_NEXT_DOC_NUM` берёт депозитарий и префикс номера по текущему пользователю;
|
||||
триггеры Fancy проверяют права оператора (кроме `UPDATE … ID = 0`). Проверено под SYSDBA.
|
||||
4. **Привязки `FTV_M2M_SETTINGS`** — ID из справочников клиента: `WHOS` (депозитарий), `OPER_USER`, `FILER_CAT`
|
||||
(категория `D_FILER`), `D_NUM`/`K_NUM` (балансовые счета 98010 и 98070), `MARKET` (Мосбиржа), `B_TYPE`
|
||||
(«Отчёт депозитария» в `DEPO96_DCLA`), `CORR_FACE` (НКО АО НРД), `FILER_RUBRICA`.
|
||||
8. **Справочники по имени**: категории `I_CLISER_M2M_ZACH/SPIS`, `OP_INV_ZACH/SPIS`; состояния `WAIT_RESP_DECIS`,
|
||||
`WAIT_OPER`; директива `PROCESS`; кодировщики `OD_FACES.MNEM = 'M2M'` и `'НДЦ'`. Таблицы `D_CLISER_M2M`,
|
||||
`D_CLISER_M2M_DOL`, `U_OP_INV_ZACH/SPIS` — пользовательские (настройка M2M в Fancy), у клиента их может не быть.
|
||||
9. **Кодировка базы**: WIN1251 (`RDB$DATABASE.RDB$CHARACTER_SET_NAME`). Текст ошибки из контекста приводится к
|
||||
WIN1251 — при другой кодировке поменять в `FTV_M2M_JOB`.
|
||||
10. **Числа состояний** в `PROCESS_EVENTS` (`STATE = 1, 2, 3, 8`) — как у Фонтвьель; сверить с `OD_DOC_STATES`.
|
||||
(«Отчёт депозитария» в `DEPO96_DCLA`), `CORR_FACE` (НКО АО НРД), `FILER_RUBRICA`. В проверенной базе счета,
|
||||
категория, биржа и тип основания совпали с Фонтвьель (313, 836, 255, 8106, 31) — справочники поставки Fancy;
|
||||
`WHOS` и `CORR_FACE` — свои (`OD_SETS.WHOS`; НРД — юрлицо с `MNEM = 'НДЦ'`).
|
||||
5. **Кодировка и диалект**: `RDB$DATABASE.RDB$CHARACTER_SET_NAME`, `MON$DATABASE.MON$SQL_DIALECT`. При NONE или
|
||||
WIN1251 — ставить в WIN1251 (см. выше); текст ошибки в `FTV_M2M_JOB` приводится к WIN1251.
|
||||
6. **Числа состояний** в `PROCESS_EVENTS` (`STATE = 1, 2, 3, 8`) — как у Фонтвьель; в проверенной базе поручения
|
||||
дошли до `STATE = 2`, сверить с `OD_DOC_STATES` клиента.
|
||||
|
||||
## Открытые вопросы логики (те же, что в MSSQL-версии)
|
||||
|
||||
- `BJ_ORDER_REJECTED` не обрабатывается — уходит в «неизвестное событие» (вопрос программисту от 16.10.2026).
|
||||
- `BJ_CP_CONFIRM` с направлением OUT перехватывается веткой `BJ_DECISION_CONFIRM` выше.
|
||||
- Депонент не найден — поручение создаётся без депонента, ошибки нет.
|
||||
- Депонент не найден — поручение создаётся без депонента, ошибки нет. Ищется по имени и серии+номеру документа:
|
||||
при пустой серии (`NULL`) не находится.
|
||||
|
||||
@@ -37,12 +37,12 @@ COMMIT;
|
||||
EXECUTE PROCEDURE FTV_M2M_JOB;
|
||||
COMMIT;
|
||||
SET LIST ON;
|
||||
SELECT ID, GUID, STATE, DOC, CONTRAGENT, DEPONENT, CAST("COMMENT" AS VARCHAR(300)) C FROM FTV_M2M;
|
||||
SELECT ID, GUID, STATE, DOC, CONTRAGENT, DEPONENT, CAST(COMMENT AS VARCHAR(300)) C FROM FTV_M2M;
|
||||
SELECT ID, STATE, DOC, DOL, SHARE, PLACE, DEPO FROM FTV_M2M_LINES;
|
||||
SELECT ID, EVENT_TYPE, STATE, CAST("COMMENT" AS VARCHAR(600)) C FROM FTV_M2M_EVENTS;
|
||||
SELECT ID, EVENT_TYPE, STATE, CAST(COMMENT AS VARCHAR(600)) C FROM FTV_M2M_EVENTS;
|
||||
SELECT ID, NUM, D_CAT, STATE, KVIT, WHOS FROM OD_DOCS ORDER BY ID;
|
||||
SELECT DOC, D_NUM, K_NUM, MARKET, B_TYPE, B_NUM, B_DATE, CAST("COMMENT" AS VARCHAR(300)) C FROM U_OP_INV_ZACH;
|
||||
SELECT DOC, D_NUM, K_NUM, MARKET, B_TYPE, B_NUM, B_DATE, CAST(COMMENT AS VARCHAR(300)) C FROM U_OP_INV_ZACH;
|
||||
SELECT DOC, RUBRICA, DOC_NUM, DOC_DATE, CORR_FACE, MESS FROM D_FILER;
|
||||
SELECT DOC, CAST("COMMENT" AS VARCHAR(300)) C, CAST(DO_ING AS VARCHAR(100)) D FROM OD_INVALIDS;
|
||||
SELECT DOC, CAST(COMMENT AS VARCHAR(300)) C, CAST(DO_ING AS VARCHAR(100)) D FROM OD_INVALIDS;
|
||||
SELECT CODE, CODER, FACE FROM OD_FACE_CODERS;
|
||||
SELECT ID, DOC, A_DOC, S_TYPE, OUT_STATE, OPER FROM OD_STEPS;
|
||||
|
||||
@@ -584,13 +584,13 @@ CREATE TABLE U_OP_INV_ZACH (
|
||||
"REESTR" INTEGER,
|
||||
"CONDITION" INTEGER);
|
||||
|
||||
CREATE GENERATOR OD_DOC_ID_GEN;
|
||||
CREATE GENERATOR OD_DOCS_ID_GEN;
|
||||
|
||||
SET GENERATOR OD_DOC_ID_GEN TO 1000;
|
||||
SET GENERATOR OD_DOCS_ID_GEN TO 1000;
|
||||
|
||||
CREATE GENERATOR OD_DOL_ID_GEN;
|
||||
CREATE GENERATOR OD_DOLS_ID_GEN;
|
||||
|
||||
SET GENERATOR OD_DOL_ID_GEN TO 1000;
|
||||
SET GENERATOR OD_DOLS_ID_GEN TO 1000;
|
||||
|
||||
CREATE GENERATOR OD_STEPS_ID_GEN;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user