Как исправить ошибку «в базе отсутствует таблица refslnf» при выгрузке или обновлении 1С?

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

При работе с информационными базами 1С:Предприятие 8.3 администраторы и разработчики иногда сталкиваются с критической ошибкой СУБД: «в базе отсутствует таблица refslnf...» (например, refslnf19993). Эта проблема блокирует выгрузку файла .dt, мешает корректному обновлению конфигурации и часто не устраняется стандартными средствами, такими как chdbfl.exe или обычное «Тестирование и исправление». Рассмотрим подробно, почему возникает эта ошибка и как её исправить, восстановив целостность структуры данных в рамках защищенной IT инфраструктуры на базе Astra Linux и PostgresSQL.

Выясним причину возникновения ошибки

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

Основной причиной исчезновения таких таблиц является ошибка в самой технологической платформе (например, в версиях 8.3.24.1667, 8.3.25.1374 и некоторых других). При проведении процедуры «Тестирования и исправления» с включенным флажком «Проверка логической целостности» платформа может ошибочно удалять пустые таблицы предопределенных данных для объектов, использующих разделение данных или специфические настройки обновления. В результате конфигурация «думает», что таблица должна быть, а физически в СУБД её нет.

Шаг 1: Идентификация проблемного объекта метаданных

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

Рассмотрим пример кода, который поможет нам быстро найти виновника. Создадим внешнюю обработку и выполним следующий фрагмент:


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

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

Если ЗначениеЗаполнено(Текст) Тогда
    Сообщить(Текст);
Иначе
    Сообщить("Объект не найден. Проверьте правильность написания имени таблицы.");
КонецЕсли;

Разберем, что делает этот код: он сканирует всю физическую структуру базы данных и сопоставляет внутренние имена таблиц СУБД с именами объектов метаданных (справочниками, документами и т.д.). После выполнения мы узнаем, что, например, таблица 19993 соответствует справочнику Валюты.

Шаг 2: Восстановление таблицы через Конфигуратор

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

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

Проанализируем ситуацию: если после этого при попытке выгрузки .dt возникает ошибка уже с другим номером таблицы, значит, в базе повреждено несколько объектов. Процедуру восстановления таблиц нужно повторить для каждого выявленного справочника.

Шаг 3: Программный способ (для массового исправления)

Если справочников много, ручное добавление элементов может занять длительное время. Разберем, как можно автоматизировать этот процесс с помощью метода УстановитьОбновлениеПредопределенныхДанных. Этот метод программно управляет состоянием обновления служебных таблиц.

Попробуем выполнить следующий код для проблемного справочника:


// Заменяем "Валюты" на имя вашего справочника
ИмяСправочника = "Валюты";
Справочники[ИмяСправочника].УстановитьОбновлениеПредопределенныхДанных(ОбновлениеПредопределенныхДанных.Авто);

После выполнения данного кода необходимо зайти в конфигуратор и запустить обновление конфигурации базы данных. Платформа пересчитает связи предопределенных данных и восстановит структуру.

Шаг 4: Решение для клиент-серверного варианта (SQL)

Если ваша база работает на MS SQL Server или PostgreSQL, и вы не боитесь работать с консолью запросов СУБД, можно создать таблицу вручную. Таблицы _RefSInf имеют очень простую структуру. Чтобы эффективно выявлять подобные проблемы на уровне СУБД, можно анализировать SQL сервер глазами 1С-ника с помощью специальных инструментов.

Разберем пример для MS SQL Server. Если не хватает таблицы _RefSInf19993, выполните следующий SQL-запрос в контексте вашей базы данных:


CREATE TABLE _RefSInf19993 (
    [_IDRRef] binary(16) NOT NULL
)
GO

Важно: После создания «пустышки» в SQL обязательно запустите Тестирование и исправление в режиме 1С. Также убедитесь, что у вас настроены регламентные операции MS SQL SERVER под 1С, чтобы поддерживать базу в оптимальном состоянии. Платформа увидит физическую таблицу и сможет корректно заполнить её данными или зарегистрировать её наличие.

Профилактика проблемы

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

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

← На главную