При активной работе в программах на платформе «1С:Предприятие 8.3» (особенно часто это проявляется в конфигурациях «1С:Зарплата и управление персоналом 3.1» и «1С:ERP Управление предприятием») администраторы и разработчики могут столкнуться с внезапным аварийным завершением работы системы. Платформа закрывается, предлагая записать дамп, либо выдает подробное сообщение об ошибке взаимодействия с СУБД:
Microsoft SQL Server Native Client 11.0: Column or parameter #3: Specified column precision 44 is greater than the maximum precision of 38. HRESULT=80040E14, SQLSrv: SQLSTATE=42000, state=1, Severity=10, native=2750
В этой статье мы подробно разберем, почему возникает эта ошибка, проанализируем физические ограничения систем управления базами данных и рассмотрим три надежных способа решения данной проблемы.
Для того чтобы понять природу этой неисправности, обратимся к внутренним механизмам взаимодействия платформы 1С и СУБД Microsoft SQL Server. При выполнении сложных расчетов (например, при автоматическом заполнении документа Ведомость в банк, подборе сотрудников или расчете страховых взносов) конфигурация выполняет тяжелые запросы с множественными соединениями таблиц, расчетом долей и агрегированием числовых данных.
Платформа 1С транслирует внутренний язык запросов в стандартный диалект T-SQL, понятный серверу баз данных. В процессе этой трансляции для промежуточных вычислений и временных таблиц динамически определяются типы данных числовых полей.
В СУБД MS SQL Server для хранения точных числовых значений с плавающей точкой используются типы данных decimal и numeric. Эти типы имеют два ключевых параметра:
Согласно официальной спецификации Microsoft SQL Server (начиная с версии 2008 и заканчивая самыми современными релизами), максимальная физически поддерживаемая точность (precision) для этих типов данных составляет строго 38 знаков.
Из-за внутренней программной ошибки в механизме трансляции запросов (компиляторе SQL-запросов) платформы 1С версии 8.3.12 (в частности, в релизах 8.3.12.1412 и 8.3.12.1440) система формирует некорректный запрос к СУБД. Платформа пытается принудительно типизировать одно из вычисляемых полей как число с точностью 44 знака (например, numeric(44, 15)). СУБД MS SQL Server отвергает такой запрос как некорректный и возвращает ошибку с кодом 2750, в результате чего сеанс работы пользователя аварийно завершается.
Поскольку проблема носит исключительно системный характер и вызвана ошибкой в коде самой платформы, наиболее правильным и долгосрочным решением является обновление технологической платформы 1С на сервере приложений и на всех клиентских рабочих станциях.
Данная ошибка была официально зарегистрирована под номером 000041723 и полностью устранена разработчиками фирмы «1С».
Проанализируем шаги по устранению проблемы с помощью обновления:
8.3.14, 8.3.16 или актуальной 8.3.22/8.3.23 в зависимости от требований используемой конфигурации).Агент сервера 1С:Предприятия.Ведомость в банк. Ошибка больше не повторится, так как новый транслятор запросов корректно ограничивает максимальную точность вычисляемых полей тридцатью восемью знаками.Если ошибка застала вас врасплох в период сдачи отчетности или выплаты заработной платы, когда времени на согласование и проведение полноценного обновления платформы на серверах компании нет, можно применить экстренный обходной путь.
Данная ошибка возникает исключительно на стороне клиент-серверного СУБД MS SQL Server. Встроенный движок файловой базы данных 1С (файл 1Cv8.1CD) использует собственные алгоритмы математических вычислений и не имеет жесткого ограничения на точность промежуточных трансляций в 38 знаков. В файловом варианте базы данных этот алгоритм отрабатывает без ошибок.
Рассмотрим по шагам, как временно провести документы в файловом режиме:
.dt. Для этого перейдем в меню Администрирование — Выгрузить информационную базу....Предприятие, перейдем в нужный документ и выполним его заполнение и проведение. Расчет заполнится корректно и без сбоев..dt и загрузим ее на SQL-сервер. Важно: этот метод подходит только как разовая экстренная мера, так как при любой следующей аналогичной операции расчета на сервере SQL ошибка проявится снова до тех пор, пока не будет обновлена платформа.В процессе обсуждения проблемы часто возникает вопрос о возможности откатить версию конфигурации (сделать даунгрейд, например, вернуть ЗУП с версии 3.1.5.222 на стабильную 3.1.5.170). Рассмотрим этот аспект подробнее.
Простое использование функции «Загрузить конфигурацию из файла» (загрузка старого файла .cf поверх новой базы данных) в случае с крупными учетными решениями, такими как ЗУП или ERP, крайне не рекомендуется по следующим причинам:
Если вам абсолютно необходимо вернуть базу к предыдущему релизу конфигурации, единственным корректным способом является восстановление базы данных из резервной копии (бэкапа), сделанного непосредственно перед обновлением. При этом все данные, введенные пользователями после обновления, придется переносить вручную или с помощью специализированных обработок выгрузки-загрузки данных через XML.
Поэтому в ситуации с ошибкой precision 44 откат конфигурации является нецелесообразным. Гораздо быстрее, проще и безопаснее обновить саму технологическую платформу 1С до стабильного релиза.