Процесс реструктуризации информационной базы в 1С — это критически важная операция, которая перестраивает физическую структуру таблиц в соответствии с метаданными конфигурации. Однако нередко этот процесс прерывается критическими ошибками СУБД. Одной из наиболее специфических проблем является сбой на регистре сведений ОбъектыИнформационныхБаз, особенно в распределенных информационных базах (РИБ). Разберем по шагам, почему это происходит и как восстановить работоспособность системы.
Проанализируем типичную ситуацию: при обновлении конфигурации или выполнении тестирования и исправления (ТиИ) система выдает ошибку: «Ошибка SQL: Запись значения NULL в поле, не допускающее NULL '_FLD1999_TYPE'». Рассмотрим подробнее, что это означает с технической точки зрения.
В платформе 1С для хранения данных составного типа (например, измерение Объект в регистре ОбъектыИнформационныхБаз может содержать ссылки на разные справочники и документы) в SQL-таблице создается несколько колонок. Одна колонка хранит саму ссылку, а другая — идентификатор типа (суффикс _TYPE). Ошибка возникает, когда в поле типа оказывается значение NULL, что недопустимо правилами целостности базы данных. Это часто является следствием «битых» ссылок или некорректно завершенных предыдущих операций записи.
Проверим логическую целостность через конфигуратор. Если мы видим сообщения вида: РегистрСведений.ОбъектыИнформационныхБаз.Измерение.Объект Неверный тип хранимого значения, это подтверждает наличие записей, которые платформа не может идентифицировать. Прежде чем приступать к радикальным мерам, важно понять: регистр ОбъектыИнформационныхБаз критически важен для РИБ. Он хранит информацию о месте создания каждого объекта. Если его просто очистить, система «забудет» владельцев объектов, что приведет к дублям и коллизиям при следующем обмене данными.
Первым делом попробуем решить проблему штатными средствами. Однако важно соблюдать правильную последовательность действий, чтобы не усугубить ситуацию.
Если стандартное тестирование не помогает или «вылетает» без объяснения причин, рассмотрим более надежный метод, который применил один из участников обсуждения. Суть метода заключается в полной очистке регистра в проблемной базе и последующем заполнении его «здоровыми» данными из копии или из главного узла РИБ.
Проанализируем пример кода для восстановления данных через COMConnector. Этот метод позволяет подключиться к эталонной базе и перенести записи напрямую:
// Пример логики восстановления записей регистра
ПутьКБазе = "Srvr=""ServerName"";Ref=""BaseName"";";
COMСоединение = Новый COMОбъект("V81.COMConnector"); // Укажите нужную версию платформы
Попытка
БазаИсточник = COMСоединение.Connect(ПутьКБазе);
Исключение
Сообщить("Не удалось подключиться к базе-источнику");
Возврат;
КонецПопытки;
// Очищаем текущий регистр в подчиненном узле
НаборЗаписей = РегистрыСведений.ОбъектыИнформационныхБаз.СоздатьНаборЗаписей();
НаборЗаписей.Записать();
// Выбираем данные из источника
ЗапросИсточник = БазаИсточник.NewObject("Запрос");
ЗапросИсточник.Текст = "ВЫБРАТЬ * ИЗ РегистрСведений.ОбъектыИнформационныхБаз";
Выборка = ЗапросИсточник.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
НоваяЗапись = РегистрыСведений.ОбъектыИнформационныхБаз.СоздатьМенеджерЗаписи();
// Здесь необходимо сопоставить ссылки через УникальныйИдентификатор
// или найти соответствующие объекты в текущей базе
// ... логика поиска объекта ...
НоваяЗапись.Объект = НайтиСсылкуПоUID(Выборка.Объект);
НоваяЗапись.УзелОбмена = Выборка.УзелОбмена;
НоваяЗапись.Записать();
КонецЦикла;
Использование этого метода позволяет гарантированно избавиться от записей с типом NULL, так как мы перезаписываем регистр только валидными данными.
Если у нас нет возможности подключиться к другой базе, разберем способ исправления данных внутри текущей базы. Рассмотрим алгоритм фильтрации записей через объект ТаблицаЗначений:
Выгрузить().Объект не соответствует допустимым метаданным или ссылка является «битой» (объект не найден), удалим такую строку из таблицы.Загрузить().При выполнении этой операции обязательно используем транзакцию, чтобы избежать частичной потери данных в случае сбоя:
НачатьТранзакцию();
Попытка
ТЗ_Данных = РегистрыСведений.ОбъектыИнформационныхБаз.Выгрузить();
// Очистка регистра
Набор = РегистрыСведений.ОбъектыИнформационныхБаз.СоздатьНаборЗаписей();
Набор.Записать();
// Фильтрация (пример упрощенный)
Индекс = ТЗ_Данных.Количество() - 1;
Пока Индекс >= 0 Цикл
Строка = ТЗ_Данных[Индекс];
Если Строка.Объект = Неопределено Или Строка.Объект.ПолучитьОбъект() = Неопределено Тогда
ТЗ_Данных.Удалить(Индекс);
КонецЕсли;
Индекс = Индекс - 1;
КонецЦикла;
// Загрузка исправленных данных
Набор.Загрузить(ТЗ_Данных);
Набор.Записать();
ЗафиксироватьТранзакцию();
Сообщить("Данные регистра успешно нормализованы");
Исключение
ОтменитьТранзакцию();
Сообщить("Ошибка при обработке данных: " + ОписаниеОшибки());
КонецПопытки;
Выясним еще одну неочевидную причину, по которой реструктуризация может «тихо» выключать программу. Посмотрим на объем базы данных. При выполнении реструктуризации платформа 1С (особенно старых версий 8.1 и 8.2) создает временные копии таблиц.
Проанализируем требования к дисковому пространству: необходимо иметь запас места, равный 2–3 объемам самой базы. Если база весит 700 Гб, то на диске должно быть свободно не менее 1.4–2.1 Тб. В современных версиях платформы 8.3 реализована оптимизированная и фоновая реструктуризация, которая требует меньше места, но для «классического» метода старое правило остается актуальным. Если места недостаточно, СУБД или операционная система могут принудительно завершить процесс 1С без вывода внятного сообщения об ошибке.
Если проблема возникла в подчиненном узле распределенной базы, проанализируем состояние обмена. Часто реструктуризация блокируется, если система находится в состоянии «ожидания применения изменений метаданных». В этом случае попробуем следующий алгоритм:
Неопределено).Для файловых баз (.1CD) перед любыми действиями в конфигураторе обязательно запустим утилиту chdbfl.exe, которая находится в папке bin платформы. Она исправляет физические повреждения структуры файла, которые могут быть невидимы для логических проверок конфигуратора.
Таким образом, мы рассмотрели комплексный подход к решению проблемы реструктуризации: от простых проверок до программного восстановления данных. Помните, что работа с регистром ОбъектыИнформационныхБаз требует осторожности, так как он является «фундаментом» для корректной синхронизации данных между узлами.