При работе в программе 1С:Управление торговлей 11.3, особенно в файловом варианте базы данных, пользователи могут столкнуться с неприятной ситуацией: при попытке изменить дату в обработке Прайс-лист или при формировании цен на определенное число система выдает сообщение «ошибка SQL: переполнение поля». При этом цены за выбранный период могут не отображаться, а сама ошибка не дает подробностей.
Эта проблема чаще всего связана не с физическим размером базы данных, а с математическими коллизиями при выполнении запросов. Разберем подробно, почему это происходит и как исправить ситуацию.
В файловом режиме работы 1С использует собственную СУБД, которая имеет жесткие ограничения на разрядность числовых данных. Ошибка «переполнение поля» возникает, когда результат какого-либо расчета (например, при пересчете валют или применении наценки) превышает допустимый лимит знаков (обычно это 15 знаков, включая дробную часть).
Рассмотрим основные факторы, провоцирующие ошибку:
Виды цен. Если цена рассчитывается по формуле от другой цены, в ней может возникнуть деление на очень маленькое число или умножение на огромный коэффициент.Цены номенклатуры может привести к некорректной агрегации данных в запросе.Первым делом проверим состояние курсов валют на проблемную дату и предшествующий ей день. Перейдем в раздел Настройки и справочники — Валюты. Необходимо убедиться, что для всех используемых валют (USD, EUR и др.) загружены актуальные курсы. Если курс равен 1 или 0 из-за ошибки загрузки, это гарантированно приведет к переполнению поля при пересчете цен прайс-листа.
Посмотрим на документы Установка цен номенклатуры, зарегистрированные на дату ошибки. Попробуем выполнить следующие действия:
Если проверка данных не выявила отклонений, перейдем к техническим методам исправления структуры файла 1Cv8.1CD. Выполним последовательно:
bin установленной платформы) для проверки физической целостности таблиц.Для программистов важно понимать, что в файловом режиме временные таблицы более чувствительны к типам данных. Рассмотрим пример кода, который потенциально может вызвать ошибку, если курс валюты не определен:
ВЫБРАТЬ
Цены.Номенклатура,
ВЫБОР
КОГДА КурсыВалют.Курс = 0 ТОГДА 0
ИНАЧЕ Цены.Цена * КурсыВалют.Кратность / КурсыВалют.Курс
КОНЕЦ КАК ЦенаВВалютеУчета
ИЗ
РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период, ) КАК Цены
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних(&Период, ) КАК КурсыВалют
ПО Цены.Валюта = КурсыВалют.Валюта
Проанализируем ситуацию: если КурсыВалют.Курс окажется равен 0 (или очень малому значению), результат вычисления может превысить разрядность Число(15,2). В типовых конфигурациях такие проверки обычно встроены, но при некорректных данных в регистре расчет может «сломаться» еще на этапе формирования временной таблицы системой компоновки данных (СКД).
Если ошибка сохраняется, попробуем сбросить пользовательские настройки прайс-листа. Для этого:
Также проверим Региональные настройки операционной системы. Убедимся, что в качестве разделителя дробной части установлена запятая, а не точка (или наоборот, в зависимости от стандартов вашей ОС), так как это иногда влияет на интерпретацию числовых констант платформой при формировании запросов к файловой БД.