При работе с информационной базой 1С:Предприятие пользователи могут столкнуться с критической ошибкой: "ошибка субд в базе отсутствует таблица refslnf19993" (или аналогичная с другим числовым индексом, например, refslnf21361). Эта проблема может препятствовать нормальной работе системы, выгрузке базы в файл .dt, обновлению конфигурации или запуску тестирования и исправления. Давайте вместе разберем, что означает эта ошибка, почему она возникает и как мы можем ее устранить.
Суть ошибки заключается в расхождении между метаданными (описанием структуры объектов) в конфигурации 1С и фактической структурой таблиц в базе данных. Таблицы с префиксом _RefSInf (от англ. Reference System Information) являются вспомогательными системными таблицами, предназначенными для хранения информации о предопределенных элементах справочников. Например, для справочника с внутренним идентификатором 19993 (который в СУБД может называться _Reference19993), таблица предопределенных данных будет иметь имя _RefSInf19993.
Прежде чем перейти к решению, давайте выясним основные причины, по которым эта ошибка может появиться:
refslnf часто связана именно с предопределенными элементами. Если предопределенный элемент отсутствует в данных, это означает, что система пытается найти элемент справочника, который был предопределен в конфигурации, но не найден в базе данных.Важно: Всегда выполняйте любые манипуляции с базой данных только после создания актуальной резервной копии! Это ваш страховочный трос.
Первым шагом нам необходимо понять, какой именно справочник или другой объект метаданных связан с отсутствующей таблицей _RefSInf19993. Для этого мы можем использовать служебную функцию ПолучитьСтруктуруХраненияБазыДанных().
Мы можем написать небольшой фрагмент кода, который поможет нам найти соответствие между именем таблицы в СУБД и объектом метаданных 1С. Откройте конфигуратор, создайте новую внешнюю обработку или воспользуйтесь консолью кода.
Рассмотрим пример кода, который позволит нам вычислить название объекта метаданных:
ТекстСообщения = "";
ЧтоИщем = "_RefSInf19993"; // Замените на имя вашей проблемной таблицы
// Получаем структуру хранения базы данных
СтруктураХранения = ПолучитьСтруктуруХраненияБазыДанных(, Истина);
// Ищем таблицу по имени хранения
Для Каждого Таблица Из СтруктураХранения Цикл
Если Таблица.ИмяТаблицыХранения = ЧтоИщем Тогда
ТекстСообщения = Таблица.ИмяТаблицыХранения + " соответствует: " + Таблица.Назначение;
// Теперь ЧтоИщем будет содержать объект метаданных (например, "Справочник.Валюты")
ЧтоИщем = Таблица.Метаданные;
Прервать;
КонецЕсли;
КонецЦикла;
// Если нашли, ищем связанные таблицы по метаданным
Если Не ПустаяСтрока(ТекстСообщения) Тогда
Для Каждого Таблица Из СтруктураХранения Цикл
Если Таблица.Метаданные = ЧтоИщем Тогда
ТекстСообщения = ТекстСообщения + " (Метаданные: " + Таблица.Метаданные + ", Таблица хранения: " + Таблица.ИмяТаблицыХранения + ")";
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Сообщить(ТекстСообщения);
Этот код выведет сообщение, которое укажет, к какому справочнику или другому объекту метаданных относится отсутствующая таблица. Например, вы можете получить что-то вроде: _RefSInf19993 соответствует: Справочник.Валюты (Метаданные: Справочник.Валюты, Таблица хранения: _Reference19993).
Для более удобного анализа всей структуры базы данных, мы можем вывести результат функции ПолучитьСтруктуруХраненияБазыДанных() в табличный документ. Это позволит нам просмотреть все таблицы и их соответствия объектам метаданных.
Рассмотрим пример кода для обработки, который выведет структуру в табличный документ:
&НаСервереБезКонтекста
Функция ДанныеТаблицыЗначенийВТабличныйДокумент(ДанныеДляВывода)
ТабличныйДокумент = Новый ТабличныйДокумент;
Построитель = Новый ПостроительОтчета;
Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ДанныеДляВывода);
Построитель.Вывести(ТабличныйДокумент);
Возврат ТабличныйДокумент;
КонецФункции
&НаСервере
Функция ПолучитьСтруктуруБДНаСервере()
ТаблицаСтруктураХранения = ПолучитьСтруктуруХраненияБазыДанных(, Истина);
ТабДок = ДанныеТаблицыЗначенийВТабличныйДокумент(ТаблицаСтруктураХранения);
Возврат ТабДок;
КонецФункции
&НаКлиенте
Процедура ПолучитьСтруктуруБД(Команда)
ТабДок = ПолучитьСтруктуруБДНаСервере();
ТабДок.Показать();
КонецПроцедуры
Этот код можно разместить в новой внешней обработке. Добавьте на форму кнопку, при нажатии на которую будет вызываться процедура ПолучитьСтруктуруБД. Мы увидим табличный документ со всей информацией о таблицах базы данных. В нем мы сможем найти строку с ИмяТаблицыХранения, соответствующим _RefSInf19993, и определить, к какому Назначению (объекту метаданных) она относится.
После того как мы определили, к какому справочнику относится проблемная таблица (например, Справочник.Валюты), мы можем приступить к "шаманству", которое часто помогает в таких случаях.
Этот метод основан на том, что платформа 1С при изменении структуры предопределенных элементов в конфигурации может пересоздать или обновить соответствующие системные таблицы в базе данных.
_RefSInf19993 относится к справочнику Справочник.Валюты.Справочники -> Валюты). Перейдите на вкладку "Предопределенные" и добавьте любой новый предопределенный элемент. Дайте ему уникальное имя, например, "ВременныйЭлемент".F7 или "Конфигурация" -> "Обновить конфигурацию базы данных"). Платформа 1С проанализирует изменения и, возможно, пересоздаст отсутствующую таблицу..dt или запуск 1С в режиме предприятия). Если ошибка исчезла, значит, метод сработал.Важный момент: Если ваша конфигурация находится на поддержке, убедитесь, что вы не нарушаете целостность поставки. Если предопределенные элементы были утрачены, и конфигурация на поддержке, мы можем их взять из конфигурации поставщика.
В некоторых случаях, хотя и не всегда для _RefSInf ошибок, стандартное тестирование и исправление базы данных может помочь. Запустите 1С в режиме конфигуратора, перейдите в меню "Администрирование" -> "Тестирование и исправление...".
Мы рекомендуем включить следующие опции:
Для ошибки с отсутствующей таблицей _RefSInf особенно важна "Проверка логической целостности информационной базы", так как она может выявить расхождения в структуре. Однако, как мы выяснили, иногда именно эта проверка в определенных версиях платформы могла сама удалять пустые таблицы предопределенных данных, усугубляя проблему.
Если вышеуказанные методы не помогли или вы столкнулись с множеством аналогичных ошибок по разным таблицам, восстановление из актуальной резервной копии является самым надежным и быстрым способом вернуть работоспособность системы. Мы настоятельно рекомендуем регулярно создавать резервные копии.
В особо сложных случаях, когда самостоятельные действия не приносят результата, а база содержит множество таких ошибок (как в одном из примеров, где было более 30 аналогичных таблиц), мы рекомендуем обратиться в службу поддержки 1С. Специалисты 1С обладают инструментами и опытом для ручного пересоздания структур таблиц и проведения комплексного тестирования и исправления. Это подтверждается опытом пользователей, когда 1С вручную пересоздавала структуры и прогоняла ТиИ.
Ошибка "в базе отсутствует таблица _RefSInfXXXXX" является серьезным сигналом о нарушении целостности структуры базы данных, чаще всего связанным с предопределенными элементами справочников. Мы с вами рассмотрели пошаговый подход к ее решению:
ПолучитьСтруктуруХраненияБазыДанных() для определения, какой объект метаданных связан с отсутствующей таблицей.Помните, что регулярное резервное копирование — это лучшая защита от подобных проблем. Мы желаем вам успешного решения этой и других задач с 1С:Предприятие!
← К списку