Как удалить пустые или фантомные поля из таблиц файловой базы 1С

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

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

Выясним причину появления лишних полей

В платформе 1С 8.3 расширения позволяют добавлять новые реквизиты к существующим объектам. В файловой базе (формат .1cd) эти реквизиты физически добавляются в ту же таблицу, где хранится основной объект (например, Document406 для Заказов клиентов). Если расширение удаляется некорректно, происходит сбой при обновлении конфигурации базы данных или нарушается логика работы системы, записи в системных таблицах (таких как DBSCHEMA) могут перестать соответствовать реальному набору колонок в таблице. В результате платформа «забывает» о существовании этих полей, но не удаляет их физически.

Диагностика структуры хранения данных

Прежде чем приступать к удалению, проанализируем ситуацию программно. Стандартная обработка "DBStorageStructureInfo" или встроенная функция ПолучитьСтруктуруХраненияБазыДанных() помогут нам увидеть реальную картину в SQL-терминах. Разберем пример кода, который позволяет вывести поля конкретной таблицы:


МассивИменМетаданных = Новый Массив();
МассивИменМетаданных.Добавить("Документ.ЗаказКлиента");
СтруктураБД = ПолучитьСтруктуруХраненияБазыДанных(МассивИменМетаданных);

Для Каждого СтрокаТаблицы Из СтруктураБД Цикл
    Если СтрокаТаблицы.ИмяТаблицыХранения = "Document406" Тогда
        Для Каждого Поле Из СтрокаТаблицы.Поля Цикл
            Сообщить("Поле: " + Поле.ИмяПоляХранения + " | Метаданные: " + Поле.Метаданные);
        КонецЦикла;
    КонецЕсли;
КонецЦикла;

Если в результате выполнения этого кода мы видим строки, где ИмяПоляХранения заполнено (например, _Fld26726), а колонка Метаданные пуста — значит, мы имеем дело с фантомным полем. Проанализируем ситуацию: стандартное Тестирование и исправление (ТИИ) и выгрузка/загрузка информационной базы (.dt) часто не видят эти поля, так как они работают с объектами, описанными в метаданных, а не с физическим слоем базы напрямую.

Метод 1: Принудительная реструктуризация таблицы

Самый простой и безопасный способ заставить 1С пересоздать таблицу без лишних колонок — спровоцировать её полную реструктуризацию. Рассмотрим этот процесс по шагам:

  1. Откроем конфигуратор и найдем проблемный объект (например, документ ЗаказКлиента).
  2. Добавим в него новый реквизит с типом Строка (длина 10), назовем его ВременныйРеквизитДляУдаления.
  3. Выполним обновление конфигурации базы данных (клавиша F7). В этот момент платформа анализирует изменения и выполняет команду ALTER TABLE.
  4. Теперь удалим этот реквизит и снова выполним обновление базы данных.

Важно: Иногда простого добавления реквизита недостаточно. В таких случаях попробуйте изменить тип существующего реквизита (например, увеличить длину строки на 1 символ) или временно включить/выключить индексирование у любого поля документа. Это заставляет платформу перестроить индексы и структуру таблицы, что часто приводит к очистке «мусора».

Метод 2: Очистка через программное удаление расширений

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


РасширенияБД = РасширенияКонфигурации.Получить();
Для Каждого Расширение Из РасширенияБД Цикл
    Если Расширение.Имя = "ИмяПроблемногоРасширения" Тогда
        Попытка
            Расширение.Удалить();
            Сообщить("Расширение успешно удалено");
        Исключение
            Сообщить("Ошибка при удалении: " + ОписаниеОшибки());
        КонецПопытки;
    КонецЕсли;
КонецЦикла;

Также можно использовать запуск конфигуратора с параметром командной строки: /DeleteCfg -Extension "ИмяРасширения". Это инициирует глубокую очистку всех объектов, связанных с указанным расширением.

Метод 3: Использование внешних утилит (для продвинутых пользователей)

Если стандартные методы не помогают, придется обратиться к низкоуровневым инструментам для работы с файлами .1cd. Одной из самых популярных является утилита Tool1CD. Разберем алгоритм действий:

  1. Обязательно создадим резервную копию базы данных.
  2. Откроем файл базы в утилите Tool1CD.
  3. Найдем таблицу DBSCHEMA. В ней хранится XML-описание всей структуры базы.
  4. Проанализируем содержимое этой таблицы. Если в XML описании объекта Document406 присутствуют лишние поля, их можно попробовать удалить (это требует высокой квалификации и понимания структуры XML платформы).
  5. Более простой путь в этой утилите — просто убедиться, что поля существуют физически, и после этого использовать метод «Выгрузка-загрузка данных XML» (описан ниже).

Метод 4: Полный перенос данных в чистую базу (XML)

Когда структура базы «разъезжается» настолько, что ни ТИИ, ни выгрузка в .dt не помогают, а фантомные поля блокируют обновление конфигурации, мы рекомендуем использовать метод «чистого листа». Это гарантированный способ избавиться от любого физического мусора в таблицах.

Рассмотрим порядок действий:

  1. Сохраним конфигурацию проблемной базы в файл .cf.
  2. Создадим новую пустую информационную базу.
  3. Загрузим в новую базу сохраненный файл .cf. Теперь у нас есть абсолютно чистая структура таблиц без лишних колонок.
  4. Используем универсальную обработку «Выгрузка и загрузка данных XML» (её можно найти на диске ИТС или в составе инструментов разработчика).
  5. В проблемной базе выгрузим все данные в XML-файл. Важно: обработка выгружает данные только по тем метаданным, которые есть в .cf, поэтому «фантомные» поля просто не попадут в выгрузку.
  6. Загрузим полученный файл в новую чистую базу.

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

Заключение

Появление лишних полей _Fld... — это признак нарушения логической целостности структуры базы данных. Мы рекомендуем начинать решение с принудительной реструктуризации через добавление тестового реквизита, так как это самый быстрый и штатный метод. Если же проблема сохраняется, стоит проверить базу утилитой chdbfl.exe (входит в поставку 1С) и, в крайнем случае, выполнить перенос данных через XML. Помните, что любые манипуляции со структурой таблиц должны предваряться созданием резервной копии!

← На главную