Как исправить ошибку формата потока при работе с полнотекстовым поиском в 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Одной из наиболее неприятных и в то же время загадочных проблем в работе платформы 1С:Предприятие является «Ошибка формата потока». Особенно часто она проявляется при использовании механизмов полнотекстового поиска (ППД). В этой статье мы разберем ситуацию, когда поиск по базе данных внезапно перестает работать, проанализируем программный код вызова поиска и выясним, как восстановить работоспособность системы, если стандартные методы не помогают.

Разбор программной реализации поиска

Для начала проанализируем, как обычно реализуется поиск в типовых и кастомных конфигурациях. Рассмотрим фрагмент кода, в котором выполняется поиск по нескольким справочникам и регистрам с обработкой возможных исключений:


мОбластьПоиска = Новый Массив;
РазмерПорции = 200;
СписокПоиска = ПолнотекстовыйПоиск.СоздатьСписок(СтрокаПоиска, РазмерПорции);

мОбластьПоиска.Добавить(Метаданные.Справочники.Партнеры);
мОбластьПоиска.Добавить(Метаданные.Справочники.Контрагенты);
мОбластьПоиска.Добавить(Метаданные.Справочники.КонтактныеЛицаПартнеров);
мОбластьПоиска.Добавить(Метаданные.РегистрыСведений.сфпНомераТелефоновДляПоиска);

СписокПоиска.ОбластьПоиска = мОбластьПоиска;

Попытка
    СписокПоиска.ПерваяЧасть();
Исключение
    ИО = ИнформацияОбОшибке();
    Если Прав(СтрокаПоиска, 1) = "*" Тогда
        СписокПоиска = ПолнотекстовыйПоиск.СоздатьСписок("""" + Лев(СтрокаПоиска, СтрДлина(СтрокаПоиска) - 1) + """", РазмерПорции);
        СписокПоиска.ОбластьПоиска = мОбластьПоиска;
        СписокПоиска.ПерваяЧасть();
    Иначе
        ВызватьИсключение ПодробноеПредставлениеОшибки(ИО);
    КонецЕсли;
КонецПопытки;

В данном примере мы видим классическую схему работы с объектом ПолнотекстовыйПоискСписок. Проблема заключается в том, что при вызове метода ПерваяЧасть() система обращается к файлам индекса. Если структура этих файлов повреждена, платформа не может корректно считать бинарные данные, что и приводит к возникновению «Ошибки формата потока».

Выясняем причины возникновения ошибки

Прежде чем переходить к активным действиям, давайте разберем, почему индекс может «сломаться». Рассмотрим основные факторы риска:

  1. Аварийное завершение процессов: Если во время выполнения регламентного задания по обновлению или слиянию индекса произошел сбой процесса rphost или внезапная перезагрузка сервера, записываемый файл индекса может оказаться «обрезанным» или содержать некорректные заголовки.
  2. Недостаток свободного места на диске: Процесс слияния индексов требует значительного объема временной памяти и места на носителе. Если в момент операции место закончилось, структура индекса будет нарушена.
  3. Действия антивирусного ПО: Файлы индекса представляют собой набор бинарных данных, которые постоянно меняются. Если антивирус заблокирует файл для сканирования в момент записи сервером 1С, это гарантированно приведет к ошибке потока.
  4. Сбои дисковой подсистемы: Битые сектора или ошибки кэширования контроллера RAID также могут стать причиной повреждения данных кластера.

Важно понимать, что данные полнотекстового поиска не хранятся внутри базы SQL. Они располагаются в файловой системе сервера приложений. Именно поэтому восстановление базы из бэкапа (если бэкап только средствами СУБД) может не решить проблему, так как сервер будет продолжать обращаться к старым поврежденным файлам в каталоге кластера.

Пошаговое решение проблемы

Рассмотрим последовательность действий для восстановления работоспособности поиска. Мы пойдем от простых методов к более радикальным.

Способ 1. Обновление индекса программными средствами

Первым делом попробуем запустить стандартную процедуру обновления. Это можно сделать через консоль администратора (в разделе управления полнотекстовым поиском) или программно. Рассмотрим, как это выглядит в коде:


Попытка
    РазрешитьСлияние = Истина;
    Порциями = Истина;
    ПолнотекстовыйПоиск.ОбновитьИндекс(РазрешитьСлияние, Порциями);
    Сообщить("Индекс успешно обновлен");
Исключение
    Сообщить("Ошибка при обновлении: " + ОписаниеОшибки());
КонецПопытки;

Если при выполнении метода ОбновитьИндекс вы снова получаете ошибку формата потока, это означает, что повреждена основная часть индекса и простое добавление новых данных не поможет. В этом случае переходим ко второму способу.

Способ 2. Полная очистка и пересоздание индекса

Этот метод является самым надежным. Мы полностью удаляем текущие данные поиска и заставляем систему создать их заново на основе актуальных данных из базы.

Порядок действий:

  1. Вызовем метод ПолнотекстовыйПоиск.ОчиститьИндекс(). Это удалит все текущие файлы индекса.
  2. Запустим полное обновление индекса. Учтите, что для больших баз этот процесс может занять несколько часов. В течение этого времени поиск работать не будет или будет выдавать неполные результаты.
  3. Проверим статус с помощью ПолнотекстовыйПоиск.ИндексАктуален().

Проанализируем ситуацию: если даже ОчиститьИндекс() не помогает, нам придется вмешаться в работу сервера на физическом уровне.

Способ 3. «Жесткий» сброс через удаление файлов

Если программные методы бессильны из-за критического повреждения структуры каталогов, выполним следующие шаги:

  1. Остановим службу сервера 1С:Предприятие. Это критически важно, так как файлы индекса могут быть заняты процессом rphost.
  2. Перейдем в каталог данных кластера. Обычно он находится по пути: C:\Program Files\1cv8\srvinfo\reg_XXXX\index\ (где reg_XXXX — уникальный идентификатор вашего кластера).
  3. В случае файловой базы папка с индексом называется 1Cv8FTxt и находится непосредственно в каталоге информационной базы.
  4. Полностью удалим содержимое этой папки.
  5. Запустим службу сервера 1С.
  6. Зайдем в информационную базу и запустим процесс обновления индекса через регламентные задания или вручную.

После этих манипуляций сервер создаст новую, чистую структуру файлов, и ошибка формата потока исчезнет.

Рекомендации по профилактике

Чтобы избежать повторения данной ситуации в будущем, проанализируем настройки сервера и внесем необходимые коррективы:

Таким образом, мы выяснили, что «Ошибка формата потока» в контексте ППД — это следствие физического повреждения кэша поиска. Решение всегда заключается в полном перестроении этого кэша, а выбор метода зависит от степени повреждения и доступности программных инструментов управления платформой.

← На главную