Как исправить ошибку SQL «Поле не найдено _Fld» и SDBL «Нет таблицы ConstChngR» при обновлении узла РИБ

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

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

Рассмотрим подробнее сценарий, когда при попытке принять изменения конфигурации в узле возникают ошибки вида Ошибка SQL: Поле не найдено 'T1._Fld9067RRef' или В схеме базы данных нет таблицы с именем ConstChngR10081. Проанализируем причины этого поведения и разберем по шагам методы восстановления работоспособности базы.

Причины возникновения рассинхронизации структуры БД

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

В распределенных базах это чаще всего происходит из-за сбоя в процессе реструктуризации. Платформа уже «знает», что в новой версии конфигурации должны быть определенные поля, но физически создать их в базе данных не смогла. Особенно часто это проявлялось на платформе версии 8.3.13.1690, которая имела известные проблемы с механизмом фонового обновления и обработкой таблиц миграции данных в РИБ.

Способ 1. Использование промежуточной версии платформы (Проверенное решение)

Как показывает практика, наиболее эффективным и быстрым способом является временный откат на более стабильную ветку платформы для завершения процесса реструктуризации. Рассмотрим этот алгоритм:

  1. Создание резервной копии: Перед любыми манипуляциями обязательно сохраните копию базы (файл .1CD), так как неудачная реструктуризация может окончательно испортить заголовок БД.
  2. Установка платформы 8.3.12: Если основная ошибка возникла на версии 8.3.13 или выше, установите одну из стабильных версий ветки 8.3.12 (например, 8.3.12.1855).
  3. Запуск конфигуратора: Запустите проблемную базу через конфигуратор версии 8.3.12. Несмотря на то, что конфигурация может требовать более новую платформу, для целей реструктуризации этот метод часто срабатывает.
  4. Выполнение обновления: Попробуйте выполнить обновление конфигурации базы данных (клавиша F7). В этот момент платформа 8.3.12 пересоберет таблицы SQL и восстановит недостающие поля _Fld или таблицы ChngR.
  5. Возврат на актуальную версию: После успешного завершения обновления закройте конфигуратор и запустите базу под исходной версией платформы (например, 8.3.13 или 8.3.15).

Важный нюанс: Если база выдает ошибку «поврежден заголовок базы данных», предварительно воспользуйтесь утилитой chdbfl.exe, которая находится в папке bin установленной платформы.

Способ 2. Принудительное «отвязывание» от главного узла

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

Запустите «1С:Предприятие» с параметром командной строки для снятия признака подчиненного узла. Это можно сделать через консоль:

1cv8.exe DESIGNER /F "ПутьКВашейБазе" /ResetMasterNode

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

ПланыОбмена.УстановитьГлавныйУзел(СсылкаНаГлавныйУзел);

Способ 3. Прямая загрузка конфигурации (CF)

Если обновление через файл обмена (XML) постоянно «вылетает», можно попробовать обновить конфигурацию узла напрямую из файла конфигурации .cf, выгруженного из центральной базы того же релиза. Разберем шаги:

  1. В центральной базе сделайте «Конфигурация» — «Выгрузить конфигурацию в файл...».
  2. В подчиненном узле (если конфигурация на «замочке») временно включите возможность изменения или снимите с поддержки (только если база уже отвязана от РИБ по Способу 2).
  3. Выполните «Конфигурация» — «Загрузить конфигурацию из файла...».
  4. Нажмите F7 для принятия изменений.

Внимание: Этот метод требует осторожности, так как может привести к потере уникальных идентификаторов объектов, если релизы конфигураций в центре и в узле изначально различались.

Способ 4. Создание нового начального образа (Радикальный)

Если ни один из методов выше не помог, а ошибки SDBL продолжают появляться при любом действии, проанализируем самый надежный, но трудозатратный способ. Часто быстрее создать новый образ узла, чем пытаться восстановить физически разрушенную структуру таблиц.

Посмотрим на последовательность действий:

Рекомендации по профилактике

Для предотвращения подобных ситуаций в будущем, рекомендуем придерживаться следующих правил при эксплуатации РИБ на платформе 8.3:

  1. Избегайте версии 8.3.13.1690 и соседних с ней релизов для работы с РИБ. Переходите на ветку 8.3.14 или 8.3.16, где ошибки работы с таблицами регистрации изменений были исправлены.
  2. Отключайте расширения: Перед крупным обновлением конфигурации в РИБ попробуйте временно отключить или удалить расширения в узлах, так как они часто становятся причиной ошибки _Fld.
  3. Регулярный чек: Периодически запускайте chdbfl.exe для профилактики здоровья файловой базы, особенно после аварийного завершения работы компьютера или выключения света в магазине.

Таким образом, мы выяснили, что основной причиной ошибки является баг конкретных версий платформы при проведении реструктуризации. Использование версии 8.3.12 в качестве «мостика» для обновления — это наиболее эффективный практический прием, позволяющий сохранить данные и восстановить работоспособность РИБ без пересоздания узла.

← На главную