При обновлении платформы 1С:Предприятие с версий 8.3.12–8.3.13 на более современные (начиная с 8.3.14, 8.3.15 и выше) многие пользователи и администраторы сталкиваются с неприятной проблемой: перестает работать полнотекстовый поиск. Вместо привычного списка результатов система выдает ошибку преобразования типа или просто перестает реагировать на запросы. Особенно часто это проявляется в конфигурациях на «обычных формах», таких как Бухгалтерия предприятия 2.0, УПП 1.3 или Конвертация данных 2.1.
В этой статье мы подробно разберем, почему возникает эта ошибка, проанализируем технические изменения в платформе и рассмотрим несколько способов решения проблемы — от временных «костылей» до полноценной правки программного кода.
Для начала проанализируем ситуацию с технической точки зрения. Главная причина кроется в глобальном изменении архитектуры платформы. До версии 8.3.14 1С:Предприятие использовало для отображения HTML-контента (справка, поиск, почта) механизмы операционной системы Windows, а именно движок Internet Explorer (MSHTML). Однако, начиная с версии 8.3.14, компания 1С начала поэтапный переход на кроссплатформенный движок WebKit (аналогичный тому, что используется в Chrome и Safari).
В старых конфигурациях логика обработки результатов поиска была завязана на специфические свойства объектов Internet Explorer. Одним из таких свойств является nameProp. Программисты 1С использовали его для получения идентификатора или имени объекта из ссылки HTML-страницы. В новом движке WebKit свойство nameProp отсутствует. В результате при обращении к нему система получает Неопределено, а последующая попытка преобразовать это в число командой Число(htmlElement.nameProp) закономерно вызывает аварийное завершение работы модуля.
Рассмотрим самый быстрый, но не всегда предпочтительный способ. Если у вас нет возможности или навыков для правки конфигурации, самым простым выходом будет возврат на стабильную версию платформы. Для конфигураций на обычных формах (БП 2.0) наиболее подходящими считаются версии ветки 8.3.12 или 8.3.14 (последние релизы).
Если ваша база файловая, достаточно в параметрах запуска в поле «Версия 1С:Предприятия» указать конкретный номер версии, например, 8.3.12.1924. Для серверного варианта процедура сложнее, так как потребуется переустановка службы сервера 1С на всех рабочих серверах кластера. Важно помнить: работа на старой платформе может ограничить использование новых функций и механизмов безопасности, поэтому этот вариант стоит рассматривать как временный.
Если же вам необходимо работать на актуальной версии платформы (например, 8.3.15, 8.3.16 или выше), придется внести изменения в программный код. Нам нужно заменить обращение к несуществующему свойству nameProp на универсальный способ получения данных. Разберем по шагам, как это реализовать.
Найдите в конфигурации общую обработку или форму, отвечающую за результаты полнотекстового поиска (обычно это обработка ПолнотекстовыйПоискДанных). Найдите строку, где происходит ошибка, — она будет выглядеть примерно так:
// Старый ошибочный код
номерВСписке = Число(htmlElement.nameProp);
Проанализируем предложенный экспертами вариант замены. Мы можем извлечь нужный номер из атрибута href или outerHTML элемента. Вот пример надежного исправления, который будет работать на новом движке:
частьURL = htmlElement.href;
Позиция = Найти(частьURL, "/");
Если Позиция <> 0 Тогда
частьURL = Прав(частьURL, СтрДлина(частьURL)-Позиция);
НомерВСписке = Число(частьURL);
Иначе
// Если структура URL иная, пробуем получить через ID или Сообщить об ошибке
Сообщить("Не удалось корректно обработать ссылку поиска.");
Возврат;
КонецЕсли;
Существует также более компактный, но «черновой» вариант (так называемый костыль), который использует разбор строки HTML-разметки:
// Вариант с разбором outerHTML
номерВСписке = Число(ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(Прав(htmlElement.outerHTML, стрдлина(htmlElement.outerHTML) - стрНайти(htmlElement.outerHTML, "sel_num=""") - 8), """").Получить(0));
Обратите внимание: использование функции РазложитьСтрокуВМассивПодстрок предполагает наличие этой функции в общем модуле ОбщегоНазначения. Если в вашей конфигурации её нет, используйте встроенную функцию СтрРазделить().
Иногда даже после исправления кода поиск продолжает выдавать пустые результаты или работать некорректно. В клиент-серверном варианте часто наблюдается ситуация, когда индекс «зависает». В этом случае стандартная кнопка «Очистить индекс» в управлении поиском может не сработать. Рассмотрим радикальный метод очистки:
C:\Program Files\1cv8\srvinfo\reg_1541\<UID базы>.Операции -> Управление полнотекстовым поиском запустите полное обновление индекса.Проанализируем ситуацию: после удаления файлов серверу потребуется время (иногда значительное, до нескольких часов), чтобы проиндексировать все документы и справочники заново. В это время поиск может работать частично или не работать вовсе.
Проблема со сменой движка затронула и популярную техническую конфигурацию КД 2.1. Поскольку поставщик редко выпускает обновления для этой конфигурации, пользователям приходится вносить правки самостоятельно. Если вы столкнулись с ошибкой при открытии ссылок в интерфейсе КД, используйте следующий алгоритм замены кода:
// Исправление для КД 2.1
частьURL = htmlElement.href;
Позиция = Найти(частьURL, "/");
Если Позиция <> 0 Тогда
частьURL = Прав(частьURL, СтрДлина(частьURL) - Позиция);
НомерВСписке = Число(частьURL);
Иначе
// Сообщение для диагностики
Сообщить("Ошибка WebKit: элемент не содержит ожидаемого пути.");
КонецЕсли;
Это позволит вам продолжать использовать привычный инструментарий на современных версиях платформы без необходимости постоянного переключения между версиями 1С.
Подведем итог нашему разбору. Ошибка полнотекстового поиска — это не поломка самой программы, а следствие эволюции платформы 1С. Чтобы ваша система работала стабильно, мы рекомендуем:
nameProp.nameProp на парсинг атрибута href.Помните, что работа с объектами HTML в 1С всегда требует осторожности при переходе между мажорными версиями платформы. Надеемся, что предложенные методы помогут вам быстро восстановить работоспособность поиска!