При переходе на новые релизы платформы 1С (особенно версии 8.3.25 и 8.3.26) или обновлении крупных конфигураций, таких как 1С:ERP или Комплексная автоматизация, администраторы и программисты могут столкнуться с неприятной ошибкой SDBL. Сообщение об ошибке выглядит примерно так: "Таблица или поле DimHash не содержится в разделе FROM". Эта ошибка блокирует процесс реструктуризации базы данных, делая обновление невозможным.
В этой статье мы подробно разберем природу этой ошибки, выясним, почему она возникает, и рассмотрим несколько проверенных способов её устранения, включая диагностику через Технологический журнал и "народные" методы обхода через файловый вариант работы.
Прежде чем приступать к лечению, давайте поймем причину. DimHash — это служебное поле (хэш измерений), которое платформа 1С использует на уровне СУБД (SQL) для оптимизации работы регистров накопления, в частности, для механизма агрегатов.
Ошибка возникает из-за рассинхронизации между структурой таблиц, ожидаемой платформой, и реальной структурой в базе данных SQL. Часто это происходит при смене режима совместимости конфигурации или обновлении платформы, когда меняются алгоритмы работы с индексами и итогами. Генератор запросов платформы пытается обратиться к полю DimHash для пересчета итогов или агрегатов, но физически в таблице SQL это поле либо отсутствует, либо не может быть сопоставлено в текущем контексте запроса.
Этот метод помогает в большинстве случаев, когда ошибка вызвана внутренними проблемами структур SQL, которые движок файловой базы данных 1С способен "простить" или исправить автоматически при реструктуризации.
Разберем алгоритм действий:
.dt через Конфигуратор (Администрирование -> Выгрузить информационную базу)..dt файл в эту файловую базу..dt..dt обратно в вашу SQL базу (желательно в чистую базу, чтобы таблицы создались с нуля).Этот метод пересоздает физическую структуру таблиц, и поле DimHash формируется корректно.
Если вариант с выгрузкой в файловую базу невозможен (например, база слишком велика, 500 Гб+), нам необходимо найти конкретный проблемный регистр. Стандартный журнал регистрации эту ошибку не фиксирует подробно. Нам потребуется настроить Технологический журнал (ТЖ).
Мы будем ловить события исключений (EXCP) и выполнения запросов к СУБД, чтобы увидеть, на какой таблице происходит сбой.
Создадим файл конфигурации logcfg.xml. Обычно он располагается в папке C:\Program Files\1cv8\conf (путь может отличаться в зависимости от разрядности сервера).
Пример настройки ТЖ для поиска ошибки:
<?xml version="1.0" encoding="UTF-8"?>
<config xmlns="http://v8.1c.ru/v8/tech-log">
<log location="C:\logs\1c" history="24">
<event>
<eq property="Name" value="EXCP"/>
</event>
<event>
<eq property="Name" value="DBMSSQL"/>
<!-- Фильтр по тексту ошибки, чтобы не писать лишнее -->
<like property="Sql" value="%DimHash%"/>
</event>
<property name="all"/>
</log>
</config>
Как анализировать лог:
rphost_...).DimHash.
SELECT ... DimHash FROM _AccumRg12345 ...
_AccumRg12345.ПолучитьСтруктуруХраненияБазыДанных() в 1С.Пример кода для поиска имени регистра по имени таблицы SQL:
СтруктураБД = ПолучитьСтруктуруХраненияБазыДанных(, Истина);
Для Каждого СтрокаТаблицы Из СтруктураБД Цикл
Если СтрокаТаблицы.ИмяТаблицыХранения = "_AccumRg12345" Тогда
Сообщить("Проблемный регистр: " + СтрокаТаблицы.Метаданные);
КонецЕсли;
КонецЦикла;
Когда мы нашли проблемный регистр (чаще всего это Регистр накопления), у нас есть несколько вариантов действий, чтобы заставить платформу корректно пересоздать таблицу.
Так как поле DimHash связано с агрегатами, попробуйте следующее:
Этот метод заставляет платформу выполнить операции DROP TABLE и CREATE TABLE вместо ALTER TABLE, что часто решает проблему "кривой" структуры.
В некоторых обсуждениях помогает вынесение проблемного объекта в расширение с изменением его свойств там, но это более сложный путь, который стоит использовать, если предыдущие не помогли.
Проанализируем, почему это происходит, чтобы избежать проблем в будущем:
SDBL до того, как вы начнете обновлять "боевую" базу.Применяя эти методы, вы сможете преодолеть ошибку с полем DimHash и успешно завершить обновление вашей системы.