Какой должна быть лента событий #827
Replies: 5 comments
-
Метод Organization.GetDocumentEventList([AfterEventId]) и формируемая на его основе лента событийПроблема №1. ОписаниеОсобенностью метода GetDocumentEventList является то, что в качестве параметра для него надо либо ничего не передавать, либо можно передать «Идентификатор события, после которого будет вычитываться лента событий». В случае, если параметр не задан, то будет происходит вычитка событий «с самого начала времен» для данной организации. При этом идентификаторы событий сами по себе никак ни к какому времени возникновения событий не привязаны (ну, по крайней мере, так, чтобы это из самого идентификатора было понятно). Это просто некие ID. Например, 95dd0c83-8ee3-4ea1-823e-8f2974f2162b. Если передать его как параметр в функцию, то в возвращаемых результатах будут ID событий с временной привязкой в поле Timestamp – но это будет ПОСЛЕ получения данных, а не ДО этого. А по самому ID никак нельзя понять к какому времени он относится. Это приводит к тому, что, если не сохранять куда-то в своей системе всю ленту получаемых событий или не фиксировать, в какой-то таблице по каким ID в какой момент времени мы получали события документооборота, то никаким образом нельзя будет потом связать имеющиеся ID со временем происходящих событий. Т.е. будет невозможно выполнить действие типа – «Получить порцию событий начиная с сегодняшнего утра 00:00:00». А если мы просто храним последний ID, по которому получали события, и в системе произошел какой-то сбой, в результате которого мы этот ID потеряли, то начать получать события по схеме «давай всё заново с сегодняшнего утра получим» или что-то в таком же духе – невозможно. И мы оказываемся в ситуации, когда ID из-за сбоя нет. По отметке времени возможности получения событий тоже нет… И единственным вариантом остается начать получать события «с самого начала времен», вызывая в первый раз функцию без параметров и начиная, по сути, пролистывать всю ленту событий с самого начала. Если у вас много документов в документообороте, то это превращается… ну, скажем так, в весьма «забавное» мероприятие! Особенно с учетом того, что «вот прямо сейчас» надо бы получать текущие события документооборота. Поток документов-то не прекращается. А ты не можешь, т.к. у тебя ID для этого нет. И тебе надо сперва перечитать, например, несколько миллионов событий за последние 5 лет! Только для того, чтобы добраться до ID текущих событий. Тех, которые вот прямо сейчас происходят. Плюс еще и сама операция GetDocumentEventList весьма небыстрая. Мне даже страшно представить, сколько времени у нас, например, с нашими 80-100 тысяч документов в месяц, может занять перечитывание всей ленты событий с начала времен, чтобы догнать наконец самые последние в истории. Не удивлюсь, если счет будет идти на недели! Также, без хранения в своей системе обработанных ID c их привязкой ко времени невозможно выполнить какой-то откат обработки событий документооборота и сделать что-то типа «а давайте заново перечитаем все события начиная со вчерашнего утра». Поэтому сохранять в своей учетной системе историю ленты событий с привязкой ID событий ко времени на текущий момент приходится в обязательном порядке! Конкретно мы по этой причине ведем в 1С специальный регистр в котором храним историю ID событий с привязкой ко времени вызова GetDocumentEventList по этим ID. Именно для того, чтобы в случае каких-то сбоев можно было бы начать получать события документооборота не с самого их начала, а с более-менее недавнего времени. А также для потенциальной возможности перечитывания событий документооборота с какого-то определенного момента. Проблема №1. Предложения по доработкеНам представляется, что хорошим дополнением функционала работы с событиями было бы добавление каких-то методов из предлагаемого списка (или всех их, например). Названия условные (не в них дело): 1. GetDocumentEventLisByTime Версия получения событий, в которую в качестве параметра передается не ID события, с которого надо начать, а момент времени, с которого надо брать события. Т.е. она должна вернуть порцию событий начиная с тех, у кого Timestamp >= указанного в параметре момента времени. Время по идее указывается с точностью до секунд. 2. GetDocumentEventIdByTime Более «костыльный» вариант, но тоже вполне подходящий. Эта функция принимает на вход момент времени и в ответ возвращает первый подходящий самый ранний ID события у которого Timestamp >= указанного в параметре момента времени. Время по идее указывается с точностью до секунд. С её помощью при проблемах с ID можно будет получить ID на нужный момент времени, а далее уже воспользоваться для работы с событиями стандартной имеющейся функцией GetDocumentEventList. 3. GetLastEventID Результатом её вызова должен быть последний существующий ID события документооборота из имеющихся на момент вызова (в рамках подключённой организации). Такая функция была бы весьма полезна для целей отладки и для обеспечения возможности быстрого перехода к последним событиям в ленте событий. Важным вопросом для функций №1 и №2 является то, как понять, что это за время, к какому часовому поясу оно относится? И это, кстати, связано с проблемой №2. |
Beta Was this translation helpful? Give feedback.
-
Проблема №2. ОписаниеКогда GetDocumentEventList возвращает данные, то, согласно документации, в поле Timestamp возвращается «дата и время события в текущем часовом поясе». Самый главный вопрос – «текущий» – это вообще какой?! Пример (кстати, вполне реальный!), я сижу во Владивостоке и вызываю этот метод. Из 1С на управляемых формах. Сервер, на котором это все в реальности выполняется расположен в Москве. При этом на этом сервере у нас обслуживаются разные базы 1С, и я выполняю это действие в базе, относящейся к городу Новосибирск. А весь функционал Контур.Диадок выполняется вообще непонятно, где (в смысле – мы не знаем где) – то ли в Москве, то ли в Екатеринбурге… Вот какой часовой пояс в данном случае является «текущим» и, главное, как из даты и времени, например, «29.10.2021 18:09:20» это можно понять впоследствии? Проблема №2. Предложения по доработкеДля снятия возможных неоднозначностей и разночтений, предлагаем явно вынести смещение по часовому поясу в данные, возвращаемые GetDocumentEventList. Для этого нужно вместо одного поля Timestamp возвращать два поля – Timestamp и GMT. И указывать то же самое текущее время события, как и сейчас, но дополнительно явным образом отмечать смещение по часовому поясу, ну, например, относительно Москвы. Т.е., если выполнить GetDocumentEventList в Москве, то будет такой результат: Timestamp = «29.10.2021 10:00:00», GMT = 0. А если это же и тогда же выполнить во Владивостоке, то был бы такой результат: Timestamp = «29.10.2021 17:00:00», GMT = 7. |
Beta Was this translation helpful? Give feedback.
-
Проблема №3. ОписаниеПожалуй, самым неоднозначным моментом в работе GetDocumentEventList является возвращаемый тип события (EventType). С одной стороны типов событий вроде как довольно-таки много. А с другой стороны:
Проблема №3. ОписаниеПожалуй, самым неоднозначным моментом в работе GetDocumentEventList является возвращаемый тип события (EventType). С одной стороны типов событий вроде как довольно-таки много. А с другой стороны: Проблема №3. ОписаниеПожалуй, самым неоднозначным моментом в работе GetDocumentEventList является возвращаемый тип события (EventType). С одной стороны типов событий вроде как довольно-таки много. А с другой стороны: Из-за всего этого в комплексе, мы на текущий момент из данных ленты событий документооборота не можем однозначно понять, что же именно с документом произошло. И поэтому вынуждены работать по довольно-таки странному принципу – как только по какому-то документу в ленте событий документооборота появляется любое событие (т.е. «хоть что-то происходит»), то мы понимаем только, что «с документом в ЭДО что-то произошло». Но толком понять – что же именно произошло – не можем. Поэтому мы этот документ заново получаем из ЭДО и уже по текущему состоянию статусов документа определяем, что же именно поменялось, и в каком теперь состоянии находится документ. Конечно, так тоже работать можно… но, если бы у нас было однозначное понимание по данным событий, что же именно произошло с документом, то можно было бы организовать обработку изменений состояния документов гораздо удобнее и экономичнее. В том числе и по ресурсам Диадока – мы бы (да, наверное, и не только мы) просто реже бы обращались в Диадок за получением документов целиком только для определения, что же с документом случилось и изменилось, т.к. нам было бы достаточно информации только из ленты событий без необходимости обращения за самим документом (из этого, кстати, вытекает дополнение А (см. далее)). Проблема №3. Предложения по доработкеС нашей точки зрения данный метод требует как доработки в плане отражаемых в ленте событий, так и доработки в плане документирования самого метода. Т.е. по минимуму нужно хотя бы доработать документацию. Явно указав:
А по максимуму – обновить возможные варианты EventType, напрямую отразив в них все возможные действия над документами. Для обеих вариантов минимальным набором действий, которые надо либо описать в документации, либо отразить в EventType (а лучше и то, и другое) с нашей точки зрения является:
Скорее всего список не полон. И вы со своей стороны еще что-то в него сможете добавить. Если реализация нового набора событий сложна или невозможна (а это, по идее, весьма вероятно), то огромная просьба – хотя бы документацию по текущим событиям доработать. Т.е. в привязке к событиям из вышеуказанного списка отметить – возникнет ли при этом событие в ленте событий и, если возникнет, то какое именно. |
Beta Was this translation helpful? Give feedback.
-
Beta Was this translation helpful? Give feedback.
-
Необходимо получение событий за определённую дату или по конкретному документу |
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
-
Метод
Organization.GetDocumentEventList([AfterEventId])
имеет ряд неудобств:
Пожелания и предложения по тому, как должна выглядеть лента событий, приветствуются.
Beta Was this translation helpful? Give feedback.
All reactions