Переход с платформы «1С:Управление торговлей 10.3» на современную версию 11 — это сложный процесс, который часто сопровождается техническими сбоями. Чтобы упростить эту задачу, многие специалисты используют проверенные решения для перехода с УТ 10.3 на УТ 11.5 с переносом остатков и справочников. Одной из самых неприятных ошибок является Arithmetic overflow error converting numeric to data type numeric, возникающая при выгрузке цен номенклатуры. В этой статье мы подробно разберем, почему возникает эта ошибка и как её устранить, изменив правила обмена или очистив данные в исходной базе.
Разберем ситуацию: при использовании типовой обработки выгрузки, когда активен флаг Регистрация последних цен номенклатуры (ПВД РегистрацияПоследнихЦенНоменклатуры), процесс прерывается сообщением об ошибке Microsoft OLE DB Driver для SQL Server. Ошибка Arithmetic overflow (арифметическое переполнение) означает, что в процессе выполнения SQL-запроса система пытается записать число в переменную или поле таблицы, разрядность которого меньше, чем разрядность самого числа.
Проанализируем техническую сторону: в типовых правилах обмена часто используются временные таблицы SQL с жестко заданными типами данных, например, NUMERIC(15, 2). Если в вашей базе УТ 10.3 есть цена, расчетный коэффициент или результат пересчета валюты, который превышает 13 знаков до запятой или имеет слишком много знаков после неё, SQL-сервер не может выполнить операцию преобразования и «выбрасывает» исключение. Если вам требуется максимально полный перенос, включая старые записи, лучше использовать комплект для сквозного переноса всей истории цен номенклатуры, который учитывает специфику разных версий конфигураций.
Рассмотрим самый надежный способ решения — внесение изменений в текст запроса правил обмена. Это потребует использования конфигурации «Конвертация данных 2.0» или редактирования XML-файла правил вручную.
Проанализируем ситуацию: ошибка часто возникает при попытке системы округлить или преобразовать цену. Чтобы принудительно ограничить разрядность числа на уровне запроса, мы должны использовать конструкцию ВЫРАЗИТЬ. Найдем в правилах выгрузки данных (ПВД) запрос к регистру сведений ЦеныНоменклатуры и модифицируем поля, отвечающие за стоимость.
Пример модификации кода запроса:
ВЫБРАТЬ
ЦеныНоменклатуры.Номенклатура,
ЦеныНоменклатуры.ТипЦен,
ВЫРАЗИТЬ(ЦеныНоменклатуры.Цена КАК ЧИСЛО(15, 2)) КАК Цена,
ЦеныНоменклатуры.Валюта
ИЗ
РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период, ) КАК ЦеныНоменклатуры
ГДЕ
ЦеныНоменклатуры.Цена > 0
Применяя ВЫРАЗИТЬ(... КАК ЧИСЛО(15, 2)), мы гарантируем, что в приемник попадет число, соответствующее формату SQL-сервера. Это предотвратит попытки драйвера преобразовать «бесконечные» дроби или слишком большие числа, которые могли возникнуть из-за некорректного ввода данных пользователями.
Посмотрим на проблему с другой стороны. Часто ошибка переполнения — это лишь следствие наличия в базе некорректных данных. Выясним, какие записи могут приводить к сбою:
999 999 999 999,99, введенные случайно или для тестирования.Для прямого извлечения данных без использования стандартного XML-обмена можно применить обработку для выгрузки остатков и цен из УТ 10.3 в УТ 11.5 по COM соединению, которая часто стабильнее работает с проблемными данными.
Для поиска таких записей в УТ 10.3 выполним следующие шаги:
Цены номенклатуры.Цена — найдем все значения, которые больше 1 000 000 000.Валюты на предмет наличия нулевых курсов или кратности.Если такие записи найдены, их необходимо исправить или удалить перед повторным запуском выгрузки.
Разберем ситуацию, когда править правила обмена слишком трудозатратно или нет доступа к «Конвертации данных». В последних релизах УТ 11.5 (например, 11.5.17) механизмы регистрации цен стали более требовательными. Мы можем применить тактику «разделяй и властвуй»:
Этот метод позволяет избежать конфликтов на уровне SQL-запросов драйвера OLE DB, так как система будет загружать уже готовые числа из таблицы, а встроенные механизмы УТ 11 сами обработают округление при записи в новые регистры.
Проанализируем особенности новых версий. В релизах 11.5 структура хранения цен изменилась — теперь активно используются объекты РегистрацияЦенНоменклатуры. Если вы используете старую обработку выгрузки из состава дистрибутива, она может не учитывать новые требования к точности данных. При необходимости перегрузить не только цены, но и историю поступлений, используйте инструменты для выгрузки остатков и документов из УТ 10.3 в УТ 11.5.
Также стоит рассмотреть возможность заполнения документа «Установка цен номенклатуры» на основании приобретений товаров уже после переноса основных документов. Это позволит сформировать актуальные цены на базе реальных закупок, совершенных в переходный период.
Помните: всегда делайте резервную копию базы перед внесением изменений в правила или массовым удалением «плохих» цен. Если ошибка сохраняется даже после типизации в запросе, обратите внимание на обработчик события ПередОбработкойВыгрузкиДанных в ПВД. Там могут содержаться алгоритмы на языке 1С, которые выполняют дополнительные расчеты (например, наценку), и именно в них может потребоваться добавление функции Окр().
Совместными усилиями, используя типизацию данных в запросах и проверку чистоты исходной базы, мы сможем успешно завершить переход на УТ 11 без потерь важной информации о ценообразовании.