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

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

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

В этой статье мы подробно разберем, как устроено хранение расширений на уровне СУБД, какие таблицы отвечают за их метаданные и структуру, как правильно выполнить их очистку в MS SQL Server или PostgreSQL, а также рассмотрим безопасные альтернативные методы реанимации базы без прямого вмешательства в СУБД.

Какая структура таблиц отвечает за расширения в СУБД?

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

  1. ConfigCAS — основное системное хранилище примененных конфигураций расширений. Это аналог таблицы Config для основной конфигурации. Здесь в сжатом бинарном виде хранятся все метаданные и программный код расширений.
  2. ConfigCASSave — временное хранилище конфигураций расширений. Сюда записываются изменения в тот момент, когда мы сохраняем расширение в Конфигураторе, но еще не применили изменения (не нажали «Обновить конфигурацию базы данных»).
  3. _ExtensionsInfo (в некоторых новых версиях платформы также встречается _ExtensionsInfoNGS) — таблица, содержащая общую информацию о зарегистрированных в системе расширениях. Сюда записываются их уникальные идентификаторы, имена, версии, статус активности и параметры совместимости.
  4. _ExtensionsRestruct (и ее аналог _ExtensionsRestructNGS) — служебные таблицы, хранящие информацию о планах и процессах реструктуризации данных, которые требуются для адаптации таблиц под нужды расширений.

Если в базе данных произошел сбой формата потока, это означает, что бинарные данные внутри таблиц ConfigCAS или ConfigCASSave повреждены либо вошли в неразрешимое противоречие с основной конфигурацией из таблицы Config.

Прямая зачистка расширений через SQL: пошаговое руководство

Рассмотрим радикальный метод — полное удаление расширений непосредственно из таблиц СУБД. Настоятельно рекомендуем выполнять эту операцию только в том случае, если Конфигуратор вообще не открывается, а любые штатные методы исправления базы исчерпаны.

КРИТИЧЕСКИ ВАЖНО: Перед выполнением любых запросов на уровне СУБД обязательно сделайте резервную копию (бэкап) базы данных средствами SQL Server Management Studio (SSMS) или pgAdmin! Ошибка в действиях может полностью уничтожить логическую целостность вашей базы.

Для полной очистки следов расширений из СУБД выполним следующий SQL-скрипт (на примере MS SQL Server):


-- Шаг 1. Очищаем временное хранилище сохраненных конфигураций расширений
TRUNCATE TABLE [dbo].[ConfigCASSave];

-- Шаг 2. Очищаем основное хранилище конфигураций расширений
TRUNCATE TABLE [dbo].[ConfigCAS];

-- Шаг 3. Удаляем информацию о зарегистрированных расширениях
TRUNCATE TABLE [dbo].[_ExtensionsInfo];

-- Шаг 4. Очищаем таблицы реструктуризации данных расширений
TRUNCATE TABLE [dbo].[_ExtensionsRestruct];

После выполнения этих команд база данных с точки зрения платформы «1С» станет «чистой» от расширений. При следующем запуске Конфигуратора платформа не обнаружит зарегистрированных расширений и должна успешно открыться без ошибки формата потока.

Подводные камни и риски ручного удаления из SQL

Прямая очистка системных таблиц — это хирургическое вмешательство, которое имеет серьезные побочные эффекты. Проанализируем риски, с которыми мы можем столкнуться:

1. Потеря пользовательских данных. Расширения в 1С могут не только перехватывать процедуры в модулях, но и создавать собственные объекты данных (справочники, документы, регистры) или добавлять новые реквизиты к существующим типовым объектам. Для хранения этих данных платформа создает реальные физические таблицы в СУБД.

При создании таблиц для объектов из расширений платформа добавляет к их именам специальный суффикс (аффикс) справа. Например, если типовой регистр сведений называется _InfoRg2034, то его расширение с собственными реквизитами может получить физическое имя вида _InfoRg2034X1 или _InfoRg2034X2.

Если мы просто очистим таблицы ConfigCAS и _ExtensionsInfo, физические таблицы с суффиксами X1, X2 и т.д. останутся «висеть» в базе данных SQL как сироты. Платформа больше не знает об их существовании, так как удалены метаданные расширения, связывавшие их.

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

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

Безопасная альтернатива: очистка расширений через командную строку

Прежде чем прибегать к жесткому удалению через SQL, обязательно попробуем штатный инструмент платформы. Разработчики «1С» предусмотрели специальные ключи командной строки для работы с расширениями в обход интерактивного запуска Конфигуратора. Этот способ гораздо безопаснее, так как платформа сама корректно выполнит деструктуризацию, удалит связанные таблицы и не оставит «мусора» в СУБД.

Рассмотрим, как запустить очистку через командную строку. Откроем консоль cmd и выполним команду (подставив свои параметры подключения к базе):

Для удаления абсолютно всех расширений из информационной базы:


"C:\Program Files\1cv8\common\1cestart.exe" DESIGNER /F "C:\Put_K_Baze" /N "Администратор" /P "Пароль" /DeleteCfg -AllExtensions

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


"C:\Program Files\1cv8\common\1cestart.exe" DESIGNER /S "ИмяСервера\ИмяБазы" /N "Администратор" /P "Пароль" /DeleteCfg -AllExtensions

Для удаления конкретного проблемного расширения по его имени:


"C:\Program Files\1cv8\common\1cestart.exe" DESIGNER /F "C:\Put_K_Baze" /N "Администратор" /P "Пароль" /DeleteCfg -Extension "ИмяНужногоРасширения"

Этот способ принудительно инициирует сеанс Конфигуратора в монопольном режиме, локализует и корректно удаляет указанное расширение, очищая кэш структуры и все системные таблицы.

Очистка «хвостов» в режиме «1С:Предприятие»

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

Для полной очистки выполним программный код во внешней обработке под полными правами:


// Выключим проверку прав и запишем изменения напрямую
УстановитьПривилегированныйРежим(Истина);

// 1. Очистка справочника "Идентификаторы объектов расширений"
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	Ссылка
    |ИЗ
    |	Справочник.ИдентификаторыОбъектовРасширений КАК Идентификаторы";

РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();

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

// 2. Очистка регистра сведений "Идентификаторы объектов версий расширений"
НаборЗаписей = РегистрыСведений.ИдентификаторыОбъектовВерсийРасширений.СоздатьНаборЗаписей();
НаборЗаписей.Записать(Истина);

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

← На главную