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

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

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

Концепция метода «отслеживающего пикселя»

Разберем, как это работает на практике. Идея заключается в том, чтобы включить в HTML-код письма невидимое изображение размером 1x1 пиксель. Источником этого изображения (атрибут src) будет выступать не статичный файл на сервере, а динамическая ссылка, ведущая на ваш HTTP-сервис в базе 1С. Когда почтовый клиент получателя загружает изображения, он делает запрос к вашей базе. В этот момент 1С фиксирует событие в реестре, а пользователю возвращает прозрачную картинку.

Шаг 1: Настройка HTTP-сервиса в 1С

Для начала нам необходимо создать точку входа, которая будет принимать запросы от почтовых клиентов. Проанализируем процесс создания HTTP-сервиса:

  1. В конфигураторе создадим новый объект HTTP-сервис с именем TrackingService.
  2. Укажем корневой URL, например, tracking.
  3. Создадим Шаблон URL с именем CheckOpen и путем /v1/{MessageID}, где {MessageID} — это уникальный идентификатор вашего письма в базе.
  4. Для этого шаблона добавим метод GET и назначим ему обработчик в модуле сервиса.

Рассмотрим пример кода для обработчика этого метода. Нам нужно не только зафиксировать событие, но и вернуть корректный ответ (картинку), чтобы почтовый клиент не выдавал ошибку «битого» изображения.


Функция CheckOpenGet(Запрос)
    
    // Получаем идентификатор из параметров URL
    ИдентификаторСообщения = Запрос.ПараметрыURL.Получить("MessageID");
    
    // Вызываем процедуру фиксации прочтения (в привилегированном модуле)
    ПочтовыеМеханизмы.ЗафиксироватьПрочтениеПисьма(ИдентификаторСообщения);
    
    // Формируем ответ в виде прозрачного пикселя GIF 1x1
    // Двоичные данные прозрачного GIF-пикселя (базовый набор байт)
    ПиксельBase64 = "R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7";
    ДвоичныеДанныеКартинки = BackgroundJobs.Base64Value(ПиксельBase64); // Или другой способ получения данных
    
    Ответ = Новый HTTPСервисОтвет(200);
    Ответ.Заголовки.Вставить("Content-Type", "image/gif");
    Ответ.Заголовки.Вставить("Cache-Control", "no-cache, no-store, must-revalidate");
    Ответ.УстановитьТелоИзДвоичныхДанных(ДвоичныеДанныеКартинки);
    
    Возврат Ответ;

КонецФункции

Шаг 2: Подготовка и отправка HTML-письма

Теперь выясним, как правильно сформировать текст письма. При отправке сообщения из 1С:УНФ нам нужно подменить обычный текст на HTML-структуру, содержащую нашу ссылку. Допустим, мы используем объект ИнтернетПочтовоеСообщение.

Посмотрим на пример формирования тела письма:


Процедура ПодготовитьПисьмоКОтправке(ПисьмоОбъект)
    
    УникальныйИдентификатор = Строка(ПисьмоОбъект.Ссылка.УникальныйИдентификатор());
    // Формируем адрес к нашему опубликованному HTTP-сервису
    БазовыйАдрес = "https://ваш-домен.ru/ваша_база/hs/tracking/v1/";
    ПолныйАдресПикселя = БазовыйАдрес + УникальныйИдентификатор;
    
    HTMLТекст = "<html><body>";
    HTMLТекст = HTMLТекст + "<p>Добрый день! Направляем вам документы.</p>";
    // Вставляем невидимый пиксель
    HTMLТекст = HTMLТекст + "<img src=""" + ПолныйАдресПикселя + """ width=""1"" height=""1"" style=""display:none;"" />";
    HTMLТекст = HTMLТекст + "</body></html>";
    
    ПисьмоОбъект.Текст = HTMLТекст;
    ПисьмоОбъект.ТипТекста = ТипТекстаПочтовогоСообщения.HTML;
    
КонецПроцедуры

Шаг 3: Публикация базы на веб-сервере

Чтобы метод заработал, ваша база 1С должна быть доступна из интернета. Это критически важный момент. Необходимо выполнить публикацию на веб-сервере (Apache или IIS). При публикации убедитесь, что флажок «Публиковать HTTP сервисы» установлен. Если ваша база находится за роутером, настройте проброс портов (Port Forwarding) и убедитесь, что используется защищенное соединение HTTPS, так как многие почтовые сервисы блокируют незащищенный контент (HTTP).

Ограничения и нюансы метода

Проанализируем ситуации, в которых данный метод может не сработать или дать ложный результат. Современные почтовые системы активно борются за приватность пользователей, поэтому стоит учитывать следующие факторы:

Альтернативный подход: Отслеживание переходов

Если точность «пикселя» кажется вам недостаточной, разберем альтернативу — ссылки-редиректы. Вместо того чтобы давать прямую ссылку на файл или сайт в тексте письма, мы пропускаем пользователя через наш HTTP-сервис.

Например, вместо src в теге img, мы используем href в теге a:

<a href="https://ваш-домен.ru/hs/tracking/click?id=123&url=https://site.ru">Скачать договор</a>

В этом случае переход по ссылке — это осознанное действие пользователя, которое почти на 100% гарантирует, что письмо не просто открыто, но и прочитано. В обработчике HTTP-сервиса вы сначала фиксируете переход в базе 1С, а затем возвращаете статус 302 (Found) с перенаправлением на целевой адрес url.

Резюме для реализации в 1С:УНФ

Для внедрения системы уведомлений в 1С:УНФ версии 1.6 или 3.0 выполните следующие действия: опубликуйте базу на веб-сервере, создайте HTTP-сервис для обработки GET-запросов и модифицируйте процедуру отправки почты, добавив в HTML-тело письма уникальную ссылку на пиксель. Несмотря на существующие ограничения в политиках безопасности почтовых систем, этот метод остается наиболее доступным и простым способом получения аналитики по исходящей корреспонденции непосредственно внутри вашей учетной системы.

← На главную