Отправка писем из 1С:Предприятие 8
Рубрика: 1С:Предприятие -> Программирование
Метки: 1С:Предприятие | примеры | программирование | советы
Просмотров: 6859
Не так давно пришлось дорабатывать одну самописную конфигурацию, созданную на базе платформы «1С:Предприятие 8». Конфигурация достаточно простая и одна из самых ее «тяжелых» функций – отправка писем клиентам. Клиентов достаточно много и в день нужно отправлять по 50-100 писем в автоматическом режиме. Например, в базе произошло какое-то важное событие по клиентскому договору и нужно оперативное известить об этом клиента на email.
Разработчик, создавший эту конфигурацию, сделал все максимально просто – написал отдельную обработку и экспортную функцию, которая формировала письма и сразу же их отправляла. Все бы хорошо, но у клиента стали происходит внештатные ситуации вроде отключения интернета и периодической недоступности почтового сервера. Автор обработки об этом явно не думал, поэтому если возникла какая-нибудь проблема, то важное для клиента письмо не отправлялось.
Владелец этой разработки долго с этим мирился, но когда потребители услуг подняли бунт, спохватился и решил в срочном порядке найти разработчика, способного решить зоопарк накопившихся проблем.
Сначала он обратился в местный “Франчайзи” (вроде как солидно), но там поставили неутешительный диагноз и запросили кругленькую сумму за исправления. Вторым вариантом было предложение внедрить новую готовую конфигурацию с необходимой адаптацией. Не знаю, чем они думали, но этот способ потребует значительно больше затрат (как временных, так и финансовых). К тому же, имеющиеся приложение вполне хорошо решает задачи заказчика, поэтому внедрение нового продукта, на мой взгляд, совершенно неоправданно.
Мое решение
Детально изучив работу ключевых алгоритмов, я пришел к выводу, что решить проблемы клиенты можно достаточно просто. Всего-то нужно добавить один регистр сведений для хранения сформированных писем и одно регламентное задание для периодической проверки наличия новых писем. Появились новые письма – соединяемся один раз с сервером и выполняем их последовательную отправку.
В регистре сведений я предусмотрел измерение “Статус”, которое определяет возможные статусы писем: готово к отправке и отправлено. Каждое новое письмо добавляется в регистр и ему присваивается статус “Готово к отправке”. Регламентное задание выбирает все письма с этим статусом и последовательно выполняет отправку через сервер. Если проблем с отправкой не возникло, то статус письма изменяется на “Отправлено”. Таким образом, это письмо больше не попадет в список на отправку.
Отсутствие интернета или недоступность почтового сервера больше не вызывает проблем, т.к. в случае ошибки ничего страшного не произойдет. Статус письма не измениться и повтор отправки будет выполнен позже.
Предложенное мной решение, хорошо сказалось на производительности. Раньше отправка инициировалась пользователем (в некоторых случаях), из-за чего ему приходилось долго наблюдать на застывшее приложение. Платформе требуется время на установку соединения с сервером и передачу письма.
Пользователю больше не нужно ждать пока произойдет соединение с севером. Данные для отправки должны лишь добавиться в регистр сведений, а дальше будет действовать регламентное задание.
Решение достаточно элегантное и его без проблем можно масштабировать. Например, добавляем дополнительное измерение в регистр сведений (пусть это будет «ВидТранспорта») и дорабатываем механизм передачи данных. Таким образом, добавить поддержку отправки сообщений посредством SMS дело пары часов (все зависит от степени готовности модуля взаимодействия с SMS-провайдером).
Проблемы заказчика я решил за каких-то 4 часа, соответственно он отделался минимальным бюджетом. Если сравнивать с предложением от “Франчайзи”, то сумма получилась просто смешной.