Ошибка "Не обнаружена таблица RefSInf": причины возникновения при обновлении РИБ и методы восстановления базы данных

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

При администрировании распределенных информационных баз (РИБ) на платформе 1С:Предприятие, особенно при использовании конфигурации "1С:Розница", специалисты могут столкнуться с критической ошибкой после обновления центрального узла. Ситуация выглядит следующим образом: центральная база (ЦБ) на SQL сервере обновлена успешно, но при попытке синхронизации с периферийной базой (ПБ), работающей в файловом варианте, обмен прерывается с сообщением о том, что не обнаружена таблица с именем вида RefSInfXXXXX (например, RefSInf21018).

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

Понимаем природу ошибки: что такое RefSInf?

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

Внутри физической структуры базы данных (будь то файл 1Cv8.1CD или таблицы на SQL Server) платформа хранит данные не с теми именами, которые мы видим в Конфигураторе (например, Справочник.Номенклатура), а с внутренними идентификаторами.

Префикс RefSInf расшифровывается как Reference Static Information. Это служебная таблица, сопровождающая справочники. Она предназначена для хранения информации о предопределенных элементах справочника. Она связывает имя предопределенного элемента (заданное в конфигураторе) с его ссылкой (GUID) в таблице данных.

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

Причина сбоя: ошибка платформы при реструктуризации

Проанализируем ситуацию, описанную в исходной теме. Проблема возникла после обновления конфигурации. Дело в том, что в определенных версиях платформы 1С:Предприятие 8.3 (в частности, ветки 8.3.22, 8.3.23 и ранние 8.3.24) был обнаружен серьезный программный дефект (баг).

Суть ошибки заключается в следующем: при выполнении реструктуризации базы данных (процесс, который происходит при обновлении конфигурации), платформа ошибочно помечала пустые таблицы RefSInf как "мусорные" и физически удаляла их из структуры файла базы данных. Однако описание этой таблицы в схеме конфигурации оставалось.

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

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

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

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

Рассмотрим код, который поможет найти проблемный справочник. Этот код можно выполнить в обработке с произвольным алгоритмом или во внешней обработке:


// Укажите часть имени таблицы, которую выдает ошибка
ЧтоИщем = "_RefSInf"; 
// Для точного поиска можно указать полный суффикс, например "_RefSInf21018"

// Получаем структуру хранения всей базы данных
// Второй параметр "Истина" означает, что мы хотим получить имена таблиц в терминах СУБД
СтруктураХранения = ПолучитьСтруктуруХраненияБазыДанных(, Истина);

Для Каждого Таблица Из СтруктураХранения Цикл
    // Проверяем, содержит ли имя таблицы искомый фрагмент
    Если СтрНайти(Таблица.ИмяТаблицыХранения, ЧтоИщем) > 0 Тогда
        // Выводим имя таблицы БД и соответствующий ей объект метаданных
        Сообщить("Таблица БД: " + Таблица.ИмяТаблицыХранения + " ---> Объект: " + Таблица.Метаданные);
    КонецЕсли;
КонецЦикла;

В результате выполнения этого кода в окне сообщений вы увидите список соответствий, например:

Так мы точно узнаем, какой справочник "потерял" таблицу предопределенных данных.

Решение проблемы: пошаговое руководство

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

Шаг 1. Обновление технологической платформы

Первым и обязательным шагом является обновление платформы 1С:Предприятие на всех узлах (и в центре, и на периферии). Ошибка с удалением таблиц RefSInf была официально признана фирмой "1С" и исправлена.

Вам необходимо установить версию не ниже 8.3.24.1667. Если вы используете другую ветку (например, 8.3.25), убедитесь, что в ней также применены соответствующие исправления.

Внимание: Попытки исправления базы на версии платформы с ошибкой (например, 8.3.24.1586) могут привести к повторному возникновению проблемы.

Шаг 2. Восстановление файловой базы данных (Метод "Донорство")

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

Это означает, что если мы возьмем конфигурацию (файл .cf) из Центральной Базы и создадим из нее новую пустую файловую базу, то имена таблиц (RefSInf...) в этой новой базе будут точно такими же, как в нашей сломанной периферийной базе.

Алгоритм действий:

  1. Выгрузите конфигурацию (.cf файл) из Центральной базы.
  2. Создайте новую пустую информационную базу (в пустой папке) и загрузите в нее этот .cf.
  3. В новой базе платформа корректно создаст все таблицы, включая ту, которая пропала в ПБ. Она будет пустой, но с правильной структурой.
  4. Для переноса таблицы нам потребуется инструмент низкоуровневого редактирования файлов 1Cv8.1CD (в сообществе специалистов часто используют утилиты типа Tool1CD).

Работа с инструментом восстановления:

  1. Откройте с помощью утилиты файл 1Cv8.1CD новой (донорской) базы.
  2. Найдите таблицу, имя которой фигурировало в ошибке (например, RefSInf21018).
  3. Выполните экспорт этой таблицы (структуры и данных) во внешний файл (обычно формат xml или бинарный дамп, в зависимости от инструмента).
  4. Закройте базу-донор и откройте файл 1Cv8.1CD поврежденной периферийной базы.
  5. Найдите в списке ту же таблицу. Скорее всего, инструмент покажет, что она повреждена или отсутствует, но заголовок может сохраниться.
  6. Выполните импорт таблицы из ранее сохраненного файла. Это физически запишет корректный заголовок таблицы и пустые данные в файл базы.
  7. Сохраните изменения.

Шаг 3. Финальная реструктуризация и проверка

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

Выполните следующие действия строго на исправленной версии платформы (8.3.24.1667 или новее):

  1. Запустите Конфигуратор периферийной базы.
  2. Перейдите в меню Администрирование -> Тестирование и исправление.
  3. Установите галочки:
    • Реиндексация таблиц информационной базы
    • Реструктуризация таблиц информационной базы
  4. Режим выберите "Тестирование и исправление".
  5. Нажмите "Выполнить".

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

Названия таблиц в SQL и Файловом варианте: есть ли разница?

В ходе обсуждения часто возникает вопрос: почему мы не можем просто скопировать таблицу из Центральной базы (SQL) в Периферийную? Или почему мы не нашли таблицу с таким же именем в SQL Management Studio?

Давайте проясним этот технический момент:

Именно поэтому метод с созданием "пустой базы-донора" работает для восстановления файловых баз, но перенос "сырых" данных напрямую из SQL в файл невозможен из-за различия в именовании и структуре хранения.

Профилактика

Чтобы избежать подобных ситуаций в будущем, рекомендуем:

  1. Регулярно обновлять платформу 1С, но делать это с осторожностью, изучая списки исправленных ошибок ("Bugboard").
  2. Настроить автоматическое резервное копирование периферийных узлов. Даже если это файловые базы "на точках", наличие вчерашнего архива сэкономит часы работы по восстановлению.
  3. При возникновении ошибок "Таблица не найдена" не спешите делать resetMasterNode (отвязку от главного узла), так как это может усложнить последующую синхронизацию. Сначала проведите диагностику физической целостности базы.
← На главную