При активной работе с расширениями в 1С (особенно в файловых вариантах базы данных) специалисты часто сталкиваются с неприятным явлением: в физических таблицах базы данных остаются колонки, которые больше не связаны ни с одним объектом метаданных в основной конфигурации. Такие поля называют «фантомными» или «сиротскими». Они не видны в дереве конфигурации, но присутствуют в структуре хранения данных, что может приводить к ошибкам при реструктуризации или обновлении. Рассмотрим, как выявить и устранить эту проблему.
В платформе 1С 8.3 расширения позволяют добавлять новые реквизиты к существующим объектам. В файловой базе (формат .1cd) эти реквизиты физически добавляются в ту же таблицу, где хранится основной объект (например, Document406 для Заказов клиентов). Если расширение удаляется некорректно, происходит сбой при обновлении конфигурации базы данных или нарушается логика работы системы, записи в системных таблицах (таких как DBSCHEMA) могут перестать соответствовать реальному набору колонок в таблице. В результате платформа «забывает» о существовании этих полей, но не удаляет их физически.
Прежде чем приступать к удалению, проанализируем ситуацию программно. Стандартная обработка "DBStorageStructureInfo" или встроенная функция ПолучитьСтруктуруХраненияБазыДанных() помогут нам увидеть реальную картину в SQL-терминах. Разберем пример кода, который позволяет вывести поля конкретной таблицы:
МассивИменМетаданных = Новый Массив();
МассивИменМетаданных.Добавить("Документ.ЗаказКлиента");
СтруктураБД = ПолучитьСтруктуруХраненияБазыДанных(МассивИменМетаданных);
Для Каждого СтрокаТаблицы Из СтруктураБД Цикл
Если СтрокаТаблицы.ИмяТаблицыХранения = "Document406" Тогда
Для Каждого Поле Из СтрокаТаблицы.Поля Цикл
Сообщить("Поле: " + Поле.ИмяПоляХранения + " | Метаданные: " + Поле.Метаданные);
КонецЦикла;
КонецЕсли;
КонецЦикла;
Если в результате выполнения этого кода мы видим строки, где ИмяПоляХранения заполнено (например, _Fld26726), а колонка Метаданные пуста — значит, мы имеем дело с фантомным полем. Проанализируем ситуацию: стандартное Тестирование и исправление (ТИИ) и выгрузка/загрузка информационной базы (.dt) часто не видят эти поля, так как они работают с объектами, описанными в метаданных, а не с физическим слоем базы напрямую.
Самый простой и безопасный способ заставить 1С пересоздать таблицу без лишних колонок — спровоцировать её полную реструктуризацию. Рассмотрим этот процесс по шагам:
ЗаказКлиента).Строка (длина 10), назовем его ВременныйРеквизитДляУдаления.ALTER TABLE.Важно: Иногда простого добавления реквизита недостаточно. В таких случаях попробуйте изменить тип существующего реквизита (например, увеличить длину строки на 1 символ) или временно включить/выключить индексирование у любого поля документа. Это заставляет платформу перестроить индексы и структуру таблицы, что часто приводит к очистке «мусора».
Если поля остались от расширения, которое визуально уже удалено, информация о нем могла сохраниться во внутренних системных реестрах. Попробуем очистить список расширений программно. Для этого создадим внешнюю обработку и выполним следующий код:
РасширенияБД = РасширенияКонфигурации.Получить();
Для Каждого Расширение Из РасширенияБД Цикл
Если Расширение.Имя = "ИмяПроблемногоРасширения" Тогда
Попытка
Расширение.Удалить();
Сообщить("Расширение успешно удалено");
Исключение
Сообщить("Ошибка при удалении: " + ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
КонецЦикла;
Также можно использовать запуск конфигуратора с параметром командной строки: /DeleteCfg -Extension "ИмяРасширения". Это инициирует глубокую очистку всех объектов, связанных с указанным расширением.
Если стандартные методы не помогают, придется обратиться к низкоуровневым инструментам для работы с файлами .1cd. Одной из самых популярных является утилита Tool1CD. Разберем алгоритм действий:
Tool1CD.DBSCHEMA. В ней хранится XML-описание всей структуры базы.Document406 присутствуют лишние поля, их можно попробовать удалить (это требует высокой квалификации и понимания структуры XML платформы).Когда структура базы «разъезжается» настолько, что ни ТИИ, ни выгрузка в .dt не помогают, а фантомные поля блокируют обновление конфигурации, мы рекомендуем использовать метод «чистого листа». Это гарантированный способ избавиться от любого физического мусора в таблицах.
Рассмотрим порядок действий:
.cf..cf. Теперь у нас есть абсолютно чистая структура таблиц без лишних колонок..cf, поэтому «фантомные» поля просто не попадут в выгрузку.Этот метод занимает больше времени, но он является самым надежным, так как платформа физически создает новые таблицы и заполняет их только корректными данными.
Появление лишних полей _Fld... — это признак нарушения логической целостности структуры базы данных. Мы рекомендуем начинать решение с принудительной реструктуризации через добавление тестового реквизита, так как это самый быстрый и штатный метод. Если же проблема сохраняется, стоит проверить базу утилитой chdbfl.exe (входит в поставку 1С) и, в крайнем случае, выполнить перенос данных через XML. Помните, что любые манипуляции со структурой таблиц должны предваряться созданием резервной копии!