При разработке механизмов оповещения пользователей в среде 1С:Предприятие 8.3 программисты часто сталкиваются с подсистемой уведомлений, входящей в состав Библиотеки стандартных подсистем (БСП). Одной из специфических проблем является возникновение ошибки «Не удалось определить имя хоста» (иногда сопровождаемой непонятной ссылкой) вместо вывода обычного текстового сообщения. В этой статье мы подробно проанализируем ситуацию, выясним причины такого поведения платформы и рассмотрим правильные способы решения проблемы.
Рассмотрим типовой сценарий. Программист пытается добавить новое уведомление в справочник УведомленияПрограммы, используя стандартный метод Добавить. Код может выглядеть следующим образом:
ТемаУведомления = "Оповещение о мероприятии";
ТекстУведомления = "Мипупу";
ТекстОповещения = " ";
ПояснениеОповещения = " ";
ВидУведомления = Перечисления.ВидыУведомленийПрограммы.Информация;
Пользователь = МассивУчастники[Счетчик].Участник;
ПредметУведомления = Объект.Ссылка;
Описание = "Текст описания";
Справочники.УведомленияПрограммы.Добавить(ТемаУведомления, ТекстУведомления, ТекстОповещения, ПояснениеОповещения, ВидУведомления, Пользователь, ПредметУведомления);
Проблема заключается в том, что в типовых формах БСП для отображения содержания уведомления используется элемент управления типа Поле HTML документа. Когда платформа пытается отобразить переданную строку ТекстУведомления, встроенный движок браузера (в современных версиях это WebKit) анализирует контент. Если текст кажется браузеру похожим на URL-адрес или содержит спецсимволы, которые интерпретируются как протоколы, система пытается разрешить это имя через DNS. Если «хост» не найден, пользователь видит модальное окно с ошибкой сети вместо ожидаемого текста.
Проанализируем решение, к которому пришел автор темы. Если уведомления в вашей конфигурации всегда должны быть текстовыми, можно отредактировать саму форму, в которой выводятся данные сообщения. Пошагово разберем этот процесс:
УведомленияПрограммы, отвечающую за просмотр сообщений.Описание (или аналогичный, отвечающий за вывод текста).Поле HTML документа на Поле надписи или Поле текстового документа.ПриЧтенииНаСервере) принудительно очищаем текст от возможных HTML-тегов, если они там присутствуют.Автор предложил использовать проверку, чтобы замена производилась только для определенных элементов, чтобы не нарушить логику работы всей системы. Однако стоит учитывать риск: многие системные уведомления БСП (обновления, патчи) приходят именно в формате HTML. Если вы измените вид поля на «Поле надписи», такие уведомления превратятся в нечитаемый набор тегов типа <div> или <a href...>.
Вместо того чтобы «ломать» типовую форму, правильнее будет подготовить передаваемый текст так, чтобы Поле HTML документа восприняло его корректно. Выясним, как это сделать программно. Самый простой способ — обернуть текст в базовые HTML-теги. Это даст понять браузеру, что перед ним контент страницы, а не адрес ссылки.
Пример доработки кода формирования уведомления:
// Обычный текст превращаем в простейшую HTML-страницу
ТекстДляВывода = "<html><body>" + ТекстУведомления + "</body></html>";
Справочники.УведомленияПрограммы.Добавить(
ТемаУведомления,
ТекстДляВывода, // Передаем подготовленный HTML
ТекстОповещения,
ПояснениеОповещения,
ВидУведомления,
Пользователь,
ПредметУведомления
);
Также рекомендуется использовать встроенные функции БСП для экранирования опасных символов, которые могут вызвать ошибки интерпретации:
// Использование функций общего назначения для очистки текста
БезопасныйТекст = ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыXML(ТекстУведомления);
ТекстУведомления = "<html><body><p>" + БезопасныйТекст + "</p></body></html>";
Разберем ситуацию, когда определенные слова (как «Мипупу» в примере автора) вызывают сбои. В экосистеме 1С иногда встречаются шутки про «зарезервированные слова», но техническая причина прозаичнее. В строке могут содержаться невидимые символы, либо сочетания букв, которые WebKit ошибочно принимает за относительный путь или схему запроса. Особенно часто это проявляется, если в строке есть двоеточия, слеши или символы амперсанда.
Если вы столкнулись с подобным, проверьте следующее:
&, <, >. Если да — их нужно заменить на соответствующие сущности (&, <, >).Подведем итог нашему анализу. Ошибка «Не удалось определить имя хоста» в уведомлениях 1С — это конфликт между текстовыми данными и способом их визуализации через HTML-движок.
Основные выводы для разработчика:
Поле HTML документа.<html><body>...</body></html> перед записью в уведомление.ИнформационныеТехнологииПоддержкаКлиент.ПодготовитьТекстДляВыводаВHTML (если ваша версия БСП это позволяет).Помните, что использование ДвоичныхДанных или Потоков для решения этой конкретной проблемы является избыточным и часто используется опытными коллегами как ироничный ответ на форумах. Простое соблюдение стандартов разметки HTML полностью устраняет данную ошибку.