Многие компании сталкиваются с необходимостью интегрировать корпоративную почту в 1С, особенно при использовании CRM-систем. Однако попытка подключить десятки почтовых ящиков к одному регламентному заданию часто приводит к проблемам: задание выполняется очень долго, "подвисает" и блокирует другие процессы. Рассмотрим, почему это происходит и какие архитектурные решения помогут построить стабильную и быструю систему обработки почты в 1С.
Исходная ситуация: настроено регламентное задание для приема/отправки почты с 30 учетных записей с интервалом в 5 минут, но по факту оно может выполняться 10 минут и дольше, что приводит к сбоям в расписании и задержкам в обработке корреспонденции.
Прежде чем переходить к решениям, выясним, почему стандартный подход "в лоб" не работает при большом количестве ящиков. Проблема редко кроется в самом почтовом клиенте 1С, чаще всего она носит комплексный характер.
Как видим, узких мест достаточно. Теперь разберем, как их обойти, используя более грамотные архитектурные подходы.
Это самый эффективный способ ускорить процесс, предложенный одним из участников обсуждения. Идея заключается в том, чтобы отказаться от одного монолитного задания в пользу множества параллельных.
Разберем по шагам, как это реализовать:
Создаем обработку-исполнитель. Разработаем внешнюю или встроенную обработку, которая умеет принимать на вход один параметр — ссылку на УчетнуюЗаписьЭлектроннойПочты — и выполнять для нее весь цикл приема/отправки писем.
Создаем управляющее регламентное задание. Это задание будет запускаться по основному расписанию (например, каждые 5 минут). Его единственная задача — не обрабатывать почту самому, а запустить отдельные фоновые задания для каждого ящика.
Пишем код для запуска. Внутри управляющего задания нужно получить список всех активных учетных записей и для каждой из них запустить фоновое задание с вызовом нашей обработки-исполнителя.
Посмотрим на примерный код для управляющего задания:
Процедура ВыполнитьЗапускОбработкиПочты() Экспорт
// Получаем все учетные записи, которые нужно обработать
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| УчетныеЗаписиЭлектроннойПочты.Ссылка
|ИЗ
| Справочник.УчетныеЗаписиЭлектроннойПочты КАК УчетныеЗаписиЭлектроннойПочты
|ГДЕ
| НЕ УчетныеЗаписиЭлектроннойПочты.ПометкаУдаления";
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
// Для каждой учетной записи запускаем свое фоновое задание
ПараметрыЗадания = Новый Массив;
ПараметрыЗадания.Добавить(Выборка.Ссылка); // Передаем ссылку на учетную запись
// ИмяМетода - это экспортная процедура в общем модуле или модуле обработки
ФоновыеЗадания.Выполнить("ПочтовыйМодуль.ОбработатьОдинЯщик",
ПараметрыЗадания,
Новый УникальныйИдентификатор,
"Обработка почты: " + Выборка.Ссылка.Наименование);
КонецЦикла;
КонецПроцедуры
Преимущества такого подхода:
Этот подход повышает отказоустойчивость всей системы. Его можно использовать как отдельно, так и в комбинации с параллельной обработкой. Суть в том, чтобы разделить задачу на два независимых этапа.
Этап 1: Получение писем.
Регламентное задание (или несколько фоновых заданий) занимается только технической работой: подключается к почтовым серверам, скачивает письма, заголовки, тела писем и вложения. Вся эта информация сохраняется в "сыром" виде в промежуточном хранилище. В качестве такого хранилища идеально подходит РегистрСведений с измерениями: УчетнаяЗапись, ИдентификаторПисьма и ресурсами: Тема, Отправитель, Дата, ТелоПисьма, СтатусОбработки (например, "Новое", "В обработке", "Ошибка", "Обработано"). Вложения можно сохранять в отдельном регистре или в хранилище значений.
Этап 2: Обработка данных.
Совершенно другое регламентное задание, работающее по собственному расписанию, обращается к этому регистру сведений. Оно выбирает записи со статусом "Новое", анализирует их и выполняет всю бизнес-логику: создает документы "Событие" в CRM, прикрепляет файлы, формирует задачи пользователям и т.д. После успешной обработки оно меняет статус записи на "Обработано".
Преимущества этого решения:
В некоторых случаях можно кардинально упростить задачу, если есть доступ к настройкам почтового сервера. Вместо того чтобы 1С подключалась к 30 разным ящикам, вся почта централизуется.
Как это работает:
1c-robot@company.com.Преимущества:
Важный нюанс: этот подход не всегда применим. Например, если сторонняя CRM-система жестко привязана к схеме "один пользователь — один ящик" и не позволяет гибко настраивать логику обработки, реализовать такую схему будет сложно. Также она требует дополнительной работы по настройке почтового сервера.
В заключение, отметим, что прямолинейное использование встроенного почтового клиента 1С для десятков активных ящиков в одном регламентном задании — это неэффективный и нестабильный подход. Для построения надежной системы необходимо применять более продуманные архитектурные решения, такие как распараллеливание через фоновые задания, разделение логики получения и обработки или централизация почты. Выбор конкретного метода зависит от требований к системе, имеющихся ресурсов и ограничений со стороны используемых конфигураций.