From ee857b089a7d224cb029a5e55f64c9e5e7d99af8 Mon Sep 17 00:00:00 2001 From: fontvielle Date: Tue, 27 Oct 2026 17:31:29 +0300 Subject: [PATCH] =?UTF-8?q?DEPO=20Firebird:=20=D0=BF=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=D0=B5=D1=80=D0=BA=D0=B0=20=D0=BD=D0=B0=20=D1=80=D0=B5=D0=B0?= =?UTF-8?q?=D0=BB=D1=8C=D0=BD=D0=BE=D0=B9=20=D0=B1=D0=B0=D0=B7=D0=B5=20Fan?= =?UTF-8?q?cy=20=E2=80=94=20=D0=B3=D0=B5=D0=BD=D0=B5=D1=80=D0=B0=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D1=8B,=20=D0=B4=D0=B8=D0=B0=D0=BB=D0=B5=D0=BA?= =?UTF-8?q?=D1=82=201,=20=D0=B4=D0=B0=D1=82=D0=B0=20=D0=B1=D0=B5=D0=B7=20?= =?UTF-8?q?=D0=B2=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Обезличенная база 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 Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn --- .../fancy-m2m-firebird/00_FTV_M2M_TABLES.sql | 26 +++---- .../fancy-m2m-firebird/10_FTV_M2M_PROCS.sql | 58 +++++++++------ .../fancy-m2m-firebird/20_FTV_M2M_GRANTS.sql | 8 +++ deploy/depo/fancy-m2m-firebird/README.md | 71 ++++++++++++------- deploy/depo/fancy-m2m-firebird/test/smoke.sql | 8 +-- .../fancy-m2m-firebird/test/stub_fancy.sql | 8 +-- 6 files changed, 110 insertions(+), 69 deletions(-) diff --git a/deploy/depo/fancy-m2m-firebird/00_FTV_M2M_TABLES.sql b/deploy/depo/fancy-m2m-firebird/00_FTV_M2M_TABLES.sql index 2260a18..7f47f1c 100644 --- a/deploy/depo/fancy-m2m-firebird/00_FTV_M2M_TABLES.sql +++ b/deploy/depo/fancy-m2m-firebird/00_FTV_M2M_TABLES.sql @@ -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 ; ^ diff --git a/deploy/depo/fancy-m2m-firebird/10_FTV_M2M_PROCS.sql b/deploy/depo/fancy-m2m-firebird/10_FTV_M2M_PROCS.sql index e69ddf0..9a68d43 100644 --- a/deploy/depo/fancy-m2m-firebird/10_FTV_M2M_PROCS.sql +++ b/deploy/depo/fancy-m2m-firebird/10_FTV_M2M_PROCS.sql @@ -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 diff --git a/deploy/depo/fancy-m2m-firebird/20_FTV_M2M_GRANTS.sql b/deploy/depo/fancy-m2m-firebird/20_FTV_M2M_GRANTS.sql index 3a94616..14cbb64 100644 --- a/deploy/depo/fancy-m2m-firebird/20_FTV_M2M_GRANTS.sql +++ b/deploy/depo/fancy-m2m-firebird/20_FTV_M2M_GRANTS.sql @@ -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; diff --git a/deploy/depo/fancy-m2m-firebird/README.md b/deploy/depo/fancy-m2m-firebird/README.md index 46c9cdf..8fc04f9 100644 --- a/deploy/depo/fancy-m2m-firebird/README.md +++ b/deploy/depo/fancy-m2m-firebird/README.md @@ -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`) не находится. diff --git a/deploy/depo/fancy-m2m-firebird/test/smoke.sql b/deploy/depo/fancy-m2m-firebird/test/smoke.sql index a9f3963..772a373 100644 --- a/deploy/depo/fancy-m2m-firebird/test/smoke.sql +++ b/deploy/depo/fancy-m2m-firebird/test/smoke.sql @@ -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; diff --git a/deploy/depo/fancy-m2m-firebird/test/stub_fancy.sql b/deploy/depo/fancy-m2m-firebird/test/stub_fancy.sql index e08c085..7394f24 100644 --- a/deploy/depo/fancy-m2m-firebird/test/stub_fancy.sql +++ b/deploy/depo/fancy-m2m-firebird/test/stub_fancy.sql @@ -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;