Как исправить ошибку «Ошибка SQL: Переполнение поля» при расчете себестоимости в 1С:Управление торговлей?

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

При выполнении регламентной процедуры закрытия месяца и расчета себестоимости в конфигурациях «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» (Переполнение поля).

В учетной системе реальные суммы редко достигают триллионных значений. Переполнение возникает по одной из следующих прикладных причин:

  1. Зацикливание расчета себестоимости (петли движений): наличие циклических перемещений товара между складами (Склад 1 $\rightarrow$ Склад 2 $\rightarrow$ Склад 1) или встречных продаж между организациями схемы Интеркампани внутри одного месяца. Решение системы линейных уравнений при отсутствии явной базы приводит к лавинообразному умножению расчетной цены до бесконечности.
  2. Отрицательные остатки на складах: списание товара «в минус» или возникновение пересортицы. При отсутствии базовой стоимости партии алгоритм может выполнять деление на околонулевое количество, порождая гигантскую себестоимость единицы.
  3. Задвоение данных (декартово произведение): нарушение целостности справочников КлючиАналитикиУчетаНоменклатуры или КлючиАналитикиУчетаПоПартнерам, из-за чего соединение таблиц во временных кэшах размножает строки.
  4. Битая ссылочная целостность: наличие некорректных записей (пустые аналитики, объект не найден) в регистрах учета себестоимости.

Шаг 1: Локализация проблемной позиции

Для устранения ошибки нам необходимо найти конкретную номенклатурную позицию или ключ аналитики, на котором происходит скачок стоимости:

  1. Запустим сеанс «1С:Предприятие» в режиме отладки.
  2. Установим точку останова в общем модуле РасчетСебестоимости непосредственно перед выполнением проблемного запроса.
  3. С помощью встроенного отладчика или выгрузки временных таблиц в Консоль запросов проанализируем содержимое таблицы ВТКэшСтоимостьТоваров.
  4. Выполним выборку с отбором по аномальным суммам:
    
    ВЫБРАТЬ * ИЗ ВТКэшСтоимостьТоваров 
    ГДЕ Стоимость > 1000000000 ИЛИ Стоимость < -1000000000
    
  5. По полученной ссылке на справочник КлючиАналитикиУчетаНоменклатуры определим конкретную номенклатуру, характеристику и склад.

Шаг 2: Проверка и корректировка учетных данных

После определения виновника сбоя выполним исправление данных за расчетный месяц:

  1. Контроль отрицательных остатков: сформируем отчеты «Ведомость по товарам на складах» и «Остатки товаров организаций». Убедимся, что на дату любого расхода остаток товара строго положительный. Если найдены отрицательные остатки — исправим последовательность проведения документов или оформим оприходование излишков.
  2. Разрыв циклических цепочек: проверим документы «Перемещение товаров» и «Передача товаров между организациями». Если обнаружена круговая передача одной и той же позиции в рамках одного месяца, временно скорректируем дату одного из документов (перенесем на следующий период) либо вручную зафиксируем входящую стоимость.
  3. Тестирование и исправление: запустим процедуру «Тестирование и исправление информационной базы» в конфигураторе с установленными флагами «Проверка логической целостности» и «Проверка ссылочной целостности» для очистки битых записей аналитики.

Шаг 3: Последовательное закрытие и обновление

Рассмотрим рекомендации по проведению регламентных операций:

  1. Помесячный пересчет: не запускайте пересчет себестоимости сразу за несколько месяцев или за год. Закрывайте каждый месяц строго по очереди, проверяя корректность отчетов валовой прибыли после каждого закрытия.
  2. Переход на актуальные релизы: в версиях УТ 11.3, 11.4 и 11.5 механизм распределения затрат и решения систем уравнений был существенно переработан разработчиками. В него встроены программные ограничения, предотвращающие расхождение алгоритма и зацикливание при встречных потоках.
← На главную