Почему возникает ошибка "в базе отсутствует таблица refslnf19993" и как ее исправить?

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

При работе с информационной базой 1С:Предприятие пользователи могут столкнуться с критической ошибкой: "ошибка субд в базе отсутствует таблица refslnf19993" (или аналогичная с другим числовым индексом, например, refslnf21361). Эта проблема может препятствовать нормальной работе системы, выгрузке базы в файл .dt, обновлению конфигурации или запуску тестирования и исправления. Давайте вместе разберем, что означает эта ошибка, почему она возникает и как мы можем ее устранить.

Суть ошибки заключается в расхождении между метаданными (описанием структуры объектов) в конфигурации 1С и фактической структурой таблиц в базе данных. Таблицы с префиксом _RefSInf (от англ. Reference System Information) являются вспомогательными системными таблицами, предназначенными для хранения информации о предопределенных элементах справочников. Например, для справочника с внутренним идентификатором 19993 (который в СУБД может называться _Reference19993), таблица предопределенных данных будет иметь имя _RefSInf19993.

Причины возникновения ошибки

Прежде чем перейти к решению, давайте выясним основные причины, по которым эта ошибка может появиться:

  1. Ошибки при обновлении конфигурации. Это одна из наиболее распространенных причин, когда процесс обновления проходит некорректно, и необходимые таблицы не создаются или повреждаются.
  2. Проблемы с предопределенными элементами. Ошибка refslnf часто связана именно с предопределенными элементами. Если предопределенный элемент отсутствует в данных, это означает, что система пытается найти элемент справочника, который был предопределен в конфигурации, но не найден в базе данных.
  3. Платформенные ошибки. Мы знаем, что существовал зарегистрированный баг в платформе 1С:Предприятие (например, в версиях 8.3.24.1667 и 8.3.25.1374), при котором тестирование и исправление с проверкой логической целостности информационных баз, использующих разделение данных, ошибочно удаляло пустые таблицы предопределенных данных.
  4. Нарушение целостности базы данных. Это может произойти в результате сбоев системы, некорректных действий пользователей, внезапного отключения электричества, проблем с диском или сетевым оборудованием.
  5. Некорректная первоначальная установка конфигурации.

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

Разбираемся, к какому объекту метаданных относится проблемная таблица

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

Способ 1: Использование кода в консоли запросов или временной обработке

Мы можем написать небольшой фрагмент кода, который поможет нам найти соответствие между именем таблицы в СУБД и объектом метаданных 1С. Откройте конфигуратор, создайте новую внешнюю обработку или воспользуйтесь консолью кода.

Рассмотрим пример кода, который позволит нам вычислить название объекта метаданных:


ТекстСообщения = "";
ЧтоИщем = "_RefSInf19993"; // Замените на имя вашей проблемной таблицы

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

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

// Если нашли, ищем связанные таблицы по метаданным
Если Не ПустаяСтрока(ТекстСообщения) Тогда
    Для Каждого Таблица Из СтруктураХранения Цикл
        Если Таблица.Метаданные = ЧтоИщем Тогда
            ТекстСообщения = ТекстСообщения + " (Метаданные: " + Таблица.Метаданные + ", Таблица хранения: " + Таблица.ИмяТаблицыХранения + ")";
            Прервать;
        КонецЕсли;
    КонецЦикла;
КонецЕсли;

Сообщить(ТекстСообщения);

Этот код выведет сообщение, которое укажет, к какому справочнику или другому объекту метаданных относится отсутствующая таблица. Например, вы можете получить что-то вроде: _RefSInf19993 соответствует: Справочник.Валюты (Метаданные: Справочник.Валюты, Таблица хранения: _Reference19993).

Способ 2: Визуализация структуры хранения в табличном документе

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

Рассмотрим пример кода для обработки, который выведет структуру в табличный документ:


&НаСервереБезКонтекста
Функция ДанныеТаблицыЗначенийВТабличныйДокумент(ДанныеДляВывода)

    ТабличныйДокумент = Новый ТабличныйДокумент;
    Построитель = Новый ПостроительОтчета;
    Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ДанныеДляВывода);
    Построитель.Вывести(ТабличныйДокумент);

    Возврат ТабличныйДокумент;

КонецФункции

&НаСервере
Функция ПолучитьСтруктуруБДНаСервере()

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

    Возврат ТабДок;

КонецФункции

&НаКлиенте
Процедура ПолучитьСтруктуруБД(Команда)

    ТабДок = ПолучитьСтруктуруБДНаСервере();
    ТабДок.Показать();

КонецПроцедуры

Этот код можно разместить в новой внешней обработке. Добавьте на форму кнопку, при нажатии на которую будет вызываться процедура ПолучитьСтруктуруБД. Мы увидим табличный документ со всей информацией о таблицах базы данных. В нем мы сможем найти строку с ИмяТаблицыХранения, соответствующим _RefSInf19993, и определить, к какому Назначению (объекту метаданных) она относится.

Методы устранения проблемы

После того как мы определили, к какому справочнику относится проблемная таблица (например, Справочник.Валюты), мы можем приступить к "шаманству", которое часто помогает в таких случаях.

Решение 1: Пересоздание таблицы через предопределенные элементы

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

  1. Определите справочник. С помощью описанных выше методов мы выяснили, что, например, таблица _RefSInf19993 относится к справочнику Справочник.Валюты.
  2. Добавьте временный предопределенный элемент. Откройте конфигуратор, найдите в дереве метаданных соответствующий справочник (в нашем примере это Справочники -> Валюты). Перейдите на вкладку "Предопределенные" и добавьте любой новый предопределенный элемент. Дайте ему уникальное имя, например, "ВременныйЭлемент".
  3. Обновите конфигурацию базы данных. Сохраните конфигурацию (F7 или "Конфигурация" -> "Обновить конфигурацию базы данных"). Платформа 1С проанализирует изменения и, возможно, пересоздаст отсутствующую таблицу.
  4. Удалите временный предопределенный элемент. После успешного обновления конфигурации базы данных, вернитесь в конфигуратор, найдите созданный "ВременныйЭлемент" и удалите его.
  5. Снова обновите конфигурацию базы данных. Еще раз сохраните конфигурацию.
  6. Проверьте результат. Попробуйте выполнить операцию, которая ранее вызывала ошибку (например, выгрузку в .dt или запуск 1С в режиме предприятия). Если ошибка исчезла, значит, метод сработал.

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

Решение 2: Тестирование и исправление базы данных (ТиИ)

В некоторых случаях, хотя и не всегда для _RefSInf ошибок, стандартное тестирование и исправление базы данных может помочь. Запустите 1С в режиме конфигуратора, перейдите в меню "Администрирование" -> "Тестирование и исправление...".

Мы рекомендуем включить следующие опции:

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

Решение 3: Восстановление из резервной копии

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

Решение 4: Обращение в службу поддержки 1С

В особо сложных случаях, когда самостоятельные действия не приносят результата, а база содержит множество таких ошибок (как в одном из примеров, где было более 30 аналогичных таблиц), мы рекомендуем обратиться в службу поддержки 1С. Специалисты 1С обладают инструментами и опытом для ручного пересоздания структур таблиц и проведения комплексного тестирования и исправления. Это подтверждается опытом пользователей, когда 1С вручную пересоздавала структуры и прогоняла ТиИ.

Подведем итоги

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

  1. Диагностика: Используем функцию ПолучитьСтруктуруХраненияБазыДанных() для определения, какой объект метаданных связан с отсутствующей таблицей.
  2. "Шаманство" с предопределенными элементами: Добавляем, сохраняем, удаляем и снова сохраняем временный предопределенный элемент в соответствующем справочнике.
  3. Тестирование и исправление: Пробуем стандартные средства 1С, но с осторожностью, учитывая возможные платформенные баги.
  4. Резервная копия: Если ничего не помогло, возвращаемся к последней рабочей копии.
  5. Поддержка 1С: При множественных ошибках или безрезультатности самостоятельных действий обращаемся к специалистам.

Помните, что регулярное резервное копирование — это лучшая защита от подобных проблем. Мы желаем вам успешного решения этой и других задач с 1С:Предприятие!

← К списку