При автоматизации работы с клиентами в 1С:Управление нашей фирмой (УНФ) часто возникает задача массовой отправки писем. Это могут быть как маркетинговые рассылки, так и транзакционные уведомления, например, напоминания о дебиторской задолженности. Однако, независимо от цели письма, хорошим тоном и часто юридическим требованием является наличие механизма отписки (Unsubscribe). Рассмотрим подробно, как технически реализовать этот функционал, какие существуют архитектурные подходы и как правильно настроить базу 1С для учета предпочтений клиентов.
Мы сталкиваемся с необходимостью отправлять письма должникам. Если клиент не хочет получать такие уведомления, у него должна быть возможность отказаться от них, нажав на ссылку в письме. Наша система 1С должна автоматически зафиксировать этот отказ, чтобы исключить клиента из будущих рассылок.
Проанализируем три основных способа реализации:
Этот метод подходит, если база 1С опубликована на веб-сервере (Apache или IIS) и доступна из интернета. Суть метода заключается в том, что ссылка в письме ведет непосредственно на HTTP-сервис вашей базы данных.
Разберем алгоритм действий:
HTTP-сервис.Посмотрим на пример кода обработчика GET-запроса в модуле HTTP-сервиса. Предположим, мы передаем в URL параметр ClientID.
Функция UnsubscribeGET(Запрос)
// Получаем ID клиента из параметров запроса
СтрокаID = Запрос.ПараметрыЗапроса.Получить("client_id");
Если ЗначениеЗаполнено(СтрокаID) Тогда
// Пытаемся найти контрагента по уникальному идентификатору
СсылкаНаКлиента = Справочники.Контрагенты.ПолучитьСсылку(Новый УникальныйИдентификатор(СтрокаID));
Если Не СсылкаНаКлиента.Пустая() Тогда
// Создаем запись в регистре сведений или меняем реквизит
Запись = РегистрыСведений.ЗапретРассылки.СоздатьМенеджерЗаписи();
Запись.Контрагент = СсылкаНаКлиента;
Запись.Отписался = Истина;
Запись.ДатаОтписки = ТекущаяДата();
Запись.Записать();
// Формируем ответ пользователю
Ответ = Новый HTTPСервисОтвет(200);
Ответ.Заголовок["Content-Type"] = "text/html; charset=utf-8";
Ответ.УстановитьТелоИзСтроки("<html><body><h3>Вы успешно отписаны от рассылки.</h3></body></html>");
Возврат Ответ;
КонецЕсли;
КонецЕсли;
// Если клиент не найден или ошибка параметров
Ответ = Новый HTTPСервисОтвет(404);
Ответ.УстановитьТелоИзСтроки("Ошибка: Клиент не найден.");
Возврат Ответ;
КонецФункции
Преимущества: Данные попадают в 1С мгновенно. Не нужны сторонние сервисы.
Недостатки: База должна быть опубликована наружу, что несет риски безопасности. Высокая нагрузка на базу при массовых переходах.
Более безопасный и масштабируемый подход — использование простого скрипта на внешнем хостинге (VPS). Это может быть микросервис на языке Go, PHP или Node.js. Давайте разберем, как это работает.
example.com/unsubscribe?email=client@mail.ru.РегламентноеЗадание, которое раз в час обращается к этому микросервису и забирает список новых отписавшихся адресов.Такой подход изолирует вашу базу 1С от прямого доступа из интернета и снижает нагрузку на систему.
Если вы планируете серьезную работу с рассылками, рекомендуется использовать специализированные сервисы (UniSender, SendPulse и др.) и готовые модули интеграции для 1С. В экосистеме 1С существуют решения, позволяющие синхронизировать сегменты клиентов.
Принцип работы:
List-Unsubscribe. Это позволяет почтовым клиентам (Gmail, Mail.ru) корректно отображать кнопку отписки в интерфейсе.Это наиболее надежный вариант, так как он защищает репутацию вашего домена и гарантирует правильную техническую обработку писем почтовыми провайдерами.
Рассмотрим важные аспекты, которые необходимо учитывать при настройке рассылок из 1С, чтобы ваши письма доходили до адресатов и не нарушали закон.
В обсуждении справедливо замечено, что уведомление о задолженности — это исполнение договора, а не реклама. Согласно законодательству, вы обязаны уведомлять клиента о состоянии расчетов. Однако:
Для того чтобы письма, отправленные непосредственно из 1С (через SMTP), не попадали в спам, необходимо настроить записи домена:
Крайне не рекомендуется просто удалять Email из карточки клиента, как предлагалось в некоторых обсуждениях. Это приведет к потере контактной информации.
Вместо этого мы рекомендуем:
РегистрСведений "СтатусыEmailРассылок" или "ЧерныйСписокEmail".Email (Строка) или Контрагент (Справочник).ЗапретРассылки (Булево), Причина (Строка), ДатаИзменения (Дата).Перед каждой отправкой писем ваша обработка должна выполнять запрос к этому регистру:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Контрагенты.Ссылка КАК Контрагент,
| Контрагенты.Email КАК Email
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЧерныйСписокEmail КАК ЧерныйСписок
| ПО Контрагенты.Email = ЧерныйСписок.Email
|ГДЕ
| ЧерныйСписок.Email ЕСТЬ NULL
| И Контрагенты.Задолженность > 0";
// Результат запроса содержит только тех, кто не отписался
Таким образом, мы сохраняем контактные данные клиента, но уважаем его выбор не получать автоматические уведомления. Также хорошей практикой является создание страницы "Центр предпочтений", где клиент может выбрать, какие именно типы писем он хочет получать (например, "Акты сверок" — да, "Новости" — нет).