При выполнении регламентной процедуры закрытия месяца и расчета себестоимости в конфигурациях «1С:Управление торговлей» (УТ 11), «1С:Комплексная автоматизация» или «1С:ERP» пользователи и программисты могут столкнуться с аварийным завершением операции. В журнале регистрации или в окне сообщений появляется исключение следующего вида:
{ОбщийМодуль.РасчетСебестоимости.Модуль(5398)}: Ошибка при вызове метода контекста (Выполнить)
Выборка = Запрос.Выполнить().Выбрать();
по причине:
Ошибка выполнения запроса
по причине:
Ошибка при выполнении операции над данными:
Ошибка SQL: Переполнение поля
Разберем детально механику возникновения этой ошибки, проанализируем типовой запрос и выясним, какие шаги необходимо предпринять для устранения проблемы.
В типовом модуле РасчетСебестоимости при формировании движений корректировки себестоимости выполняется пакетный запрос, в котором вычисляются суммовые показатели. Посмотрим на фрагмент типового запроса:
ВЫБРАТЬ
ТаблицаКорректировки.Период КАК Период,
ТаблицаКорректировки.ДокументДвижения КАК ДокументДвижения,
ТаблицаКорректировки.АналитикаУчетаНоменклатуры КАК АналитикаУчетаНоменклатуры,
ТаблицаКорректировки.Организация КАК Организация,
ВЫРАЗИТЬ(ТаблицаКорректировки.Количество * СтоимостьТоваров.Стоимость КАК ЧИСЛО(15,2)) КАК Стоимость,
ВЫРАЗИТЬ(ТаблицаКорректировки.Количество * СтоимостьТоваров.СтоимостьБезНДС КАК ЧИСЛО(15,2)) КАК СтоимостьБезНДС,
ВЫРАЗИТЬ(ТаблицаКорректировки.Количество * СтоимостьТоваров.СтоимостьРегл КАК ЧИСЛО(15,2)) КАК СтоимостьРегл
ИЗ
ВтТаблицаКорректировки КАК ТаблицаКорректировки
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТКэшСтоимостьТоваров КАК СтоимостьТоваров
ПО СтоимостьТоваров.АналитикаУчетаНоменклатуры = ТаблицаКорректировки.АналитикаУчетаНоменклатуры
И СтоимостьТоваров.ВидЗапасов = ТаблицаКорректировки.ВидЗапасов
И СтоимостьТоваров.Организация = ТаблицаКорректировки.Организация
И СтоимостьТоваров.РазделУчета = ТаблицаКорректировки.РазделУчета
Конструкция ВЫРАЗИТЬ(... КАК ЧИСЛО(15,2)) транслируется СУБД в жестко ограниченный числовой тип NUMERIC(15,2) или DECIMAL(15,2). Максимальное число, которое может вместить такое поле, составляет 9 999 999 999 999.99. Если в результате математических операций (умножение количества на вычисленную стоимость единицы) получается число с большим количеством разрядов в целой части, сервер СУБД генерирует ошибку «Arithmetic overflow error» (Переполнение поля).
В учетной системе реальные суммы редко достигают триллионных значений. Переполнение возникает по одной из следующих прикладных причин:
КлючиАналитикиУчетаНоменклатуры или КлючиАналитикиУчетаПоПартнерам, из-за чего соединение таблиц во временных кэшах размножает строки.Для устранения ошибки нам необходимо найти конкретную номенклатурную позицию или ключ аналитики, на котором происходит скачок стоимости:
РасчетСебестоимости непосредственно перед выполнением проблемного запроса.ВТКэшСтоимостьТоваров.
ВЫБРАТЬ * ИЗ ВТКэшСтоимостьТоваров
ГДЕ Стоимость > 1000000000 ИЛИ Стоимость < -1000000000
КлючиАналитикиУчетаНоменклатуры определим конкретную номенклатуру, характеристику и склад.После определения виновника сбоя выполним исправление данных за расчетный месяц:
Рассмотрим рекомендации по проведению регламентных операций: