При переходе на новые версии платформы 1С:Предприятие (особенно при обновлении с версий ниже 8.3.21 на 8.3.24 и выше) мы часто сталкиваемся с неприятными ошибками уровня SDBL (Schema Data Base Layer). Это ошибки рассогласования между тем, как платформа "видит" структуру метаданных в конфигурации, и тем, какие таблицы реально существуют в базе данных (SQL или файловой).
В этой статье мы подробно разберем две распространенные ошибки, обсуждаемые в сообществе:
RefSInf19574).Проанализируем причины их возникновения и рассмотрим пошаговые методы устранения.
Таблица DataHistorySettingsExt отвечает за хранение настроек механизма "История данных" для объектов, добавленных или заимствованных в расширениях конфигурации. Проблема чаще всего возникает, когда расширение было создано или работало на старой версии платформы (например, 8.3.20 или ниже), а затем база была переведена на новую платформу (8.3.22, 8.3.23, 8.3.24) без корректной конвертации структуры хранения настроек истории.
Платформа ожидает увидеть новую структуру таблицы для расширений, но физически в базе данных она не создалась.
Если ошибка возникает при попытке открыть документ или справочник, добавленный в расширении, давайте попробуем заставить платформу пересоздать необходимую структуру, понизив требования к расширению.
Выполним следующие шаги:
Если ошибка ушла, можно попробовать постепенно повышать режим совместимости обратно, контролируя поведение системы.
Этот метод считается одним из самых действенных, так как он заставляет платформу явно сгенерировать недостающие таблицы в базе данных. Суть метода заключается в изменении метаданных таким образом, чтобы платформа инициировала реструктуризацию таблиц истории.
Проделаем следующие действия:
Важно: В момент обновления конфигурации БД платформа обнаружит, что для объекта включена история, и попытается создать или обновить соответствующие таблицы, включая злополучную DataHistorySettingsExt. После успешного сохранения проверьте работоспособность в режиме Предприятия.
Иногда внутренняя структура расширения может быть повреждена настолько, что простые изменения свойств не помогают. В таких случаях мы рекомендуем пересоздать расширение на текущей версии платформы.
Действуем так:
Вторая распространенная проблема — сообщение вида "В схеме базы данных нет таблицы с именем RefSInfXXXXX". Эта ошибка имеет другую природу. Таблицы с префиксом RefSInf (Reference Storage Info) или _RefSInf в SQL отвечают за хранение информации о предопределенных элементах метаданных (справочников, планов видов характеристик и т.д.).
Причина: Это подтвержденная ошибка платформы 1С (зарегистрирована под кодом 60011839). В версиях платформы 8.3.24.1346–8.3.24.1667 процедура "Тестирование и исправление" (ТиИ) с проверкой логической целостности ошибочно удаляла пустые таблицы предопределенных данных, считая их мусором. Это особенно актуально для баз, использующих разделение данных (или имеющих признаки разделения).
Поскольку проблема с удалением таблиц RefSInf является программной ошибкой конкретных релизов, первым делом необходимо обновить платформу.
Рекомендуемые версии:
После обновления платформы обязательно выполните "Тестирование и исправление" (Администрирование -> Тестирование и исправление) со следующими галочками:
В исправленных версиях платформы этот процесс должен восстановить недостающие таблицы.
Если обновление платформы недоступно или не помогает, можно воспользоваться методом ручного пересоздания таблиц через манипуляции с конфигурацией. Для этого нам сначала нужно выяснить, какая именно таблица 1С соответствует отсутствующей таблице SQL.
Воспользуемся встроенной функцией ПолучитьСтруктуруХраненияБазыДанных(), чтобы найти проблемный объект метаданных.
Создадим простую внешнюю обработку и выполним код:
ТаблицыБД = ПолучитьСтруктуруХраненияБазыДанных(, Истина);
Для Каждого СтрокаТаблицы Из ТаблицыБД Цикл
// Ищем имя таблицы, на которую ругается ошибка (например, RefSInf26550)
// Обратите внимание, что в сообщении об ошибке имя может быть без подчеркивания,
// а в базе данных с подчеркиванием. Ищем по вхождению.
Если Найти(СтрокаТаблицы.ИмяТаблицыХранения, "RefSInf") > 0 Тогда
Сообщить("Таблица: " + СтрокаТаблицы.ИмяТаблицыХранения + " -> Метаданные: " + СтрокаТаблицы.Метаданные);
КонецЕсли;
КонецЦикла;
Этот код выведет список соответствия. Например, мы узнаем, что RefSInf26550 относится к справочнику ИдентификаторыОбъектовМетаданных.
Зная проблемный справочник, выполним следующие действия (обязательно сделайте резервную копию перед началом!):
ИдентификаторыОбъектовМетаданных).Более безопасный вариант из практики (сообщение 22):
RefSInf заново.Если у вас клиент-серверный вариант работы и есть доступ к SQL Server Management Studio, а также имеется резервная копия базы (сделанная до возникновения ошибки), можно восстановить таблицу напрямую.
Порядок действий:
_RefSInf19574).Ошибки DataHistorySettingsExt и RefSInf являются следствием рассинхронизации схемы данных при обновлениях. Для DataHistorySettingsExt обычно помогает переключение флага "История данных" или пересоздание расширения. Для RefSInf — обновление платформы до исправленного релиза и реструктуризация, либо сложные манипуляции со снятием с поддержки и возвратом метаданных.