При администрировании базы данных 1С и попытке открыть внешнюю консоль регламентных заданий (например, из комплекта Инструментов разработчика или стандартных БСП) может возникать критический сбой: «Ошибка формата потока». При этом в отладчике видно, что метод РегламентныеЗадания.ПолучитьРегламентныеЗадания() отрабатывает без ошибок, но при попытке перебора коллекции в цикле или при чтении свойств конкретного элемента платформа аварийно падает.
Разберем основные причины возникновения этой проблемы и пошаговые методы её локализации и устранения.
Проанализируем природу появления ошибки формата потока при обращении к коллекции регламентных задач:
ПоследнееЗадание: в некоторых версиях платформы 1С при аварийном завершении фонового процесса внутренний идентификатор фонового задания записывается с нарушением структуры сериализации.Метаданные приводит к сбою платформы из-за отсутствия объекта в конфигурации.snccntx в серверном кластере.Так как коллекция содержит поврежденный элемент, стандартный перебор в цикле Для Каждого прерывается на сбойном объекте. Чтобы не выполнять длительное тестирование и исправление всей базы данных в рабочее время, локализуем и удалим испорченную запись программно.
Создадим внешнюю обработку и выполним точечный перебор заданий по метаданным с перехватом исключений:
Отбор = Новый Структура;
ВсеМетаданные = Метаданные.РегламентныеЗадания;
Для Каждого ОбъектыМетаданных Из ВсеМетаданные Цикл
Отбор.Вставить("Метаданные", ОбъектыМетаданных);
Попытка
НайденныеЗадания = РегламентныеЗадания.ПолучитьРегламентныеЗадания(Отбор);
Для Каждого ТекЗадание Из НайденныеЗадания Цикл
Попытка
// Проверяем обращение к ключевым свойствам
Имя = ТекЗадание.Метаданные.Синоним;
Идентификатор = ТекЗадание.УникальныйИдентификатор;
ПослЗадание = ТекЗадание.ПоследнееЗадание;
Исключение
Сообщить("Найдено поврежденное задание: " + ОбъектыМетаданных.Имя + ". Ошибка: " + ОписаниеОшибки());
// Удаляем поврежденный экземпляр
ТекЗадание.Удалить();
Сообщить("Поврежденное задание успешно удалено.");
КонецПопытки;
КонецЦикла;
Исключение
Сообщить("Сбой при получении заданий для метаданных: " + ОбъектыМетаданных.Имя);
КонецПопытки;
КонецЦикла;
Если сбой происходит на уровне обращения к общему массиву по индексам, применим пошаговый перебор массива по индексам:
СписокЗаданий = РегламентныеЗадания.ПолучитьРегламентныеЗадания();
Всего = СписокЗаданий.Количество();
Для Индекс = 0 По Всего - 1 Цикл
Попытка
ТекЗадание = СписокЗаданий[Индекс];
Имя = ТекЗадание.Метаданные.Имя;
Исключение
Сообщить("Ошибка на элементе с индексом: " + Индекс);
Попытка
СписокЗаданий[Индекс].Удалить();
Сообщить("Элемент удален.");
Исключение
Сообщить("Не удалось удалить элемент программно: " + ОписаниеОшибки());
КонецПопытки;
КонецПопытки;
КонецЦикла;
Если регламентное задание перестало открываться после некорректного обновления базы (или динамического обновления):
В случаях, когда сбойные данные зависли в оперативной памяти процессов кластера 1С, выполним очистку серверных кэшей:
1C:Enterprise Server Agent на всех серверах кластера.srvinfo/reg_XXXX/).snccntx*.Для файловых информационных баз формата .1CD:
chdbfl.exe (расположена в каталоге bin установленной платформы 1С) и выполним проверку с включенным флагом «Исправлять обнаруженные ошибки»..dt через конфигуратор (Администрирование → Выгрузить информационную базу), создадим пустую чистую информационную базу и загрузим полученный .dt файл. При выгрузке и загрузке системные таблицы регламентных заданий переформируются заново, исключая битые потоки данных.