Имя: Пароль:
1C
1С v8
Битая ссылка на входящее электронное письмо
0 Yarosh_Pavel
 
07.02.23
16:13
Доброго времени суток, уважаемые господа!

В нашей конфигурации УТ11.5.9 была сделана доработка - был разработан документ "Входящее обращение", который связан с входящим электронным письмом от клиента. Пользователи-операторы должны работать с этим обращением - квалифицировать его, писать клиенту ответ или звонить ему и т.д. Документ "Входящее обращение" содержит реквизит "Основание", являющийся ссылкой на документ "ЭлектронноеПисьмоВходящее". Документ создается при записи электронного письма с помощью разработанной подписки на событие "ПриЗаписиЭлектронногоПисьма". Эта подписка подключена к событию ПриЗаписи объекта "ДокументОбъект.ЭлектронноеПисьмоВходящее". Запись входящего электронного письма происходит при регламентной закачке почты. В процедуре подписки создаётся документ "ВходящееОбращение", в реквизит "Основание" которого записывается ссылка на документ "ЭлектронноеПисьмоВходящее", при фоновой записи которого была вызвана подписка.
Сначала этот механизм работал нормально. Но потом сисадмин стал жаловаться, что слишком долго идет закачка почты, и руководство распорядилось как-то ускорить процесс. Я не придумал ничего лучше, как организовать запуск процедуры, создающей входящее обращение, в еще одном фоновом задании.
Т.е. теперь, когда отрабатывает подписка на событие "ПриЗаписи" объекта "ДокументОбъект.ЭлектронноеПисьмоВходящее", вызывается фоновая процедура создания входящего обращения, которой передаются реквизиты письма-основания, в том числе ссылка на него, которая прописывается в реквизит "Основание" входящего обращения.
Теперь закачка писем стала идти быстрее. Но иногда возникают проблемные ситуации, когда 1С по какой-то причине отказывается сохранять входящее электронное письмо. Причем происходит это уже после того, как событие подписка на событие ПриЗаписи успешно отработала, и аргумент Отказ не установился в Ложь.
Т.е. фоновая процедура создания входящего обращения запустилась, и ссылка на письмо ей передалась, но впоследствии она оказывается битой. Анализировать, битая она или нет, при создании входящего обращения бесполезно - письмо может еще не записаться, и ссылка на него вполне может быть битой, даже если потом письмо успешно запишется. Беда в том, что 1С может отказаться сохранить письмо уже ПОСЛЕ того, как отработали и процедура ПриЗаписи() модуля объекта "ЭлектронноеПисьмоВходящее", и подписка на событие "ПриЗаписи".
Причем после этого при регламентной закачка почты 1С снова пытается закачать это письмо - и опять отрабатывает подписку ПриЗаписи, в результате которой снова создается входящее обращение с битой ссылкой. И это повторяется до тех пор, пока не будет заблокирована учетная запись, на которую пришло такое письмо.
Подскажите, пожалуйста, можно ли как-то решить эту проблему?
Заранее благодарю.
1 PR
 
07.02.23
16:19
(0) Верни все назад, как работало
2 Волшебник
 
модератор
07.02.23
16:19
Надо убрать все фоновые задания и записывать каждое письмо/обращение в одной транзакции
3 Yarosh_Pavel
 
07.02.23
16:32
Волшебник, у нас изначально так и было. Из-за претензий админа, что почта закачивается долго и слишком грузит систему, пришлось прибегнуть к варианту с фоновым заданием.
Мне непонятно другое - как может быть, что уже после отработки события ПриЗаписи, когда в конце процедуры Отказ = Ложь, 1С может отказаться записать объект? И можно ли как-то этот отказ отловить?
4 arsik
 
гуру
07.02.23
16:35
Если долго почта закачивается, то не проще создавать события после загрузки почты.
Сначала загрузили. Потом по списку загруженных создать события.
5 timurhv
 
07.02.23
16:37
(3) Не поверю, что из-за записи документа обращений просел забор писем. Что-то там внутри документа навертели, исправляйте.
6 KJlag
 
07.02.23
16:40
а в чем проблема делать через регламентное?
пусть почта себе грузится, через время после этого регламентного, запускать свое.
у себя я в регламентном ПолучениеИОтправкаЭлектронныхПисем после всего что там есть, в конце вызываю свою функцию, обработки входящих сообщений.
обработанные письма можешь найти по основанию обращения.
ограничение можешь делать по времени, чтобы не считывать всю почту.
7 Остап Ибрагимович
 
07.02.23
16:50
Независимый непериодический РС "СозданиеВходящихОбращений" с измерениями+ресурсами+реквизитами, содержащими информацию, достаточную для создания документов "Вход.обращения" (дофига не надо - скорее всего хватит вообще единственного измерения "ЭлектронноеПисьмоВходящее" типа ДокументСсылка.ЭлектронноеПисьмоВходящее, и ресурс "ВходящееОбращение"  типа ДокументСсылка.ВходящееОбращение - изначально пустое.
В процессе закачки - набивай его электронными письмами (с пустым ресурсом).
При окончаинии закачки - запускай регзадание, которое будет по этому РС создавать вход.обращения с прописью соотв.оснований (из значений измерения), и прописывать их в ресурс.
По кончании выполнения регзадания - опционально вычищать из РС записи с заполненным ресурсом (созданным и "привязанными" вход.обращениями).
Ну или регламент зачистки этого буферного РС м.б. другое - аппетит растет во время еды (мот там хранить историю действий надо, зачищать по другим доп.условиям типа "возраста закачки", и т.п.)
Ну и это рег.задание можно будет и "по кнопке" запускать, из обработки какой-нить типа "Анализ создания вход.обращений по эл.письмам"...
8 Yarosh_Pavel
 
07.02.23
18:26
Остап Ибрагимович, благодарю Вас за красивое решение! Недостаток в нем для нашего случая я вижу только один - уйдет параллельность процессов закачки почты и формирования входящих обращений. Закачка почты у нас может занимать от нескольких минут до нескольких часов, в зависимости от объема почты. И получится, что входящее обращение может быть создано через несколько часов после того, как запишется входящее письмо.
Может, попробовать другой вариант - тот же РС "СозданиеВходящихОбращений" с измерением "Ссылка на письмо" и ресурсом "ВходящееОбращение". Оставить фоновый процесс формирования входящих обращений, и в этом процессе после создания входящего обращения вносить запись в регистр. Записать ссылку на письмо и ссылку на входящее обращение. А потом, по окончании выполнения регламентного задания по закачке почты, просмотреть этот РС и вычистить записи, предварительно проверив, не является ли ссылка на письмо битой. Если является, то перед удалением записи из РС удалить и входящее обращение. Может, таким путем пойти?
9 Волшебник
 
модератор
07.02.23
19:24
(8) Вам надо изменить концепцию. Закачку почты делайте каждые 5 минут.
10 Остап Ибрагимович
 
07.02.23
19:54
(8): Какая "параллельность уйдет"??? Ее де-факто и не было.
А тут - только закачка в документы (ЭлПисьмоВходящее) без затрат на создание еще чего-то там - будет в результате раза в два быстрее.
Еще быстрее можно если этот шаг разбить на два этапа: 1) тупо высасываем информацию из инторнетов в локаль (да хоть в жсон-файл) - это будет чистое время на получение данных "снаружи", которое никак не укоротить - разве что канал потолще купить - и 2) полученную информацию тут же на локали перегонять в документы (ЭлПисьмоВходящее) + мизер на запись в РС - причем именно этот процесс можно вполне спокойно придумать как распараллелить.
А потом - регзадание в фоне (и тоже можно в несколько потоков, кстати!) по РС создавать и "подвязывать" документы "обращения".
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший