Как исправить ошибку СУБД в 1С «точность столбца 44 превышает максимальную допустимую точность 38»?

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

При работе в клиент-серверном режиме программы «1С:Предприятие» пользователи могут столкнуться с внезапным аварийным завершением работы системы при выполнении повседневных операций. Особенно часто эта проблема проявляется в конфигурации «Зарплата и управление персоналом» (ЗУП) редакции 3.1 при попытке автоматического заполнения или проведения документов выплат, таких как ВедомостьВБанк, ВедомостьВКассу или ВедомостьНаВыплатуЗарплатыВЛимиты.

В момент нажатия на кнопку «Заполнить» программа выдает критическое окно с ошибкой СУБД:

«Microsoft SQL Server Native Client 11.0: Столбец или параметр #3: указанная точность столбца 44 превышает максимальную допустимую точность 38. HRESULT=80040E14, SQLSrvr: SQLSTATE=42000, state=1, Severity=10, native=2750, line=1»

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

Выясняем причину: почему MS SQL блокирует запрос 1С?

Для того чтобы понять природу этой ошибки, нам необходимо обратиться к архитектуре хранения числовых данных в СУБД Microsoft SQL Server. Рассмотрим ключевые факторы:

  1. Ограничение Microsoft SQL Server: В СУБД MS SQL Server для числовых типов данных с фиксированной точностью (decimal и numeric) существует жесткое системное ограничение. Максимальная разрядность (точность или precision), определяющая общее количество десятичных цифр, которые могут храниться в поле как слева, так и справа от запятой, составляет ровно 38 знаков. Любая попытка создать таблицу, переменную или столбец с точностью более 38 знаков вызывает ошибку компиляции SQL-запроса с кодом native=2750.
  2. Внутренний баг платформы 1С: При заполнении ведомостей в ЗУП система выполняет сложные многоступенчатые расчеты на уровне СУБД. Платформа 1С динамически генерирует SQL-запросы с использованием временных таблиц, в которых вычисляются агрегатные показатели (суммы, средние значения, распределение НДФЛ и округления). Из-за ошибки в механизме трансляции запросов (компиляторе запросов 1С) в релизах платформы ветки 8.3.12 (включая популярные сборки 8.3.12.1240, 8.3.12.1412 и 8.3.12.1440) для результирующих полей агрегатов ошибочно рассчитывается и запрашивается точность в 44 знака.
  3. Конфликт типов: Платформа отправляет SQL-серверу команду на создание временной таблицы со столбцом типа NUMERIC(44, 10). SQL Server видит, что число 44 превышает лимит в 38, блокирует запрос и возвращает ошибку SQLSTATE=42000. Сеанс пользователя аварийно завершается.

Ниже приведен абстрактный пример фрагмента некорректного SQL-запроса, который пытается выполнить платформа 1С с нарушением ограничений СУБД:


-- Пример некорректного запроса, генерируемого платформой на сервере БД
CREATE TABLE #TempPayrollDetails (
    EmployeeID binary(16) NOT NULL,
    CalculatedAmount NUMERIC(44, 10) NOT NULL, -- Ошибка! Точность 44 превышает допустимый предел 38
    TaxAmount NUMERIC(15, 2) NOT NULL
);

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

Парадокс «Базовой» версии на SQL

В обсуждениях данной проблемы часто упоминается, что ошибка возникла на конфигурации «Зарплата и управление персоналом (базовая)». Проанализируем этот момент подробнее. Официально базовые версии любых конфигураций 1С предназначены для работы исключительно в однопользовательском файловом режиме. Они технически не поддерживают работу в клиент-серверном (SQL) варианте.

Если вы столкнулись с ошибкой SQL на базовой версии, это свидетельствует об одном из двух сценариев:

В любом случае, методы решения проблемы на уровне SQL-сервера будут одинаковыми для любой конфигурации.

Инструкция по решению проблемы

Рассмотрим подробнее три основных способа устранения этой ошибки: от радикального и правильного до временных обходных путей.

Способ 1: Обновление технологической платформы 1С (Рекомендуемый метод)

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

Выполним следующие шаги по обновлению:

  1. Завершим работу всех активных пользователей в базе данных.
  2. Остановим службу сервера «1С:Предприятие» (1C:Enterprise 8.3 Server Agent) через консоль управления службами Windows (services.msc).
  3. Выполним резервное копирование баз данных непосредственно на SQL-сервере (создадим full backup через SQL Server Management Studio) и дополнительно выгрузим файл конфигурации (.dt).
  4. Скачаем актуальный стабильный релиз платформы с официального портала поддержки (рекомендуется использовать версии веток 8.3.15, 8.3.18, 8.3.22 или выше, в зависимости от требований вашей конфигурации ЗУП). Ошибка полностью устранена во всех релизах, вышедших после ветки 8.3.12.1440.
  5. Установим новую версию платформы на сервер и на рабочие станции пользователей.
  6. Запустим службу сервера 1С и проверим заполнение документа ВедомостьВБанк. Ошибка должна исчезнуть.

Способ 2: Временный обход через файловый режим (Если нужно выдать зарплату «прямо сейчас»)

Если у вас нет возможности незамедлительно провести технические работы по обновлению серверной платформы, а сотрудникам необходимо срочно выплатить заработную плату, применим временный обходной путь.

Разберем этот процесс по шагам:

  1. В режиме «1С:Предприятие (Конфигуратор)» выполним выгрузку информационной базы в файл резервной копии. Для этого перейдем в меню Администрирование — Выгрузить информационную базу... и сохраним файл с расширением .dt на локальный диск.
  2. Создадим на локальном компьютере новую пустую базу данных в файловом режиме (указав создание базы без конфигурации в пустом каталоге).
  3. Откроем созданную файловую базу в режиме «Конфигуратор» и загрузим в неё ранее сохраненный файл через меню Администрирование — Загрузить информационную базу....
  4. Запустим полученную локальную базу в режиме «1С:Предприятие». Поскольку файловый движок не имеет жесткого ограничения на точность в 38 знаков, откроем нужный документ ВедомостьВБанк, нажмем кнопку «Заполнить», рассчитаем суммы и успешно проведем документ.
  5. После проведения документа снова зайдем в локальный «Конфигуратор» и сделаем выгрузку базы в файл .dt.
  6. Загрузим этот файл обратно на SQL-сервер.

Важное предупреждение: данный метод подходит только в качестве экстренной разовой меры. Во время проведения этой процедуры никто из пользователей не должен работать в основной SQL-базе, чтобы не потерять внесенные изменения.

Способ 3: Откат на предыдущую стабильную версию платформы

Если по каким-то причинам переход на новые версии платформы (например, на ветку 8.3.13 и выше) невозможен из-за требований других используемых в компании конфигураций, можно выполнить временный даунгрейд платформы до версии 8.3.11 (например, до финальных релизов этой ветки). В архитектуре ветки 8.3.11 ошибка с неверным расчетом точности числовых полей отсутствовала, и клиент-серверный вариант работы с MS SQL Server на ней функционирует корректно.

Мы проанализировали причины возникновения ошибки СУБД с превышением точности столбца в 1С и изучили методы борьбы с ней. Наиболее надежным и правильным долгосрочным решением является плановое обновление технологической платформы до актуальных поддерживаемых релизов.

← На главную