Как исправить ошибку формата потока при открытии консоли регламентных заданий в 1С?

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

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

Разберем основные причины возникновения этой проблемы и пошаговые методы её локализации и устранения.

Причины возникновения ошибки

Проанализируем природу появления ошибки формата потока при обращении к коллекции регламентных задач:

  1. Повреждение системного реквизита ПоследнееЗадание: в некоторых версиях платформы 1С при аварийном завершении фонового процесса внутренний идентификатор фонового задания записывается с нарушением структуры сериализации.
  2. «Осиротевшие» регламентные задания: если в ходе обновления конфигурации регламентное задание было переименовано или удалено из дерева метаданных, а его экземпляр остался в базе, попытка прочитать свойство Метаданные приводит к сбою платформы из-за отсутствия объекта в конфигурации.
  3. Повреждение сериализации параметров или полей: запись некорректных данных (например, случайная вставка огромного фрагмента текста или таблицы из Excel в поле комментария либо сбой сериализации XDTO при передаче составных типов в параметры).
  4. Нарушение целостности кэша сеансовых данных: повреждение каталогов snccntx в серверном кластере.

Способ 1. Программный поиск и удаление поврежденного задания через обработку

Так как коллекция содержит поврежденный элемент, стандартный перебор в цикле Для Каждого прерывается на сбойном объекте. Чтобы не выполнять длительное тестирование и исправление всей базы данных в рабочее время, локализуем и удалим испорченную запись программно.

Создадим внешнюю обработку и выполним точечный перебор заданий по метаданным с перехватом исключений:


Отбор = Новый Структура;
ВсеМетаданные = Метаданные.РегламентныеЗадания;

Для Каждого ОбъектыМетаданных Из ВсеМетаданные Цикл
    Отбор.Вставить("Метаданные", ОбъектыМетаданных);
    
    Попытка
        НайденныеЗадания = РегламентныеЗадания.ПолучитьРегламентныеЗадания(Отбор);
        Для Каждого ТекЗадание Из НайденныеЗадания Цикл
            Попытка
                // Проверяем обращение к ключевым свойствам
                Имя = ТекЗадание.Метаданные.Синоним;
                Идентификатор = ТекЗадание.УникальныйИдентификатор;
                ПослЗадание = ТекЗадание.ПоследнееЗадание;
            Исключение
                Сообщить("Найдено поврежденное задание: " + ОбъектыМетаданных.Имя + ". Ошибка: " + ОписаниеОшибки());
                // Удаляем поврежденный экземпляр
                ТекЗадание.Удалить();
                Сообщить("Поврежденное задание успешно удалено.");
            КонецПопытки;
        КонецЦикла;
    Исключение
        Сообщить("Сбой при получении заданий для метаданных: " + ОбъектыМетаданных.Имя);
    КонецПопытки;
КонецЦикла;

Если сбой происходит на уровне обращения к общему массиву по индексам, применим пошаговый перебор массива по индексам:


СписокЗаданий = РегламентныеЗадания.ПолучитьРегламентныеЗадания();
Всего = СписокЗаданий.Количество();

Для Индекс = 0 По Всего - 1 Цикл
    Попытка
        ТекЗадание = СписокЗаданий[Индекс];
        Имя = ТекЗадание.Метаданные.Имя;
    Исключение
        Сообщить("Ошибка на элементе с индексом: " + Индекс);
        Попытка
            СписокЗаданий[Индекс].Удалить();
            Сообщить("Элемент удален.");
        Исключение
            Сообщить("Не удалось удалить элемент программно: " + ОписаниеОшибки());
        КонецПопытки;
    КонецПопытки;
КонецЦикла;

Способ 2. Восстановление при удалении задания из дерева метаданных

Если регламентное задание перестало открываться после некорректного обновления базы (или динамического обновления):

  1. Выясним имя удаленного объекта метаданных из технологического журнала или журнала регистрации.
  2. В дереве метаданных конфигуратора добавим новое регламентное задание с точно таким же именем.
  3. Выполним обновление конфигурации базы данных (клавиша F7).
  4. Откроем консоль регламентных заданий в режиме «1С:Предприятие» — теперь платформа корректно сопоставит метаданные с существующей записью в базе.
  5. Штатно удалим проблемное регламентное задание через консоль.
  6. Вернемся в конфигуратор и окончательно удалим временный объект метаданных.

Способ 3. Очистка серверного сеансового кэша (для клиент-серверного режима)

В случаях, когда сбойные данные зависли в оперативной памяти процессов кластера 1С, выполним очистку серверных кэшей:

  1. Остановим службу 1C:Enterprise Server Agent на всех серверах кластера.
  2. Перейдем в каталог данных кластера (по умолчанию srvinfo/reg_XXXX/).
  3. Удалим или переименуем временные каталоги сеансовых контекстов snccntx*.
  4. Запустим службу сервера 1С заново.

Способ 4. Проверка утилитой chdbfl и выгрузка/загрузка информационной базы

Для файловых информационных баз формата .1CD:

  1. Создадим резервную копию файла базы данных.
  2. Запустим утилиту chdbfl.exe (расположена в каталоге bin установленной платформы 1С) и выполним проверку с включенным флагом «Исправлять обнаруженные ошибки».
  3. Если проверка не помогла, выполним выгрузку базы в файл .dt через конфигуратор (Администрирование → Выгрузить информационную базу), создадим пустую чистую информационную базу и загрузим полученный .dt файл. При выгрузке и загрузке системные таблицы регламентных заданий переформируются заново, исключая битые потоки данных.
← На главную