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

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

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

Ошибка сопровождается техническим описанием: Microsoft SQL Server Native Client 11.0: Столбец или параметр #3: указанная точность столбца 44 превышает максимальную допустимую точность 38. HRESULT=80040E14, SQLSrvr: SQLSTATE=42000. В этой статье мы подробно разберем, почему это происходит и как устранить данную проблему в серверном варианте информационной базы.

Анализ причины возникновения ошибки

Проанализируем техническую природу сбоя. Данная ошибка напрямую связана с работой технологической платформы 1С:Предприятие 8.3.12 (в частности, релизов типа 8.3.12.1412) и ее взаимодействием с СУБД Microsoft SQL Server. Рассмотрим механизм трансляции запросов: когда 1С выполняет агрегатную функцию СУММА (SUM) для числовых полей, SQL Server пытается автоматически определить точность (количество знаков) итогового результата.

В архитектуре MS SQL Server тип данных numeric ограничен максимальной точностью в 38 знаков. Однако из-за ошибки в программном коде платформы 1С версии 8.3.12, при выполнении сложных запросов с объединениями и итогами, система запрашивает у SQL Server создание временной таблицы или выборки с точностью 44 знака. Поскольку СУБД не может обработать число такой точности, она возвращает ошибку, что приводит к падению сеанса 1С.

Выясним, почему это наиболее остро проявляется именно в «Подборе сотрудников». Форма подбора в ЗУП 3.1 — это сложный механизм. В момент выбора сотрудника система динамически рассчитывает множество финансовых показателей: задолженность, суммы к выплате, остатки по регистрам накопления. Все эти данные суммируются «на лету». Именно при закрытии формы происходит окончательный расчет итогов для переноса в документ, что и провоцирует ошибочный SQL-запрос.

Способ №1: Обновление платформы до исправленной версии

Разберем самый эффективный и официальный метод решения. Фирма «1С» признала данную проблему ошибкой платформы с кодом 10193122. Исправление было включено в последующие релизы. Проанализируем шаги по обновлению системы:

  1. Выбор стабильного релиза. Хотя первые исправления появились в версии 8.3.12.1469, данный релиз имел свои недостатки. Для стабильной работы ЗУП 3.1 рекомендуется использовать платформу версии 8.3.12.1529, 8.3.12.1625 или переходить на более современные ветки, например, 8.3.13 или 8.3.14.
  2. Резервное копирование. Перед обновлением обязательно создаем полную копию информационной базы и выгрузку в формат .dt.
  3. Установка новой версии. Устанавливаем новую технологическую платформу на сервер и рабочие станции пользователей.
  4. Очистка серверного кэша. После обновления платформы крайне важно очистить кэш сервера 1С:Предприятия. Для этого останавливаем службу 1C:Enterprise 8.3 Server Agent, переходим в каталог C:\Program Files\1cv8\srvinfo и удаляем содержимое папок с временными данными (имена папок выглядят как UID баз).

Способ №2: Временный откат на стабильную ветку платформы

Рассмотрим ситуацию, когда быстрое обновление до последних релизов невозможно по техническим причинам или из-за несовместимости с другим ПО. В таком случае эффективным решением будет откат на более раннюю, но стабильную ветку платформы 8.3. Например, версия 8.3.10.2732 не содержит ошибки с расчетом точности numeric и корректно работает с ЗУП 3.1.

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

Способ №3: Использование программного обхода (для разработчиков)

Если у вас есть доступ к конфигуратору и вы готовы вносить изменения в код (при условии, что конфигурация не находится на полной поддержке), можно применить программный обход. Рассмотрим, как ограничить точность вычислений принудительно. Для этого в запросах, которые вызывают падение, необходимо использовать конструкцию ВЫРАЗИТЬ.

Например, если ошибка возникает в запросе при суммировании ресурса СуммаЗарплаты, код запроса следует изменить следующим образом:


ВЫБРАТЬ
    ВЫРАЗИТЬ(СУММА(ТЗ.СуммаЗарплаты) КАК ЧИСЛО(15, 2)) КАК ИтоговаяСумма
ИЗ
    РегистрНакопления.ЗарплатаКВыплате КАК ТЗ
ГРУППИРОВАТЬ ПО
    ТЗ.Сотрудник

Использование функции ВЫРАЗИТЬ(Значение КАК ЧИСЛО(15, 2)) жестко фиксирует точность числа на уровне метаданных 1С. При трансляции в SQL-запрос платформа уже не будет пытаться «раздуть» точность до 44 знаков, а передаст четкий параметр numeric(15, 2), который гарантированно входит в лимит 38 знаков SQL Server.

Дополнительные рекомендации по настройке СУБД

Проанализируем настройки самой СУБД. Иногда ошибка проявляется более явно при использовании определенных драйверов подключения. Посмотрим на используемый провайдер в строке соединения. По умолчанию 1С использует SQL Server Native Client 11.0.

В некоторых случаях системные администраторы замечали, что замена драйвера на более старый Native Client 10.0 или, наоборот, установка последних пакетов обновлений для SQL Server (Service Packs) снижала частоту возникновения ошибок трансляции типов, однако это не является панацеей и лишь маскирует проблему платформы.

Также рекомендуем выполнить процедуру Тестирование и исправление через конфигуратор со следующими параметрами:

Подводя итог, можно сказать, что проблема носит чисто технологический характер. Совместная работа ЗУП 3.1 и платформы 8.3.12 на MS SQL Server требует обязательного контроля версий ПО. Наилучшим решением остается обновление платформы до актуальных релизов, где механизм генерации агрегатных функций SQL был пересмотрен разработчиками 1С.

← На главную