Одной из наиболее неприятных и в то же время загадочных проблем в работе платформы 1С:Предприятие является «Ошибка формата потока». Особенно часто она проявляется при использовании механизмов полнотекстового поиска (ППД). В этой статье мы разберем ситуацию, когда поиск по базе данных внезапно перестает работать, проанализируем программный код вызова поиска и выясним, как восстановить работоспособность системы, если стандартные методы не помогают.
Для начала проанализируем, как обычно реализуется поиск в типовых и кастомных конфигурациях. Рассмотрим фрагмент кода, в котором выполняется поиск по нескольким справочникам и регистрам с обработкой возможных исключений:
мОбластьПоиска = Новый Массив;
РазмерПорции = 200;
СписокПоиска = ПолнотекстовыйПоиск.СоздатьСписок(СтрокаПоиска, РазмерПорции);
мОбластьПоиска.Добавить(Метаданные.Справочники.Партнеры);
мОбластьПоиска.Добавить(Метаданные.Справочники.Контрагенты);
мОбластьПоиска.Добавить(Метаданные.Справочники.КонтактныеЛицаПартнеров);
мОбластьПоиска.Добавить(Метаданные.РегистрыСведений.сфпНомераТелефоновДляПоиска);
СписокПоиска.ОбластьПоиска = мОбластьПоиска;
Попытка
СписокПоиска.ПерваяЧасть();
Исключение
ИО = ИнформацияОбОшибке();
Если Прав(СтрокаПоиска, 1) = "*" Тогда
СписокПоиска = ПолнотекстовыйПоиск.СоздатьСписок("""" + Лев(СтрокаПоиска, СтрДлина(СтрокаПоиска) - 1) + """", РазмерПорции);
СписокПоиска.ОбластьПоиска = мОбластьПоиска;
СписокПоиска.ПерваяЧасть();
Иначе
ВызватьИсключение ПодробноеПредставлениеОшибки(ИО);
КонецЕсли;
КонецПопытки;
В данном примере мы видим классическую схему работы с объектом ПолнотекстовыйПоискСписок. Проблема заключается в том, что при вызове метода ПерваяЧасть() система обращается к файлам индекса. Если структура этих файлов повреждена, платформа не может корректно считать бинарные данные, что и приводит к возникновению «Ошибки формата потока».
Прежде чем переходить к активным действиям, давайте разберем, почему индекс может «сломаться». Рассмотрим основные факторы риска:
rphost или внезапная перезагрузка сервера, записываемый файл индекса может оказаться «обрезанным» или содержать некорректные заголовки.Важно понимать, что данные полнотекстового поиска не хранятся внутри базы SQL. Они располагаются в файловой системе сервера приложений. Именно поэтому восстановление базы из бэкапа (если бэкап только средствами СУБД) может не решить проблему, так как сервер будет продолжать обращаться к старым поврежденным файлам в каталоге кластера.
Рассмотрим последовательность действий для восстановления работоспособности поиска. Мы пойдем от простых методов к более радикальным.
Первым делом попробуем запустить стандартную процедуру обновления. Это можно сделать через консоль администратора (в разделе управления полнотекстовым поиском) или программно. Рассмотрим, как это выглядит в коде:
Попытка
РазрешитьСлияние = Истина;
Порциями = Истина;
ПолнотекстовыйПоиск.ОбновитьИндекс(РазрешитьСлияние, Порциями);
Сообщить("Индекс успешно обновлен");
Исключение
Сообщить("Ошибка при обновлении: " + ОписаниеОшибки());
КонецПопытки;
Если при выполнении метода ОбновитьИндекс вы снова получаете ошибку формата потока, это означает, что повреждена основная часть индекса и простое добавление новых данных не поможет. В этом случае переходим ко второму способу.
Этот метод является самым надежным. Мы полностью удаляем текущие данные поиска и заставляем систему создать их заново на основе актуальных данных из базы.
Порядок действий:
ПолнотекстовыйПоиск.ОчиститьИндекс(). Это удалит все текущие файлы индекса.ПолнотекстовыйПоиск.ИндексАктуален().Проанализируем ситуацию: если даже ОчиститьИндекс() не помогает, нам придется вмешаться в работу сервера на физическом уровне.
Если программные методы бессильны из-за критического повреждения структуры каталогов, выполним следующие шаги:
rphost.C:\Program Files\1cv8\srvinfo\reg_XXXX\index\ (где reg_XXXX — уникальный идентификатор вашего кластера).1Cv8FTxt и находится непосредственно в каталоге информационной базы.После этих манипуляций сервер создаст новую, чистую структуру файлов, и ошибка формата потока исчезнет.
Чтобы избежать повторения данной ситуации в будущем, проанализируем настройки сервера и внесем необходимые коррективы:
srvinfo (для сервера) или папку базы (для файлового варианта) в список исключений антивирусного сканера.Таким образом, мы выяснили, что «Ошибка формата потока» в контексте ППД — это следствие физического повреждения кэша поиска. Решение всегда заключается в полном перестроении этого кэша, а выбор метода зависит от степени повреждения и доступности программных инструментов управления платформой.