CREATE OR ALTER procedure [dbo].[FTV_M2M_JOB] --grant execute on FTV_M2M_JOB to public; --exec FTV_M2M_JOB; as set nocount on; declare @ID int, @STATE varchar(64), @ERROR_NUMBER int, @COMMENT varchar(MAX); --ИЩЕМ НОВЫЕ ПОРУЧЕНИЯ declare cur cursor local fast_forward read_only for select ID from FTV_M2M M where M.STATE = 'TODO' order by M.TimeNew; open cur; while 0 = 0 begin fetch next from cur into @ID; if @@FETCH_STATUS <> 0 break; --Тут также можно отправить уведомление, создать входящее сообщение и т.д. (вне транзакции) update FTV_M2M set TimeBeg = GETDATE() where ID = @ID; --Процесс создания М2М-поручения begin try set @COMMENT = null; exec FTV_M2M_PROCESS_CREATE @ID; set @STATE = 'SUCCESS'; end try begin catch set @ERROR_NUMBER = ERROR_NUMBER(); set @COMMENT = ERROR_MESSAGE() + ' // ' + ERROR_PROCEDURE() + ' // ' + trim(str(ERROR_LINE())); set @STATE = 'ERROR' end catch --Тут также можно уведомить об ошибочном статусе (вне транзакции) update FTV_M2M set STATE = @STATE, TimeEnd = GETDATE(), COMMENT = @COMMENT where ID = @ID; end; close cur; deallocate cur; --ИЩЕМ НОВЫЕ СОБЫТИЯ declare cur cursor local fast_forward read_only for select ID from FTV_M2M_EVENTS ME where ME.STATE = 'TODO' order by ME.TimeNew; open cur; while 0 = 0 begin fetch next from cur into @ID; if @@FETCH_STATUS <> 0 break; --Тут также можно отправить уведомление, создать входящее сообщение и т.д. (вне транзакции) update FTV_M2M_EVENTS set TimeBeg = GETDATE() where ID = @ID; --Процесс изменения событий begin try set @COMMENT = null; exec FTV_M2M_PROCESS_EVENTS @ID; set @STATE = 'SUCCESS'; end try begin catch set @ERROR_NUMBER = ERROR_NUMBER(); set @COMMENT = ERROR_MESSAGE() + ' // ' + ERROR_PROCEDURE() + ' // ' + trim(str(ERROR_LINE())); set @STATE = 'ERROR' end catch --Тут также можно уведомить об ошибочном статусе (вне транзакции) if @COMMENT is not null update FTV_M2M_EVENTS set STATE = @STATE, TimeEnd = GETDATE(),COMMENT = @COMMENT where ID = @ID; else update FTV_M2M_EVENTS set STATE = @STATE, TimeEnd = GETDATE() where ID = @ID; end; close cur; deallocate cur; /* НИЖЕ - ПРИМЕР ДЛЯ ТЕСТИРОВАНИЯ declare @GUID uniqueidentifier; set @GUID = NEWID(); INSERT INTO [dbo].[FTV_M2M] ([GUID], [CONTRAGENT_M2M_CODE], [DEPONENT_NAME], [DEPONENT_DOC], [DIRECTION]) VALUES (@GUID, 'MC0034900000', 'Абабков Александр Владимирович', '4508 147055', 'OUT'); --Замечание - списание возможно только по одной строке подвала!! INSERT INTO [dbo].[FTV_M2M_LINES] ([GUID], [REFERENCE], [ISIN], [SEC_CODE], [AMOUNT], [PLACE_NUMBER], [LINK_NUMBER], [DEPO_NUMBER]) VALUES (@GUID, 'M2MREF_11', 'RU000A0JVHH1', 'RU000A0JVHH1', 11, '36MC0413600000F00', 'HL171004001C', 'ВТНКЦ00000060'); --INSERT INTO [dbo].[FTV_M2M_LINES] ([GUID], [REFERENCE], [ISIN], [SEC_CODE], [AMOUNT], [PLACE_NUMBER], [LINK_NUMBER], [DEPO_NUMBER]) --VALUES (@GUID, 'M2MREF_22', 'RU0009029540', 'SBER/03', 12, '36MC0413600000F00', 'HL171004001C', 'ВТНКЦ00000060'); exec FTV_M2M_JOB; --select COMMENT, * from [dbo].[FTV_M2M] --select COMMENT, * from [dbo].[FTV_M2M_LINES] --select COMMENT, * from [dbo].[FTV_M2M_EVENTS] -------------------------- --set @GUID = '' INSERT INTO [dbo].[FTV_M2M_EVENTS] (GUID, REFERENCE, EVENT_TYPE, EVENT_DATE, M2M_REJECT_CODE) VALUES (@GUID, 'M2MREF_11', 'BJ_ORDER_ACCEPTED', getdate()); exec FTV_M2M_JOB; select COMMENT, * from [dbo].[FTV_M2M] select COMMENT, * from [dbo].[FTV_M2M_LINES] select COMMENT, * from [dbo].[FTV_M2M_EVENTS] Ошибка преобразования значения varchar "IN" в тип данных int. // FTV_M2M_PROCESS_CREATE // 22 Не удалось вставить значение NULL в столбец "D_CAT", таблицы "UPD_DE_DATA.dbo.OD_DOCS"; в столбце запрещены значения NULL. Ошибка в INSERT. // propagate // 4 Дублирование номера внутреннего или исходящего документа (M2M поручение на зачисление от 05.09.2026: No TEST M2M) // propagate // 4 Обнаружена ошибка: деление на ноль. // FTV_M2M_PROCESS_CREATE // 118 Ошибка при преобразовании типа данных nvarchar к datetime. // FU_NEXT_DOC_NUM // 0 */