Как исправить ошибку SDBL "Таблица или поле DimHash не содержится в разделе FROM" при обновлении?

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

При переходе на новые релизы платформы 1С (особенно версии 8.3.25 и 8.3.26) или обновлении крупных конфигураций, таких как 1С:ERP или Комплексная автоматизация, администраторы и программисты могут столкнуться с неприятной ошибкой SDBL. Сообщение об ошибке выглядит примерно так: "Таблица или поле DimHash не содержится в разделе FROM". Эта ошибка блокирует процесс реструктуризации базы данных, делая обновление невозможным.

В этой статье мы подробно разберем природу этой ошибки, выясним, почему она возникает, и рассмотрим несколько проверенных способов её устранения, включая диагностику через Технологический журнал и "народные" методы обхода через файловый вариант работы.

Что такое DimHash и почему возникает ошибка?

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

Ошибка возникает из-за рассинхронизации между структурой таблиц, ожидаемой платформой, и реальной структурой в базе данных SQL. Часто это происходит при смене режима совместимости конфигурации или обновлении платформы, когда меняются алгоритмы работы с индексами и итогами. Генератор запросов платформы пытается обратиться к полю DimHash для пересчета итогов или агрегатов, но физически в таблице SQL это поле либо отсутствует, либо не может быть сопоставлено в текущем контексте запроса.

Способ 1. "Лечение" через файловую базу (Самый надежный метод)

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

Разберем алгоритм действий:

  1. Сделайте полный бэкап вашей базы данных SQL (средствами SQL Server).
  2. Выгрузите информационную базу в файл .dt через Конфигуратор (Администрирование -> Выгрузить информационную базу).
  3. Создайте пустую файловую базу на мощном компьютере (операция может потребовать много оперативной памяти и быстрого SSD, так как базы ERP обычно большие).
  4. Загрузите полученный .dt файл в эту файловую базу.
  5. Запустите Конфигуратор файловой базы и выполните обновление конфигурации БД (то действие, на котором в SQL вылетала ошибка).
  6. Важный шаг: После обновления запустите "Тестирование и исправление" в меню "Администрирование". Выберите пункты "Реструктуризация таблиц информационной базы" и "Пересчет итогов". Это гарантированно пересоздаст внутренние таблицы движка.
  7. После успешного завершения процедур выгрузите базу обратно в файл .dt.
  8. Загрузите исправленный .dt обратно в вашу SQL базу (желательно в чистую базу, чтобы таблицы создались с нуля).

Этот метод пересоздает физическую структуру таблиц, и поле DimHash формируется корректно.

Способ 2. Диагностика через Технологический журнал

Если вариант с выгрузкой в файловую базу невозможен (например, база слишком велика, 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>

Как анализировать лог:

  1. После появления ошибки при обновлении откройте созданные логи (папки вида rphost_...).
  2. Используйте поиск по файлу (Ctrl+F) по слову DimHash.
  3. Вы найдете текст SQL-запроса, который вызвал ошибку. Он будет выглядеть примерно так: SELECT ... DimHash FROM _AccumRg12345 ...
  4. Обратите внимание на имя таблицы, например _AccumRg12345.
  5. Теперь нужно понять, какому объекту метаданных соответствует эта таблица. Для этого можно воспользоваться функцией ПолучитьСтруктуруХраненияБазыДанных() в 1С.

Пример кода для поиска имени регистра по имени таблицы SQL:


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

Способ 3. Исправление структуры регистра

Когда мы нашли проблемный регистр (чаще всего это Регистр накопления), у нас есть несколько вариантов действий, чтобы заставить платформу корректно пересоздать таблицу.

Вариант А: Отключение агрегатов

Так как поле DimHash связано с агрегатами, попробуйте следующее:

  1. В конфигураторе найдите проблемный регистр.
  2. Откройте его свойства и перейдите на вкладку "Данные".
  3. Если используется механизм агрегатов, попробуйте временно отключить их использование или очистить список агрегатов.
  4. Попробуйте обновить конфигурацию БД.

Вариант Б: Изменение типа измерений (Принудительная реструктуризация)

Этот метод заставляет платформу выполнить операции DROP TABLE и CREATE TABLE вместо ALTER TABLE, что часто решает проблему "кривой" структуры.

  1. В проблемном регистре выберите одно из измерений (желательно не самое важное, но влияющее на структуру).
  2. Измените его тип (например, если это СправочникСсылка, сделайте его Составным типом, добавив туда Число или Строку).
  3. Сохраните и обновите конфигурацию БД (реструктуризация пройдет с предупреждением о потере данных или изменении типа — будьте внимательны, на копии это безопасно для теста).
  4. Если обновление прошло успешно, верните тип измерения обратно и обновитесь еще раз.

Вариант В: Перенос в расширение

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

Рекомендации по профилактике

Проанализируем, почему это происходит, чтобы избежать проблем в будущем:

Применяя эти методы, вы сможете преодолеть ошибку с полем DimHash и успешно завершить обновление вашей системы.

← На главную