При работе в клиент-серверном режиме программы «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»
В этой статье мы подробно разберем, почему возникает данная ошибка, проанализируем её техническую природу и рассмотрим пошаговые методы её устранения.
Для того чтобы понять природу этой ошибки, нам необходимо обратиться к архитектуре хранения числовых данных в СУБД Microsoft SQL Server. Рассмотрим ключевые факторы:
decimal и numeric) существует жесткое системное ограничение. Максимальная разрядность (точность или precision), определяющая общее количество десятичных цифр, которые могут храниться в поле как слева, так и справа от запятой, составляет ровно 38 знаков. Любая попытка создать таблицу, переменную или столбец с точностью более 38 знаков вызывает ошибку компиляции SQL-запроса с кодом native=2750.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-сервер.
В обсуждениях данной проблемы часто упоминается, что ошибка возникла на конфигурации «Зарплата и управление персоналом (базовая)». Проанализируем этот момент подробнее. Официально базовые версии любых конфигураций 1С предназначены для работы исключительно в однопользовательском файловом режиме. Они технически не поддерживают работу в клиент-серверном (SQL) варианте.
Если вы столкнулись с ошибкой SQL на базовой версии, это свидетельствует об одном из двух сценариев:
В любом случае, методы решения проблемы на уровне SQL-сервера будут одинаковыми для любой конфигурации.
Рассмотрим подробнее три основных способа устранения этой ошибки: от радикального и правильного до временных обходных путей.
Поскольку проблема носит системный характер и вызвана ошибкой в коде самой платформы, разработчики фирмы 1С оперативно выпустили исправление в последующих релизах. Для полного устранения ошибки необходимо обновить технологическую платформу «1С:Предприятие» до стабильной версии.
Выполним следующие шаги по обновлению:
1C:Enterprise 8.3 Server Agent) через консоль управления службами Windows (services.msc)..dt).ВедомостьВБанк. Ошибка должна исчезнуть.Если у вас нет возможности незамедлительно провести технические работы по обновлению серверной платформы, а сотрудникам необходимо срочно выплатить заработную плату, применим временный обходной путь.
Разберем этот процесс по шагам:
.dt на локальный диск.ВедомостьВБанк, нажмем кнопку «Заполнить», рассчитаем суммы и успешно проведем документ..dt.Важное предупреждение: данный метод подходит только в качестве экстренной разовой меры. Во время проведения этой процедуры никто из пользователей не должен работать в основной SQL-базе, чтобы не потерять внесенные изменения.
Если по каким-то причинам переход на новые версии платформы (например, на ветку 8.3.13 и выше) невозможен из-за требований других используемых в компании конфигураций, можно выполнить временный даунгрейд платформы до версии 8.3.11 (например, до финальных релизов этой ветки). В архитектуре ветки 8.3.11 ошибка с неверным расчетом точности числовых полей отсутствовала, и клиент-серверный вариант работы с MS SQL Server на ней функционирует корректно.
Мы проанализировали причины возникновения ошибки СУБД с превышением точности столбца в 1С и изучили методы борьбы с ней. Наиболее надежным и правильным долгосрочным решением является плановое обновление технологической платформы до актуальных поддерживаемых релизов.