Рассмотрим распространенную проблему, с которой можно столкнуться при эксплуатации конфигурации «Управление торговлей» (редакция 11) после обновления платформы «1С:Предприятие 8.3». В процессе работы пользователи тонкого клиента, подключенные к информационной базе через веб-сервер (Apache или IIS), отправляют печатные формы по электронной почте, и в этот момент рабочий процесс сервера rphost внезапно завершается аварийно. При этом при прямом подключении к серверу 1С (минуя веб-сервер) сбой может не воспроизводиться.
Проанализируем детально, почему возникает эта ошибка, где скрывается источник сбоя и как его устранить.
Проблема связана со спецификой обработки объекта ФорматированныйДокумент и механизмами парсинга почтовых сообщений на стороне сервера 1С. Разберем по шагам, что происходит во время формирования письма:
rphost переполняет память и аварийно завершается с ошибкой доступа.Самое быстрое и эффективное решение, не требующее изменения конфигурации, заключается в очистке текста подписи от мусорных HTML-тегов и некорректно внедренных картинок.
<b>, <i>, <span>).После этой процедуры встроенный парсер прекращает зацикливаться на некорректных элементах разметки, и отправка сообщений начинает работать стабильно.
Если подписи или почтовые сообщения формируются программно в коде конфигурации или расширения, рассмотрим правильный подход к работе с объектом ИнтернетПочтовоеСообщение. Не следует вставлять картинки непосредственно в 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);
При таком подходе платформа не тратит ресурсы на конвертацию и рекурсивный обход внешних изображений внутри объекта ФорматированныйДокумент, что исключает падение процессов.
При передаче файлов картинок с клиента на сервер перед формированием печатных форм и отправкой писем необходимо использовать временное хранилище. Попытка обратиться с сервера 1С к локальному файлу клиентского ПК при работе через веб-сервер вызывает сбой.
Посмотрим на пример правильного помещения данных во временное хранилище на клиенте и их обработки на сервере:
// Клиентский контекст
&НаКлиенте
Процедура ПодготовитьИОтправить()
АдресХранилища = ПоместитьВоВременноеХранилище(ДвоичныеДанныеКартинки, УникальныйИдентификатор);
ОтправитьПисьмоНаСервере(АдресХранилища);
КонецПроцедуры
// Серверный контекст
&НаСервере
Процедура ОтправитьПисьмоНаСервере(Знач АдресХранилища)
ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресХранилища);
// Дальнейшая обработка и формирование письма
КонецПроцедуры
Если проблема вызвана зафиксированной ошибкой платформы при обработке HTML-документов в конкретных релезах (например, в линейке 8.3.11), рекомендуется выполнить следующие системные шаги:
ФорматированныйДокумент.ФоновыеЗадания.Выполнить). В случае возникновения критической ошибки при обработке некорректного письма завершится только отдельное фоновое задание, а основной рабочий процесс rphost со всеми активными сеансами пользователей продолжит работать без сбоев.