Исправление ошибки арифметического переполнения при преобразовании numeric к типу данных numeric при расчете себестоимости
В данной статье описывается один из способов исправления ошибки арифметического переполнения при преобразовании numeric к типу данных numeric, с которой не раз сталкивались многие люди, занимающиеся расчетом себестоимости в базах с большим объёмом данных.
- Описание
- Подробнее
Описание
Многие люди, занимающиеся расчетом себестоимости в базах с большим объёмом данных, не раз сталкивались со следующей ошибкой:
Microsoft SQL Server Native Client 11.0:Ошибка арифметического переполнения при преобразовании numeric к типу данных numeric.
HRESULT=80040E57, SQLSrvr: SQLSTATE=22003, state=8, Severity=10, native=8115, line=1
Особенно часто (судя по личному опыту и темам форумов) данная ошибка появляется при проведении документа «Расчет себестоимости товаров», когда не хватает знаков до запятой при использоании в запросах функции ВЫРАЗИТЬ и происходит потеря значащих цифр при вычислении значения. Один из самых простых и быстрых вариантов решения следующий:
- Запускаем проведение проблемного документа расчета с/с в режиме отладки и дожидаемся ошибки.
- Смотрим, на какой строке кода происходит ошибка, и идём в конфигуратор. В моём случае это была строка 2519: Запрос.ВыполнитьПакет()[1].Выбрать() модуля объекта документа «Расчет себестоимости»
- В тексте запроса ищем функцию ВЫРАЗИТЬ
- Если есть строчки ВЫРАЗИТЬ(<ВыбранноеПоле> КАК ЧИСЛО (23,10)) изменяем их на ВЫРАЗИТЬ(<ВыбранноеПоле> КАК ЧИСЛО (25,10)) и радуемся результату
В моём случае текст запроса был изменен следующим образом:
"ВЫБРАТЬ
| УзлыКорректировки.НомерУзла КАК НомерУзла,
| ВЫРАЗИТЬ(МАКСИМУМ(УзлыКорректировки.Стоимость) КАК ЧИСЛО(25, 10)) КАК СвободныйКоэффициент,
| ВЫРАЗИТЬ(МАКСИМУМ(УзлыКорректировки.СтоимостьБезНДС) КАК ЧИСЛО(25, 10)) КАК СвободныйКоэффициентБезНДС,
| ВЫРАЗИТЬ(МАКСИМУМ(УзлыКорректировки.ПостояннаяРазница) КАК ЧИСЛО(25, 10)) КАК СвободныйКоэффициентПостояннаяРазница,
| ВЫРАЗИТЬ(МАКСИМУМ(УзлыКорректировки.ВременнаяРазница) КАК ЧИСЛО(25, 10)) КАК СвободныйКоэффициентВременнаяРазница,
| ВЫРАЗИТЬ(МАКСИМУМ(УзлыКорректировки.СтоимостьДопРасходы) КАК ЧИСЛО(25, 10)) КАК СвободныйКоэффициентДопрасходы,
| ВЫРАЗИТЬ(МАКСИМУМ(УзлыКорректировки.СтоимостьДопРасходыБезНДС) КАК ЧИСЛО(25, 10)) КАК СвободныйКоэффициентДопрасходыБезНДС,
| МИНИМУМ(УзлыКорректировки.ВременнаяРазницаЗнак * ЕСТЬNULL(ВтТаблицаРешений.ВременнаяРазницаЗнак, 1)) КАК ВременнаяРазницаЗнак,
| МИНИМУМ(УзлыКорректировки.ПостояннаяРазницаЗнак * ЕСТЬNULL(ВтТаблицаРешений.ПостояннаяРазницаЗнак, 1)) КАК ПостояннаяРазницаЗнак,
| (ВЫРАЗИТЬ(СУММА(ЕСТЬNULL(ВтТаблицаРешений.Стоимость, 0) * ЕСТЬNULL(ПеремещенияСписания.Количество, 0)) КАК ЧИСЛО(25, 10))) / УзлыКорректировки.Количество КАК Стоимость,
| (ВЫРАЗИТЬ(СУММА(ЕСТЬNULL(ВтТаблицаРешений.СтоимостьБезНДС, 0) * ЕСТЬNULL(ПеремещенияСписания.Количество, 0)) КАК ЧИСЛО(25, 10))) / УзлыКорректировки.Количество КАК СтоимостьБезНДС,
| (ВЫРАЗИТЬ(СУММА(ЕСТЬNULL(ВтТаблицаРешений.ПостояннаяРазница, 0) * ЕСТЬNULL(ПеремещенияСписания.Количество, 0)) КАК ЧИСЛО(25, 10))) / УзлыКорректировки.Количество КАК ПостояннаяРазница,
| (ВЫРАЗИТЬ(СУММА((ЕСТЬNULL(ВтТаблицаРешений.ВременнаяРазница, 0) + ВЫБОР
| КОГДА ПеремещенияСписания.КосвенныеЗатратыНУ
| ТОГДА ЕСТЬNULL(ВтТаблицаРешений.Стоимость, 0)
| ИНАЧЕ 0
| КОНЕЦ + ВЫБОР
| КОГДА ПеремещенияСписания.КосвенныеЗатратыНУ
| ТОГДА ЕСТЬNULL(ВтТаблицаРешений.СтоимостьДопРасходы, 0)
| ИНАЧЕ 0
| КОНЕЦ) * ЕСТЬNULL(ПеремещенияСписания.Количество, 0)) КАК ЧИСЛО(25, 10))) / УзлыКорректировки.Количество КАК ВременнаяРазница,
| (ВЫРАЗИТЬ(СУММА(ЕСТЬNULL(ВтТаблицаРешений.СтоимостьДопРасходы, 0) * ЕСТЬNULL(ПеремещенияСписания.Количество, 0)) КАК ЧИСЛО(25, 10))) / УзлыКорректировки.Количество КАК СтоимостьДопРасходы,
| (ВЫРАЗИТЬ(СУММА(ЕСТЬNULL(ВтТаблицаРешений.СтоимостьДопРасходыБезНДС, 0) * ЕСТЬNULL(ПеремещенияСписания.Количество, 0)) КАК ЧИСЛО(25, 10))) / УзлыКорректировки.Количество КАК СтоимостьДопРасходыБезНДС
|ПОМЕСТИТЬ ВременнаяТаблицаРешений
|ИЗ
| ВтУзлыКорректировки КАК УзлыКорректировки
| ЛЕВОЕ СОЕДИНЕНИЕ ВтПеремещенияСписания КАК ПеремещенияСписания
| ПО УзлыКорректировки.НомерУзла = ПеремещенияСписания.НомерУзлаПриемник
| ЛЕВОЕ СОЕДИНЕНИЕ ВтТаблицаРешений КАК ВтТаблицаРешений
| ПО (ПеремещенияСписания.НомерУзлаИсточник = ВтТаблицаРешений.НомерУзла)
|ГДЕ
| УзлыКорректировки.Количество <> 0
| И ЕСТЬNULL(ВтТаблицаРешений.Стоимость, 0) * ЕСТЬNULL(ПеремещенияСписания.Количество, 0) > -999999999.999999999
| И ЕСТЬNULL(ВтТаблицаРешений.Стоимость, 0) * ЕСТЬNULL(ПеремещенияСписания.Количество, 0) < 999999999.999999999
|
|СГРУППИРОВАТЬ ПО
| УзлыКорректировки.НомерУзла,
| УзлыКорректировки.Количество
|
|ИНДЕКСИРОВАТЬ ПО
| НомерУзла
|;
|

