CREATE OR ALTER procedure [dbo].[FTV_M2M_PROCESS_OPERATION] @GUID uniqueidentifier, @REFERENCE varchar(255), @OPER_DATE datetime, @PARAMETERS nvarchar(4000), @OPER_ID int output --grant execute on FTV_M2M_PROCESS_OPERATION to public; /* Создает операцию, возвращает OPER_ID созданной операции Параметры нацелены прежде всего на строки уже созданного М2М-поручения D_CLISER_M2M_DOL, а не на буферные таблицы (к ним больше не обращаемся) Все проверки идут до вызова, но элементарные проверки можно сделать и тут. Или дать raiserror Мы существенно разгружаем FTV_M2M_PROCESS_EVENTS declare @OPER_ID int; exec FTV_M2M_PROCESS_OPERATION @GUID = 'BAE1FA60-EB0A-4FEE-B12C-018D1EAFCBD2', @REFERENCE = 'M2M0917165643657', @OPER_DATE = '20260922', @PARAMETERS = '1234567890 от 10.10.2026', @OPER_ID = @OPER_ID out; select @OPER_ID; */ as set nocount on; if user = 'dbo' execute as user = 'SYSDBA'; print 'FTV_M2M_PROCESS_OPERATION' + ' GUID = ' + cast(@GUID as varchar(36)) + ', REFERENCE = ' + @REFERENCE; declare @WHOS int = 383118, @CLISER_ID int, @CLISER_NUM varchar(64), @CLISER_DATE datetime, @DIRECTION varchar(64), @DD_DATE datetime, @DD_NUM varchar(64), @SHARE int, @AMOUNT numeric(27, 7), @CLIENT int, @FACE int, @PLACE int, @D_CAT int, @NUM varchar(64), @FILER_ID int, @FILER_NUM varchar(64), @FILER_DATE datetime, @STEP_ID int; select @CLISER_ID = H.DOC, @CLISER_NUM = D.NUM, @CLISER_DATE= D.D_DATE, @DIRECTION = case when DC.SYS_NAME = 'I_CLISER_M2M_ZACH' then 'IN' when DC.SYS_NAME = 'I_CLISER_M2M_SPIS' then 'OUT' end, @DD_DATE = cast(D.D_DATE as date), @DD_NUM = D.NUM, @SHARE = F.SHARE, @AMOUNT = F.AMOUNT, @CLIENT = F.CLIENT, @FACE = H.DEPONENT, @PLACE = 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 left join D_CLISER_M2M H on H.DOC = D.ID left join OD_DOC_CATS DC on DC.ID = D.D_CAT where H.DOC_GUID = @GUID and F.DOL_REF = @REFERENCE; --Элеметарные проверки if @CLISER_ID is null raiserror ('Не найдено M2M-поручение по GUID + REFERENCE', 16, 1); --Направление select @D_CAT = DC.ID from OD_DOC_CATS DC where DC.SYS_NAME = case when @DIRECTION = 'IN' then 'OP_INV_ZACH' else 'OP_INV_SPIS' end; --ID и номер операции exec GEN_ID 'OD_DOC_ID_GEN', 1, @OPER_ID out; exec FU_NEXT_DOC_NUM @D_CAT, @OPER_DATE, null, @OPER_ID, @NUM out, null; set @NUM = @NUM + '_' + @REFERENCE; --Создаем документ insert into OD_DOCS (ID, NUM, PARAM, D_CAT, D_DATE, STATE, DIRECTION, WHOS, KVIT) values (@OPER_ID, @NUM, null, @D_CAT, @OPER_DATE, 0, 0, @WHOS, @CLISER_ID); if @DIRECTION = 'IN' begin 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 ) values ( @OPER_ID, 1 /*Клиентское*/, @DD_DATE, @DD_NUM, @SHARE, @AMOUNT, null, @PLACE, 313, /*98010 - 0 - Ценные бумаги и цифровые активы на хранении в ведущем депозитарии (НОСТРО депо базовый) */ @CLIENT, 836, /*98070 - 4 - Ценные бумаги и цифровые активы на торгах*/ 8106, /*ММВБ - ПАО Московская Биржа*/ null, null, null, 31, /*Отчет депозитария*/ @CLISER_DATE, @CLISER_NUM, @OPER_DATE, @OPER_DATE, @OPER_DATE, 0, @FACE, null, 'Отчет НКО АО НРД ' + @PARAMETERS + '. Перевод M2M (без поручения), GUID ' + cast(@GUID as varchar(36)) + ', референс ' + @REFERENCE ); end else if @DIRECTION = 'OUT' begin 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 ) values ( @OPER_ID, 1 /*Клиентское*/, @DD_DATE, @DD_NUM, @SHARE, @AMOUNT, null, @PLACE, 313, /*98010 - 0 - Ценные бумаги и цифровые активы на хранении в ведущем депозитарии (НОСТРО депо базовый) */ @CLIENT, 836, /*98070 - 4 - Ценные бумаги и цифровые активы на торгах*/ 8106, /*ММВБ - ПАО Московская Биржа*/ null, null, null, 31, /*Отчет депозитария*/ @CLISER_DATE, @CLISER_NUM, @OPER_DATE, @OPER_DATE, @OPER_DATE, 0, @FACE, null, 'Отчет НКО АО НРД ' + @PARAMETERS + '. Перевод M2M, GUID ' + cast(@GUID as varchar(36)) + ', референс ' + @REFERENCE ); end; --Входящая запись (для отчета НРД) exec GEN_ID 'OD_DOC_ID_GEN', 1, @FILER_ID out; set @FILER_DATE = getdate(); exec FU_NEXT_DOC_NUM 'D_FILER', @FILER_DATE, 1, @FILER_ID, @FILER_NUM out, null; insert into OD_DOCS (ID, NUM, D_CAT, D_DATE, STATE, DIRECTION, WHOS) values (@FILER_ID, @FILER_NUM, 255, @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, 8, 5 /*уточнить в депозитарии*/, 'Отчет (перевод через MOEX-МОСТ)', LEFT(@PARAMETERS, CHARINDEX(' ', @PARAMETERS + ' ') - 1), CONVERT(date, RIGHT(TRIM(@PARAMETERS), CHARINDEX(' ', REVERSE(TRIM(@PARAMETERS))) - 1), 104), 18174, @FACE, @CLIENT, @PLACE, @FILER_DATE, null, 'MS010 / ' + cast(@GUID as varchar(36)) + ' / ' + @REFERENCE); --ORI_DATE поточнее? может из события? TODO --Связываем с операцией exec GEN_ID 'OD_STEPS_ID_GEN', 1, @STEP_ID out; insert into OD_STEPS (ID, DOC, A_DOC, ERR_CODE, S_TYPE, OUT_STATE, S_DATE, OPER) values (@STEP_ID, @FILER_ID, @OPER_ID, 2004, 0, 0, getdate(), null); --И сразу проводим exec FTV_M2M_PROCESS_WIRING @OPER_ID;