Почему периодически падает рабочий процесс 1С при отправке писем по электронной почте?

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

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

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

Выясним причину аварийного завершения процесса rphost

Проблема связана со спецификой обработки объекта ФорматированныйДокумент и механизмами парсинга почтовых сообщений на стороне сервера 1С. Разберем по шагам, что происходит во время формирования письма:

  1. Пользователь отправляет печатную форму из программы, при этом к письму автоматически добавляется персональная подпись с форматированием (HTML).
  2. Если HTML-код подписи содержит вставленные изображения, сложную верстку или был ранее скопирован из внешних редакторов (например, Microsoft Outlook или Word), он может содержать нерасшифровываемые платформой теги, специфические CSS-стили или локальные пути.
  3. При вызове процедур генерации электронного письма и обработке форматированного текста серверный парсер платформы 1С пытается выполнить рекурсивный обход элементов документа.
  4. В контексте работы через веб-сервер, где обработка строгих HTML-структур выполняется исключительно на стороне сервера, парсер платформы входит в бесконечный цикл при попытке извлечь или преобразовать встроенную графику. В результате рабочий процесс rphost переполняет память и аварийно завершается с ошибкой доступа.

Способ 1. Очистка и переформирование HTML-подписи пользователя

Самое быстрое и эффективное решение, не требующее изменения конфигурации, заключается в очистке текста подписи от мусорных HTML-тегов и некорректно внедренных картинок.

  1. Откроем персональные настройки пользователя, в которых задана подпись для электронной почты.
  2. Скопируем текущий текст подписи и переведем его в простой текстовый формат (без форматирования) или очистим HTML-код через простой текстовый редактор.
  3. Удалим из подписи старые изображения, скопированные через буфер обмена из внешних программ.
  4. Сформируем подпись заново, добавив только необходимые теги оформления (например, <b>, <i>, <span>).
  5. Загрузим картинку повторно штатным средством программы или переведем подпись сначала в простой текст, а затем снова в HTML.

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

Способ 2. Корректное программное добавление изображений через Content-ID (cid)

Если подписи или почтовые сообщения формируются программно в коде конфигурации или расширения, рассмотрим правильный подход к работе с объектом ИнтернетПочтовоеСообщение. Не следует вставлять картинки непосредственно в HTML-код в виде бинарных данных формата Base64 или ссылаться на локальные файлы клиентского компьютера.

Разберем пример кода, показывающий, как корректно прикреплять картинки к письму с использованием идентификатора cid::


// Создаем почтовое сообщение
Письмо = Новый ИнтернетПочтовоеСообщение;
Письмо.Тема = "Печатная форма документа";

// Создаем вложение для картинки подписи
ИмяФайлаКартинки = ПолучитьИмяВременногоФайла("png");
ДвоичныеДанныеКартинки.Записать(ИмяФайлаКартинки);

КартинкаПодписи = Письмо.Вложения.Добавить(ИмяФайлаКартинки);
КартинкаПодписи.Идентификатор = "SignatureLogo"; // Указываем Content-ID

// Формируем HTML-текст письма с ссылкой на идентификатор вложения
ТекстHTML = "<html><body>";
ТекстHTML = ТекстHTML + "<p>Добрый день! Во вложении печатная форма.</p>";
ТекстHTML = ТекстHTML + "<p>С уважением,<br><img src=""cid:SignatureLogo""></p>";
ТекстHTML = ТекстHTML + "</body></html>";

Письмо.УстановитьТекст(ТекстHTML, ТипТекстаПочтовогоСообщения.HTML);

При таком подходе платформа не тратит ресурсы на конвертацию и рекурсивный обход внешних изображений внутри объекта ФорматированныйДокумент, что исключает падение процессов.

Способ 3. Передача двоичных данных через временное хранилище

При передаче файлов картинок с клиента на сервер перед формированием печатных форм и отправкой писем необходимо использовать временное хранилище. Попытка обратиться с сервера 1С к локальному файлу клиентского ПК при работе через веб-сервер вызывает сбой.

Посмотрим на пример правильного помещения данных во временное хранилище на клиенте и их обработки на сервере:


// Клиентский контекст
&НаКлиенте
Процедура ПодготовитьИОтправить()
    АдресХранилища = ПоместитьВоВременноеХранилище(ДвоичныеДанныеКартинки, УникальныйИдентификатор);
    ОтправитьПисьмоНаСервере(АдресХранилища);
КонецПроцедуры

// Серверный контекст
&НаСервере
Процедура ОтправитьПисьмоНаСервере(Знач АдресХранилища)
    ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресХранилища);
    // Дальнейшая обработка и формирование письма
КонецПроцедуры

Способ 4. Обновление версии платформы и изоляция отправки

Если проблема вызвана зафиксированной ошибкой платформы при обработке HTML-документов в конкретных релезах (например, в линейке 8.3.11), рекомендуется выполнить следующие системные шаги:

  1. Обновить платформу «1С:Предприятие» до актуального релиза, где исправлены ошибки работы с объектом ФорматированныйДокумент.
  2. Настроить выполнение отправки электронной почты через асинхронные фоновые задания (ФоновыеЗадания.Выполнить). В случае возникновения критической ошибки при обработке некорректного письма завершится только отдельное фоновое задание, а основной рабочий процесс rphost со всеми активными сеансами пользователей продолжит работать без сбоев.
← На главную