При разработке механизмов почтовых рассылок из 1С часто возникает соблазн отправить пользователю ссылку на локальный файл или файл в профиле пользователя, используя привычные системные переменные, такие как %appdata% или %temp%. Однако на практике такие ссылки оказываются нерабочими: они либо не открываются в почтовых клиентах (Outlook, Thunderbird), либо вызывают ошибки безопасности и навигации внутри самой платформы 1С. В этой статье мы подробно проанализируем, почему стандартный подход с HTML-ссылками на локальные ресурсы не работает, и рассмотрим корректные способы решения этой задачи.
Рассмотрим ситуацию, когда в тело письма вставляется следующий код:
<a href="%appdata%/data/file.txt">Файл тхт</a>
Первая и самая главная причина неудачи заключается в том, что переменные окружения (Environment Variables), такие как %appdata%, являются частью командной оболочки Windows (Shell). Когда вы вводите такой путь в проводнике или командной строке, оболочка "раскрывает" его в полный путь, например: C:\Users\Username\AppData\Roaming.
Однако почтовый клиент или браузер интерпретирует содержимое атрибута href как URI (Universal Resource Identifier). С точки зрения стандартов HTML, запись %appdata% не является известным протоколом (как http:// или file://). Программа пытается найти обработчик для протокола "%appdata%" и, закономерно, не находит его. Более того, даже если бы путь был полным, использование переменных внутри строки HTML-кода невозможно без предварительной обработки на стороне сервера или приложения, формирующего письмо.
Проанализируем поведение современных почтовых клиентов, в частности Microsoft Outlook. Даже если мы заменим переменные на абсолютный путь, используя правильный протокол локальных файлов:
<a href="file:///C:/Data/file.txt">Открыть файл</a>
Такая ссылка, скорее всего, всё равно не сработает. Это связано с политикой безопасности Zone Elevation. Почтовое сообщение рассматривается системой как объект из "Ненадежной зоны" (Интернет). В целях предотвращения вирусных атак почтовым клиентам запрещено инициировать открытие файлов из "Локальной зоны" компьютера. Если бы это было разрешено, злоумышленник мог бы прислать письмо, которое при клике запустит вредоносный скрипт или исполняемый файл, уже находящийся на вашем диске.
Когда мы пытаемся открыть подобное письмо внутри встроенного почтового клиента 1С или через поле HTML-документа, платформа выдает ошибки вида "неверно задана навигационная ссылка" или упоминает хранилище 1clib. Выясним причину этого поведения:
e1c:// для навигационных ссылок на объекты базы данных. При клике на любую ссылку в HTML-поле, 1С сначала пытается определить, не является ли это внутренней ссылкой.1clib.Самым надежным и кроссплатформенным способом передачи файла является его непосредственное вложение в письмо. Это гарантирует, что файл будет доступен пользователю независимо от его операционной системы (Windows, Linux, iOS) и наличия доступа к конкретным папкам на диске.
Разберем пример кода на языке 1С для добавления вложения к электронному письму:
// Создаем объект сообщения
Письмо = Новый ИнтернетПочтовоеСообщение;
Письмо.Тема = "Отправка текстового файла";
// Указываем путь к файлу на сервере или локально
ПутьКФайлу = "C:\Data\file.txt";
// Добавляем файл во вложения
ФайлВложение = Письмо.Вложения.Добавить(ПутьКФайлу);
ФайлВложение.Имя = "file.txt";
// Настройка текста письма
ТекстПисьма = "Здравствуйте! Необходимый файл находится во вложении.";
Письмо.Тексты.Добавить(ТекстПисьма, ТипТекстаПочтовогоСообщения.HTML);
Важный нюанс: Не пытайтесь отправлять файлы ярлыков (.lnk). Как правильно замечено в обсуждении, Outlook и большинство почтовых серверов блокируют файлы .lnk, .exe, .bat как потенциально опасные. Пользователь просто не увидит такое вложение.
Если файл слишком велик для пересылки или должен редактироваться в общем доступе, в корпоративной среде можно использовать UNC-пути. Ссылка должна указывать на сетевой ресурс, к которому у пользователя есть права доступа.
Пример оформления ссылки:
<a href="file://///server/share/folder/file.txt">Открыть файл из сетевой папки</a>
Обратите внимание на количество косых черт в протоколе file:///// — это специфическое требование для корректной интерпретации сетевого пути браузерами и Outlook. Однако помните, что даже в этом случае Outlook может выдать предупреждение о безопасности, которое пользователю придется подтвердить.
Рассмотрим наиболее современный и "правильный" с точки зрения веб-технологий подход. Если данные в текстовом файле не являются конфиденциальными (или защищены авторизацией), файл следует выгрузить на внутренний веб-сервер компании или в облачное хранилище.
Проанализируем преимущества этого метода:
https://files.company.com/report123.txt откроется на любом устройстве.Подводя итог, можно сказать: использование системных переменных Windows в HTML-коде письма — это архитектурная ошибка. Для обеспечения стабильной работы ваших механизмов оповещения рекомендуем придерживаться следующих правил:
%appdata% и другие переменные в ссылках href. Они не будут раскрыты почтовым клиентом.Вложения.Добавить() для небольших файлов, которые должны гарантированно дойти до адресата.http ссылок.Помните, что письмо должно быть самодостаточным и не зависеть от специфических настроек окружения конкретного пользователя, если только вы не контролируете всю инфраструктуру (включая регистрацию собственных протоколов в реестре Windows на всех рабочих станциях).