Почему при отправке печатной формы из 1С по почте пропадает изображение печати и подписи?

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

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

Разберем причину возникновения проблемы

Проанализируем ситуацию: когда мы сохраняем ТабличныйДокумент в формате HTML, платформа 1С ведет себя стандартным для веб-браузеров образом. Она создает файл разметки, а все картинки, которые были в документе (логотипы, печати), выгружает в отдельную папку во временной директории пользователя или сохраняет их рядом с основным файлом. В самом коде HTML при этом прописываются пути к этим изображениям.

Основная сложность заключается в том, что в сформированном письме ссылки на картинки выглядят примерно так: src="C:\Users\Admin\AppData\Local\Temp\v8_1234_56.png". Естественно, когда письмо уходит внешнему получателю, его почтовый клиент пытается найти картинку по этому адресу на своем компьютере и, не обнаружив её, отображает пустое место. Выясним, какими способами можно «заставить» почтовый клиент увидеть графику.

Способ 1: Использование связанных ресурсов (CID)

Это классический метод формирования электронных писем с внедренными изображениями. Суть его заключается в том, что картинка прикрепляется к письму как вложение, но ей присваивается уникальный идентификатор (Content-ID). В тексте письма мы ссылаемся не на файл на диске, а на этот идентификатор.

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


// 1. Сохраняем табличный документ в HTML
ПутьКФайлуHTML = КаталогВременныхФайлов() + "invoice.html";
ТабДок.Записать(ПутьКФайлуHTML, ТипФайлаТабличногоДокумента.HTML);

// 2. Создаем почтовое сообщение
Сообщение = Новый ПочтовоеСообщение;
Сообщение.Тема = "Счет на оплату";

// 3. Читаем текст HTML и ищем в нем пути к картинкам
ТекстHTML = Новый ЧтениеТекста(ПутьКФайлуHTML);
СодержимоеHTML = ТекстHTML.Прочитать();
ТекстHTML.Закрыть();

// Здесь должна быть логика поиска файлов картинок в папке, 
// созданной 1С, и добавление их во вложения
КартинкаВложение = Сообщение.Вложения.Добавить(ПутьККартинке);
КартинкаВложение.Идентификатор = "StampImage1"; // Это и есть CID

// Заменяем локальный путь в HTML на ссылку cid
СодержимоеHTML = СтрЗаменить(СодержимоеHTML, "v8_1234_56.png", "cid:StampImage1");
Сообщение.Текст = СодержимоеHTML;
Сообщение.ТипТекста = ТипТекстаПочтовогоСообщения.HTML;

Важный нюанс: при сохранении в HTML 1С может генерировать имена файлов картинок автоматически. Программисту необходимо написать обход всех файлов в созданной временной папке и программно заменить ссылки в теле HTML.

Способ 2: Преобразование изображений в формат Base64

Это более современный и надежный способ для небольших изображений, таких как печати и подписи. Мы проанализируем возможность вставки кода картинки прямо в текст письма. В этом случае изображение становится частью строки HTML, и нам не нужно заботиться о дополнительных вложениях.

Разберем по шагам, как это реализовать:

  1. Формируем печатную форму.
  2. Сохраняем её в HTML.
  3. Программно находим в тексте теги <img src="...">.
  4. Считываем файл картинки с диска, переводим его в Base64.
  5. Заменяем путь к файлу на строку данных.

Пример кода для преобразования:


Функция ПолучитьBase64ИзКартинки(ПутьКФайлу)
    ДвоичныеДанные = Новый ДвоичныеДанные(ПутьКФайлу);
    СтрокаBase64 = Base64Строка(ДвоичныеДанные);
    // Убираем переносы строк, которые может добавить Base64Строка
    СтрокаBase64 = СтрЗаменить(СтрокаBase64, Символы.ПС, "");
    СтрокаBase64 = СтрЗаменить(СтрокаBase64, Символы.ВК, "");
    Возврат "data:image/png;base64," + СтрокаBase64;
КонецФункции

Затем в основном тексте письма мы выполняем замену: src="имя_файла.png" заменяется на результат нашей функции. В итоге в письме будет содержаться огромная строка символов, которую любой современный почтовый клиент (Outlook, Gmail, Mail.ru) интерпретирует как картинку.

Проблема удаления временных файлов

Часто в коде конфигураций встречается конструкция, когда после вызова метода Отправить() сразу следует команда УдалитьФайлы(). Посмотрим на ситуацию со стороны системы: метод отправки может работать асинхронно или помещать письмо в очередь. Если мы удалим временную папку с картинками до того, как почтовый агент фактически прочитает их для формирования пакета данных, письмо уйдет без графики.

Рекомендация: не спешите удалять временные файлы сразу. Лучше очищать КаталогВременныхФайлов() при старте сеанса или использовать регламентные задания для очистки старых временных данных. Также убедитесь, что у пользователя, под которым работает сервер 1С (если база клиент-серверная), есть права на чтение и запись в папку временных файлов.

Особенности работы с макетом

Проанализируем еще один момент, упомянутый в обсуждении. Если вы просто добавили картинку в макет «руками» (через меню «Вставить рисунок»), платформа 1С при конвертации может некорректно обработать её прозрачность или формат. Попробуем программный вывод изображения в область макета:


Область = Макет.ПолучитьОбласть("Печать");
КартинкаОбъект = Новый Картинка("C:\Signatures\Seal.png");
// В макете должен быть пустой объект "Рисунок" с именем "ПечатьОрг"
Область.Рисунки.ПечатьОрг.Картинка = КартинкаОбъект;
ТабДок.Вывести(Область);

Такой подход гарантирует, что объект Картинка будет инициализирован непосредственно перед формированием документа, что повышает шансы на его успешную выгрузку в HTML.

Резюме

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

  1. Использовать тип файла HTML5 при сохранении табличного документа, так как он лучше поддерживает современные стандарты графики.
  2. Внедрять изображения в тело письма через Base64 или использовать CID для привязки вложений к тегам img.
  3. Контролировать время жизни временных файлов, чтобы они не удалялись до завершения процесса отправки.
  4. Проверять пути к картинкам в результирующем HTML-коде — они не должны содержать локальных дисков (C:\, D:\).

Соблюдение этих правил позволит вашим клиентам получать корректно оформленные документы со всеми необходимыми печатями и подписями прямо в теле письма.

← На главную