В процессе автоматизации бизнес-процессов часто возникает задача контроля коммуникаций. В частности, в 1С:Управление нашей фирмой (УНФ) пользователям важно знать, было ли открыто отправленное письмо клиентом или контрагентом. Стандартные средства почтовых протоколов не всегда дают надежный результат, поэтому мы разберем наиболее эффективный метод — использование отслеживающего пикселя (tracking pixel) через механизмы 1С.
Разберем, как это работает на практике. Идея заключается в том, чтобы включить в HTML-код письма невидимое изображение размером 1x1 пиксель. Источником этого изображения (атрибут src) будет выступать не статичный файл на сервере, а динамическая ссылка, ведущая на ваш HTTP-сервис в базе 1С. Когда почтовый клиент получателя загружает изображения, он делает запрос к вашей базе. В этот момент 1С фиксирует событие в реестре, а пользователю возвращает прозрачную картинку.
Для начала нам необходимо создать точку входа, которая будет принимать запросы от почтовых клиентов. Проанализируем процесс создания HTTP-сервиса:
HTTP-сервис с именем TrackingService.tracking.CheckOpen и путем /v1/{MessageID}, где {MessageID} — это уникальный идентификатор вашего письма в базе.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");
Ответ.УстановитьТелоИзДвоичныхДанных(ДвоичныеДанныеКартинки);
Возврат Ответ;
КонецФункции
Теперь выясним, как правильно сформировать текст письма. При отправке сообщения из 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;
КонецПроцедуры
Чтобы метод заработал, ваша база 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.6 или 3.0 выполните следующие действия: опубликуйте базу на веб-сервере, создайте HTTP-сервис для обработки GET-запросов и модифицируйте процедуру отправки почты, добавив в HTML-тело письма уникальную ссылку на пиксель. Несмотря на существующие ограничения в политиках безопасности почтовых систем, этот метод остается наиболее доступным и простым способом получения аналитики по исходящей корреспонденции непосредственно внутри вашей учетной системы.