Разберем ситуацию, с которой часто сталкиваются разработчики при обновлении платформы 1С или при переносе баз на новые серверы (например, при перепубликации веб-сервиса на IIS). При попытке обработать HTML-текст, например, при работе со встроенным почтовым клиентом или при чтении разметки, система выдает ошибку: «Метод объекта не обнаружен (Tags)».
Проанализируем типичный пример кода, который раньше работал исправно, а теперь вызывает исключительную ситуацию (с кодом 0x800a01b6):
НовыйКом = Новый COMОбъект("HtmlFile");
КоллекцияТегов = НовыйКом.all.Tags("BODY"); // Именно на этой строке возникает ошибка
Посмотрим на причины такого поведения платформы и разберем по шагам, как правильно адаптировать ваш код, чтобы он работал стабильно и без сбоев на любых современных версиях 1С.
Рассмотрим подробнее масштабные архитектурные изменения, которые произошли в платформе 1С:Предприятие. Начиная с версии платформы 8.3.14, компания 1С приняла решение полностью отказаться от использования системного браузера Internet Explorer и его COM-объектов для рендеринга и обработки HTML-документов в клиентских приложениях для Windows.
Вместо устаревшего IE платформа стала использовать встроенную современную библиотеку WebKit (этот же движок применяется в браузерах Google Chrome и Apple Safari). Из-за этого перехода изменилась сама суть работы с HTML:
Документ у поля HTML-документа поменяло свой тип. Раньше это был COMОбъект, а теперь это ВнешнийОбъект.all.tags() являются проприетарными, они были придуманы корпорацией Microsoft исключительно для Internet Explorer.all.tags(), именно поэтому платформа сообщает, что метод объекта не обнаружен.Кроме того, если вы используете прямое создание COMОбъект("HtmlFile"), вы обращаетесь к библиотеке mshtml.dll, встроенной в Windows. Ее работоспособность напрямую зависит от настроек безопасности операционной системы, прав доступа пользователей к веткам реестра и наличия самого Internet Explorer. Если IE удален из компонентов Windows (как советуют некоторые пользователи на форумах), COM-объект просто перестанет корректно создаваться.
Проанализируем ситуацию с точки зрения современного программирования. Если вы сопровождаете свои или чужие (legacy) конфигурации, правильным путем будет отказ от использования специфичных методов IE и переписывание логики на современные веб-стандарты.
Разберем конкретные примеры замены устаревшего кода:
1. Получение тела документа (тег BODY)
Вместо обращения через коллекцию всех тегов, используйте прямое свойство документа:
// УСТАРЕВШИЙ ВАРИАНТ (вызовет ошибку в 8.3.14+):
Тело = Элементы.ПолеHTMLДокумента.Документ.all.tags("BODY");
// ПРАВИЛЬНЫЙ КРОССПЛАТФОРМЕННЫЙ ВАРИАНТ:
Тело = Элементы.ПолеHTMLДокумента.Документ.body;
2. Получение текста страницы без HTML-разметки
Если ваша задача — просто извлечь текстовое содержимое (например, при чтении писем), используйте свойство innerText:
ТекстПисьма = Элементы.ПолеHTMLДокумента.Документ.body.innerText;
// или
ТекстПисьма = Элементы.ПолеHTMLДокумента.Документ.documentElement.innerText;
3. Поиск изображений и работа с коллекциями
Если вам нужно получить список всех картинок на странице, откажитесь от поиска тегов «IMG». Используйте встроенную коллекцию изображений или стандартный метод W3C DOM:
// УСТАРЕВШИЙ ВАРИАНТ:
Картинки = Элементы.ПолеHTMLДокумента.Документ.all.tags("IMG");
// ПРАВИЛЬНЫЙ ВАРИАНТ 1 (использование готовой коллекции):
Картинки = Элементы.ПолеHTMLДокумента.Документ.images;
// ПРАВИЛЬНЫЙ ВАРИАНТ 2 (стандартный поиск элементов по имени тега):
Картинки = Элементы.ПолеHTMLДокумента.Документ.getElementsByTagName("img");
Аналогично можно работать и с формами, используя Документ.forms. Метод getElementsByTagName() является универсальным и будет без ошибок работать как на новых версиях 1С (на движке WebKit), так и на старых.
Если ошибка возникает именно на строке Новый COMОбъект("HtmlFile"), и у вас нет возможности быстро переписать внешнюю компоненту или закрытый модуль конфигурации, проанализируем настройки вашей ОС.
Убедитесь, что в системе (особенно если это Windows 7 или серверные ОС старых поколений) не ограничены права на работу с компонентами Internet Explorer. Если вы меняли безопасность системного диска, ограничивали права групп пользователей или удаляли Internet Explorer через панель управления — верните эти настройки в исходное состояние. COM-объектам требуется доступ к системной библиотеке mshtml.dll.
Рассмотрим исключительный случай. Если обсуждаемая функция критически важна для бизнес-процессов (например, это сложное и весьма немолодое легаси-решение для парсинга документов), а ресурсов на рефакторинг кода сейчас нет, единственным быстрым решением может стать временный возврат на старую версию платформы.
Как мы уже выяснили, переход на WebKit состоялся в версии 8.3.14. Следовательно, понижение версии платформы до 8.3.13 или ниже (например, на стабильную ветку 8.3.6.2299, как отмечали разработчики на форуме) вернет старую методологию работы с HTML-разметкой через движок Internet Explorer.
Важно: Помните, что использование старых версий платформы 1С лишает вас актуальных обновлений безопасности, новых возможностей языка и оптимизации производительности. Мы настоятельно рекомендуем использовать этот метод только как временную меру до завершения адаптации программного кода по инструкциям из первого решения.