Как исправить ошибку «arithmetic overflow error converting numeric to data type numeric» при пересчете бухгалтерских итогов в 1С 7.7?

Программист 1С v7.7 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

При выполнении регламентной процедуры пересчета бухгалтерских итогов в среде 1С:Предприятие 7.7 при работе с СУБД Microsoft SQL Server пользователи нередко сталкиваются с критической ошибкой «arithmetic overflow error converting numeric to data type numeric». Данное сообщение свидетельствует о том, что при агрегации числовых значений в таблицах итогов итоговая сумма, количество или валютный эквивалент превысили максимальную разрядность, определенную для соответствующего поля в структуре реляционной базы данных.

Разберем детально причины возникновения этой неполадки, а также рассмотрим пошаговые методы ее диагностики и устранения.

Причины возникновения ошибки

Проанализируем механику работы механизма бухгалтерских итогов платформы 1С 7.7. Во время пересчета итогов платформа выполняет последовательное суммирование проводок по счетам, субсчетам и субконто, записывая свернутые остатки и обороты в специализированные системные таблицы (такие как _1SBKTTL, _1SBKTTLC, _1SACCBAL). Ошибка переполнения возникает в следующих случаях:

  1. Недостаточная разрядность в метаданных: если в свойствах плана счетов, операций или проводок задана длина числового поля (например, 14 знаков при точности 2 знака), то при накоплении оборотов за длительный период сумма итогов может превысить допустимый предел NUMERIC(14, 2).
  2. Переполнение количественного или валютного учета: аналогичная проблема возникает при недостаточно настроенной длине полей количества или валютной суммы при больших оборотах.
  3. Ошибочные даты в документах: наличие в базе документов с датами из далекого будущего (например, опечатка при вводе года — 2099 или 3000 год) заставляет алгоритм рассчитывать итоги на десятилетия вперед, что приводит к лавинообразному росту расчетных оборотов.
  4. Аномальные значения в проводках: некорректно импортированные данные или сбои в расчетных формулах внешних обработок могут записать в таблицу проводок _1SENTRY сверхбольшие суммы.

Способ 1. Увеличение разрядности числовых полей в конфигураторе

Рассмотрим основной способ решения, который устраняет нехватку разрядности при суммировании оборотов:

  1. Создадим резервную копию информационной базы (дамп SQL или выгрузку данных).
  2. Запустим 1С:Предприятие 7.7 в режиме Конфигуратор.
  3. Откроем дерево метаданных и перейдем к свойствам бухгалтерского учета: проверим настройки параметров операции и проводки.
  4. Найдем параметры «Длина суммы» и «Точность суммы». Если была установлена длина 14, увеличим ее до максимально поддерживаемого платформой значения — 18 знаков (при точности 2 знака).
  5. В свойствах плана счетов также проверим параметры «Длина количества» и «Длина валютной суммы». При необходимости увеличим их длину.
  6. Сохраним изменения в конфигурации и выполним реструктуризацию таблиц информационной базы. В СУБД тип колонок автоматически изменится на NUMERIC(18, N).
  7. Запустим режим «1С:Предприятие» и повторно выполним полный пересчет бухгалтерских итогов.

Важно помнить: максимальная длина числового типа данных в платформе 1С 7.7 ограничена 18 символами (включая дробную часть). Это предельный размер типа NUMERIC(18, N) на стороне Microsoft SQL Server.

Способ 2. Поиск аномальных значений и некорректных дат через SQL

Если расширение разрядности не помогло или требуется выявить конкретный первичный документ, вызвавший переполнение, выполним прямой анализ базы через SQL Server Management Studio (SSMS).

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


SELECT TOP 50 
    DOCID, 
    DATE_TIME_DOC, 
    SUM_, 
    CURVAL, 
    QTY 
FROM _1SENTRY 
ORDER BY SUM_ DESC;

Проанализируем даты документов в журнале _1SJOURN на наличие ошибочных периодов из будущего:


SELECT 
    IDDOC, 
    DOCNO, 
    DATE_TIME_DOC 
FROM _1SJOURN 
WHERE DATE_TIME_DOC > '20300101'
ORDER BY DATE_TIME_DOC DESC;

Если такие документы обнаружены, исправим их даты непосредственно через интерфейс программы или скорректируем ошибочные движения.

Способ 3. Очистка таблиц итогов перед пересчетом

В ситуациях, когда в таблицах итогов накопились поврежденные промежуточные данные, пересчет может завершаться аварийно. В таком случае очистим таблицы итогов средствами SQL и рассчитаем их заново:

  1. Остановим работу всех пользователей с информационной базой.
  2. Выполним в SSMS команды усечения таблиц итогов:
    
    TRUNCATE TABLE _1SBKTTL;
    TRUNCATE TABLE _1SBKTTLC;
    TRUNCATE TABLE _1SACCBAL;
    
  3. Запустим 1С:Предприятие в монопольном режиме и откроем пункт меню «Операции» —> «Управление бухгалтерскими итогами».
  4. Запустим полный пересчет итогов с момента начала ведения учета.

Способ 4. Свертка информационной базы

Если база данных эксплуатируется на протяжении многих лет без архивации, нарастающие обороты по активно-пассивным счетам могут физически подойти к пределу 18 разрядов. В этом случае единственным надежным решением является проведение регламентной свертки информационной базы: перенос входящих остатков на начало выбранного финансового года с последующим удалением неактуальных исторических документов и проводок.

← На главную