При выполнении регламентных операций, таких как Тестирование и исправление или Пересчет итогов, специалисты нередко сталкиваются с критической ошибкой: Ошибка SDBL: Операция + не может выполняться над значениями доменных типов. Данная проблема является системной и указывает на глубокий конфликт на уровне Simple Data Access Layer (SDBL) — внутреннего механизма платформы 1С, который транслирует запросы к базе данных. В этой статье мы подробно разберем причины возникновения этой ситуации и рассмотрим пошаговые алгоритмы её решения.
Прежде всего, проанализируем, что скрывается за этим сообщением. Ошибка возникает в тот момент, когда платформа пытается выполнить арифметическую операцию (чаще всего суммирование итогов в регистрах) над полями, типы которых несовместимы или содержат некорректные значения с точки зрения СУБД. Рассмотрим основные технические причины:
ОБЪЕДИНИТЬ ВСЕ, где одна из колонок содержит NULL без явного приведения типа, и над этой колонкой далее совершаются арифметические действия, SDBL может дать сбой.ВалютаРегламентированногоУчета). Если константа не заполнена, в SQL-запрос может попасть неопределенное значение, вызывающее конфликт типов._Totals на уровне SQL.Если ошибка «валит» конфигуратор сразу при запуске пересчета итогов, нам необходимо выяснить, на какой именно таблице происходит сбой. Рассмотрим, как это сделать с помощью настройки Технологического журнала (ТЖ). Создадим файл logcfg.xml в каталоге установки платформы (в папке conf) со следующим содержанием:
<config xmlns="http://v8.1c.ru/7.4/config">
<log location="C:\LOGS\SDBL_Error" history="2">
<event>
<eq property="Name" value="SDBL"/>
</event>
<event>
<eq property="Name" value="EXCP"/>
</event>
<property name="all"/>
</log>
</config>
Запустим процесс, вызывающий ошибку, и проанализируем полученные логи. В файлах журнала ищем событие EXCP, которое предшествует завершению работы. Там будет указано имя таблицы (например, _AccumRegTotals123). Зная имя таблицы в базе данных, мы сможем легко вычислить соответствующий объект метаданных (Регистр накопления, Регистр бухгалтерии и т.д.) через ПолучитьСтруктуруХраненияБазыДанных().
Как показывает практика, иногда решение кроется в простых вещах. Выясним, все ли обязательные параметры учета заполнены. Проанализируем ситуацию на примере конфигурации БГУ или Розница:
Рассмотрим пример кода для быстрой проверки пустых констант:
Процедура ПроверитьКритичныеКонстанты()
Если НЕ ЗначениеЗаполнено(Константы.ВалютаРегламентированногоУчета.Получить()) Тогда
Сообщить("Внимание: Не заполнена основная валюта учета!");
КонецЕсли;
КонецПроцедуры
Если мы точно определили, что ошибка возникает в конкретном регистре (например, РегистрБухгалтерии.Хозрасчетный), а стандартное ТиИ не справляется, воспользуемся методом «пересоздания» объекта. Рассмотрим этот алгоритм по шагам:
Этот радикальный метод заставляет платформу полностью пересоздать физические таблицы в СУБД, что устраняет любые накопленные ошибки в структуре _Totals и _TotalsFull.
Посмотрим, что можно сделать, если база находится в файловом или клиент-серверном варианте, и стандартные средства 1С бессильны.
Для файловой базы: Попробуем запустить утилиту chdbfl.exe (находится в папке bin платформы). Установим флаг «Исправлять обнаруженные ошибки». Это поможет, если в колонках с числовыми данными физически записаны некорректные байты, которые SDBL не может интерпретировать.
Для клиент-серверной базы (MS SQL Server / PostgreSQL): Если проблема локализована в итогах регистра, мы можем принудительно очистить таблицы итогов средствами СУБД. Платформа 1С позволяет хранить итоги отдельно от движений. Выполним следующие действия:
_AccumRegT123).TRUNCATE TABLE _AccumRegT123;Важно: Операция TRUNCATE удаляет данные из таблицы безвозвратно, но так как это таблица итогов, 1С сможет восстановить их на основании таблицы движений (_AccumReg123) при следующем запуске пересчета.
Проанализируем еще один эффективный способ лечения базы. Часто ошибка SDBL «лечится» простым циклом выгрузки-загрузки. Рассмотрим последовательность действий:
.dt..dt в новую базу.В процессе реструктуризации платформа создает временные таблицы, переносит в них данные, типизирует их заново и удаляет старые таблицы. Это самый надежный способ «причесать» доменные типы на уровне SDBL.
Мы рассмотрели основные способы борьбы с ошибкой Операция + не может выполняться над значениями доменных типов. Подведем итоги: чаще всего проблема вызвана либо логическими пропусками в данных (незаполненные валюты, аналитики), либо физическим повреждением структуры итогов.
Для профилактики подобных сбоев рекомендуем:
Используя предложенные методы, вы сможете успешно диагностировать и устранить ошибку SDBL, вернув работоспособность системе.