При работе с расширениями в среде 1С:Предприятие 8.3 программисты нередко сталкиваются с ситуацией, когда после удаления расширения в структуре базы данных остаются «фантомные» поля или таблицы. Это приводит к невозможности проведения документов, ошибкам SDBL (поле не найдено или поле уже существует) и невозможности повторно подключить расширение. Особенно остро эта проблема стоит в файловых базах, где инструменты исправления ограничены. В этой статье мы подробно разберем, почему это происходит и как восстановить работоспособность базы, используя переход на SQL и прямые манипуляции с таблицами.
Для начала проанализируем, как платформа 1С изменяет структуру БД при добавлении реквизитов через расширение. Вместо того чтобы просто добавить колонку в существующую таблицу, платформа использует механизм Shadow Tables (X-таблицы). Рассмотрим этот процесс подробнее:
РеализацияТоваровУслуг), 1С создает копию основной таблицы с суффиксом X1 (например, _Document549X1)._Document549) при этом может быть очищена, а все обращения платформы перенаправляются на X-таблицу.Если в процессе удаления происходит сбой (ошибка платформы, некорректное завершение сеанса), база данных застревает в «подвешенном» состоянии: в конфигурации расширения уже нет, но физически данные хранятся в X-таблице, а основная таблица пуста или имеет неактуальную структуру. Именно это вызывает ошибку SDBL, так как платформа не понимает, откуда брать данные.
Как показывает практика, исправить подобные ошибки в файловой базе (формат .1CD) крайне сложно, так как инструменты типа Tool1CD часто работают только на чтение для новых версий платформы. Поэтому первым делом нам необходимо выгрузить базу в формат .dt и развернуть её на сервере под управлением PostgreSQL или MS SQL Server. Это даст нам возможность напрямую управлять структурой таблиц через SQL-запросы.
После развертывания базы на SQL нам необходимо выяснить, где именно находятся наши данные. Проанализируем ситуацию с помощью запросов в pgAdmin или SQL Management Studio. Проверим наличие данных в основной таблице и таблице с суффиксом X. Выясним, какая из них содержит актуальные документы.
Также важно проверить служебные таблицы 1С, которые хранят информацию о расширениях. К ним относятся:
_ExtensionsInfo — общая информация о расширениях._ExtensionsRestruct — информация о незавершенных процессах реструктуризации.Если расширение было удалено, но эти таблицы содержат записи, это может блокировать нормальную работу. Очистим их, если мы уверены, что расширений в базе больше нет:
-- Очистка служебных таблиц расширений (выполнять с осторожностью!)
DELETE FROM _ExtensionsInfo;
DELETE FROM _ExtensionsRestruct;
Если мы выяснили, что все данные остались в таблице _Document549X1, а основная таблица _Document549 пуста, нам нужно «вернуть» данные на место. Разберем алгоритм действий, который помог пользователям на практике:
_Fld29823), которое мешает реструктуризации, из X-таблицы.Пример SQL-команд для выполнения этих действий:
-- 1. Удаляем фантомное поле из теневой таблицы
ALTER TABLE _Document549X1 DROP COLUMN _Fld29823;
-- 2. Переименовываем таблицы (подменяем пустую на заполненную)
ALTER TABLE _Document549 RENAME TO _Document549_Backup;
ALTER TABLE _Document549X1 RENAME TO _Document549;
-- 3. Аналогичные действия необходимо выполнить для всех табличных частей (VT)
-- Например, для табличной части Товары:
ALTER TABLE _Document549_VT9036 RENAME TO _Document549_VT9036_Backup;
ALTER TABLE _Document549_VT9036X1 RENAME TO _Document549_VT9036;
Важный момент: если вы переименовываете таблицы, обязательно проверьте индексы. Платформа 1С очень чувствительна к именам индексов в базе данных.
После того как мы вручную подправили таблицы на уровне SQL, платформа может все еще «помнить» старую схему из своего кэша или таблицы DBSchema. Чтобы заставить 1С пересобрать описание структуры базы, выполним следующие действия:
РеализацияТоваровУслуг) с поддержки, если это необходимо.РеквизитДляТеста с типом Булево).DBSchema.Рассмотрим, почему это помогает. Когда мы добавляем реквизит в основной конфигурации, 1С обязана проверить соответствие метаданных и физических таблиц SQL. Если мы уже подложили «правильные» таблицы (избавились от суффикса X), реструктуризация пройдет корректно, и платформа зафиксирует новую, чистую структуру.
После завершения манипуляций обязательно запустим Тестирование и исправление (ТиИ). Нас интересуют пункты:
Если после ручного переноса таблиц вы видите ошибку «Объект не найден», это означает, что связь между основной таблицей и табличными частями (VT) была нарушена. Проверьте, что вы переименовали все связанные X-таблицы (для всех ТЧ документа), иначе данные в строках товаров, услуг или проводок не подтянутся к шапке документа.
Чтобы не попадать в подобные ситуации при работе с расширениями, рекомендуем придерживаться следующих правил:
/DeleteCfg -CleanExtensionData. Это помогает очистить «хвосты» расширений более деликатно, чем прямая правка SQL.Таким образом, мы выяснили причину возникновения «фантомных» полей и разобрали детальный план спасения базы данных. Помните, что прямая правка таблиц SQL — это крайняя мера, требующая максимальной концентрации и обязательного наличия свежей резервной копии.