При выполнении регламентной процедуры пересчета бухгалтерских итогов в среде 1С:Предприятие 7.7 при работе с СУБД Microsoft SQL Server пользователи нередко сталкиваются с критической ошибкой «arithmetic overflow error converting numeric to data type numeric». Данное сообщение свидетельствует о том, что при агрегации числовых значений в таблицах итогов итоговая сумма, количество или валютный эквивалент превысили максимальную разрядность, определенную для соответствующего поля в структуре реляционной базы данных.
Разберем детально причины возникновения этой неполадки, а также рассмотрим пошаговые методы ее диагностики и устранения.
Проанализируем механику работы механизма бухгалтерских итогов платформы 1С 7.7. Во время пересчета итогов платформа выполняет последовательное суммирование проводок по счетам, субсчетам и субконто, записывая свернутые остатки и обороты в специализированные системные таблицы (такие как _1SBKTTL, _1SBKTTLC, _1SACCBAL). Ошибка переполнения возникает в следующих случаях:
NUMERIC(14, 2)._1SENTRY сверхбольшие суммы.Рассмотрим основной способ решения, который устраняет нехватку разрядности при суммировании оборотов:
NUMERIC(18, N).Важно помнить: максимальная длина числового типа данных в платформе 1С 7.7 ограничена 18 символами (включая дробную часть). Это предельный размер типа NUMERIC(18, N) на стороне Microsoft SQL Server.
Если расширение разрядности не помогло или требуется выявить конкретный первичный документ, вызвавший переполнение, выполним прямой анализ базы через 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;
Если такие документы обнаружены, исправим их даты непосредственно через интерфейс программы или скорректируем ошибочные движения.
В ситуациях, когда в таблицах итогов накопились поврежденные промежуточные данные, пересчет может завершаться аварийно. В таком случае очистим таблицы итогов средствами SQL и рассчитаем их заново:
TRUNCATE TABLE _1SBKTTL;
TRUNCATE TABLE _1SBKTTLC;
TRUNCATE TABLE _1SACCBAL;
Если база данных эксплуатируется на протяжении многих лет без архивации, нарастающие обороты по активно-пассивным счетам могут физически подойти к пределу 18 разрядов. В этом случае единственным надежным решением является проведение регламентной свертки информационной базы: перенос входящих остатков на начало выбранного финансового года с последующим удалением неактуальных исторических документов и проводок.