Как правильно организовать механизм отписки от email-рассылок в 1С:УНФ?

Программист 1С v8.3 (Управляемые формы) 1С:Управление нашей фирмой Управленческий учет IT и автоматизация бизнеса
← На главную

При автоматизации работы с клиентами в 1С:Управление нашей фирмой (УНФ) часто возникает задача массовой отправки писем. Это могут быть как маркетинговые рассылки, так и транзакционные уведомления, например, напоминания о дебиторской задолженности. Однако, независимо от цели письма, хорошим тоном и часто юридическим требованием является наличие механизма отписки (Unsubscribe). Рассмотрим подробно, как технически реализовать этот функционал, какие существуют архитектурные подходы и как правильно настроить базу 1С для учета предпочтений клиентов.

Постановка задачи и варианты решений

Мы сталкиваемся с необходимостью отправлять письма должникам. Если клиент не хочет получать такие уведомления, у него должна быть возможность отказаться от них, нажав на ссылку в письме. Наша система 1С должна автоматически зафиксировать этот отказ, чтобы исключить клиента из будущих рассылок.

Проанализируем три основных способа реализации:

  1. Прямая обработка через HTTP-сервис 1С: 1С сама обрабатывает нажатие ссылки.
  2. Использование внешнего микросервиса: Промежуточный сервер собирает отказы, а 1С их забирает.
  3. Интеграция с профессиональными сервисами рассылок (ESP): Использование готовых API внешних систем.

Вариант 1: Реализация собственного HTTP-сервиса в 1С

Этот метод подходит, если база 1С опубликована на веб-сервере (Apache или IIS) и доступна из интернета. Суть метода заключается в том, что ссылка в письме ведет непосредственно на HTTP-сервис вашей базы данных.

Разберем алгоритм действий:

  1. В конфигурации создается объект HTTP-сервис.
  2. Настраивается шаблон URL, который будет принимать параметры, например, уникальный идентификатор клиента (GUID) или email.
  3. При переходе по ссылке выполняется код обработчика, который находит партнера и ставит отметку "Не отправлять письма".

Посмотрим на пример кода обработчика 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С мгновенно. Не нужны сторонние сервисы.

Недостатки: База должна быть опубликована наружу, что несет риски безопасности. Высокая нагрузка на базу при массовых переходах.

Вариант 2: Использование микросервиса-посредника

Более безопасный и масштабируемый подход — использование простого скрипта на внешнем хостинге (VPS). Это может быть микросервис на языке Go, PHP или Node.js. Давайте разберем, как это работает.

  1. В письме формируется ссылка, ведущая на ваш внешний сайт/скрипт, например: example.com/unsubscribe?email=client@mail.ru.
  2. Скрипт принимает GET-запрос, показывает пользователю красивую HTML-страницу "Вы отписались" и сохраняет данные (Email, дату, IP) в локальную базу данных (MySQL, PostgreSQL) или даже в текстовый файл (JSON/CSV).
  3. В 1С настраивается РегламентноеЗадание, которое раз в час обращается к этому микросервису и забирает список новых отписавшихся адресов.
  4. 1С обрабатывает полученный список и устанавливает блокировки рассылок в карточках контрагентов.

Такой подход изолирует вашу базу 1С от прямого доступа из интернета и снижает нагрузку на систему.

Вариант 3: Интеграция с сервисами рассылок (ESP)

Если вы планируете серьезную работу с рассылками, рекомендуется использовать специализированные сервисы (UniSender, SendPulse и др.) и готовые модули интеграции для 1С. В экосистеме 1С существуют решения, позволяющие синхронизировать сегменты клиентов.

Принцип работы:

  1. Вы выгружаете список должников (Email и Имя) из 1С в сервис рассылок через API.
  2. Сервис сам добавляет в письмо обязательную ссылку "Отписаться" и, что критически важно, технический заголовок List-Unsubscribe. Это позволяет почтовым клиентам (Gmail, Mail.ru) корректно отображать кнопку отписки в интерфейсе.
  3. Когда пользователь нажимает "Отписаться", сервис фиксирует это событие у себя.
  4. Через механизм Webhooks (вебхуки) сервис мгновенно отправляет уведомление обратно в вашу 1С (если у вас опубликован HTTP-сервис для приема хуков) или 1С периодически опрашивает API сервиса на предмет изменений статусов подписчиков.

Это наиболее надежный вариант, так как он защищает репутацию вашего домена и гарантирует правильную техническую обработку писем почтовыми провайдерами.

Юридические и технические нюансы

Рассмотрим важные аспекты, которые необходимо учитывать при настройке рассылок из 1С, чтобы ваши письма доходили до адресатов и не нарушали закон.

Транзакционные письма vs Реклама

В обсуждении справедливо замечено, что уведомление о задолженности — это исполнение договора, а не реклама. Согласно законодательству, вы обязаны уведомлять клиента о состоянии расчетов. Однако:

Настройка DNS-записей

Для того чтобы письма, отправленные непосредственно из 1С (через SMTP), не попадали в спам, необходимо настроить записи домена:

Хранение информации об отказе в 1С

Крайне не рекомендуется просто удалять Email из карточки клиента, как предлагалось в некоторых обсуждениях. Это приведет к потере контактной информации.

Вместо этого мы рекомендуем:

  1. Создать РегистрСведений "СтатусыEmailРассылок" или "ЧерныйСписокEmail".
  2. Измерения: Email (Строка) или Контрагент (Справочник).
  3. Ресурсы: ЗапретРассылки (Булево), Причина (Строка), ДатаИзменения (Дата).

Перед каждой отправкой писем ваша обработка должна выполнять запрос к этому регистру:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |    Контрагенты.Ссылка КАК Контрагент,
    |    Контрагенты.Email КАК Email
    |ИЗ
    |    Справочник.Контрагенты КАК Контрагенты
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЧерныйСписокEmail КАК ЧерныйСписок
    |        ПО Контрагенты.Email = ЧерныйСписок.Email
    |ГДЕ
    |    ЧерныйСписок.Email ЕСТЬ NULL
    |    И Контрагенты.Задолженность > 0";
    
// Результат запроса содержит только тех, кто не отписался

Таким образом, мы сохраняем контактные данные клиента, но уважаем его выбор не получать автоматические уведомления. Также хорошей практикой является создание страницы "Центр предпочтений", где клиент может выбрать, какие именно типы писем он хочет получать (например, "Акты сверок" — да, "Новости" — нет).

← На главную