Как исправить ошибку SQL переполнение поля в прайс-листе 1С:Управление торговлей 11.3

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

При работе в программе 1С:Управление торговлей 11.3, особенно в файловом варианте базы данных, пользователи могут столкнуться с неприятной ситуацией: при попытке изменить дату в обработке Прайс-лист или при формировании цен на определенное число система выдает сообщение «ошибка SQL: переполнение поля». При этом цены за выбранный период могут не отображаться, а сама ошибка не дает подробностей.

Эта проблема чаще всего связана не с физическим размером базы данных, а с математическими коллизиями при выполнении запросов. Разберем подробно, почему это происходит и как исправить ситуацию.

Выясним причину ошибки

В файловом режиме работы 1С использует собственную СУБД, которая имеет жесткие ограничения на разрядность числовых данных. Ошибка «переполнение поля» возникает, когда результат какого-либо расчета (например, при пересчете валют или применении наценки) превышает допустимый лимит знаков (обычно это 15 знаков, включая дробную часть).

Рассмотрим основные факторы, провоцирующие ошибку:

  1. Нулевые или некорректные курсы валют. Это самая частая причина. Если в системе есть виды цен в иностранной валюте, а на конкретную дату (в нашем случае на 07.07.2017) курс валюты не загружен или равен нулю, программа при попытке деления на этот курс получает бесконечно большое число, которое не помещается в поле базы данных.
  2. Ошибки в формулах видов цен. Проанализируем настройки справочника Виды цен. Если цена рассчитывается по формуле от другой цены, в ней может возникнуть деление на очень маленькое число или умножение на огромный коэффициент.
  3. Циклические ссылки. Ситуация, когда «Цена А» зависит от «Цены Б», а та, в свою очередь, через цепочку других цен зависит от «Цены А». Это вызывает бесконечный цикл расчетов.
  4. Дубли записей в регистре. Наличие записей с одинаковыми измерениями (номенклатура, характеристика, вид цены) на одну и ту же секунду в регистре Цены номенклатуры может привести к некорректной агрегации данных в запросе.

Шаг 1. Проверка курсов валют

Первым делом проверим состояние курсов валют на проблемную дату и предшествующий ей день. Перейдем в раздел Настройки и справочники — Валюты. Необходимо убедиться, что для всех используемых валют (USD, EUR и др.) загружены актуальные курсы. Если курс равен 1 или 0 из-за ошибки загрузки, это гарантированно приведет к переполнению поля при пересчете цен прайс-листа.

Шаг 2. Анализ документов установки цен

Посмотрим на документы Установка цен номенклатуры, зарегистрированные на дату ошибки. Попробуем выполнить следующие действия:

  1. Найдем все документы за «проблемное» число.
  2. Временно пометим их на удаление и попробуем снова открыть прайс-лист. Если ошибка исчезла, значит, проблема в данных конкретного документа.
  3. Проверим документ на наличие аномально больших цен (например, из-за опечатки) или пустых значений в ключевых колонках.

Шаг 3. Техническое обслуживание базы данных

Если проверка данных не выявила отклонений, перейдем к техническим методам исправления структуры файла 1Cv8.1CD. Выполним последовательно:

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

Шаг 4. Анализ запросов и временных таблиц

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


ВЫБРАТЬ
    Цены.Номенклатура,
    ВЫБОР
        КОГДА КурсыВалют.Курс = 0 ТОГДА 0
        ИНАЧЕ Цены.Цена * КурсыВалют.Кратность / КурсыВалют.Курс
    КОНЕЦ КАК ЦенаВВалютеУчета
ИЗ
    РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период, ) КАК Цены
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних(&Период, ) КАК КурсыВалют
    ПО Цены.Валюта = КурсыВалют.Валюта

Проанализируем ситуацию: если КурсыВалют.Курс окажется равен 0 (или очень малому значению), результат вычисления может превысить разрядность Число(15,2). В типовых конфигурациях такие проверки обычно встроены, но при некорректных данных в регистре расчет может «сломаться» еще на этапе формирования временной таблицы системой компоновки данных (СКД).

Дополнительные рекомендации

Если ошибка сохраняется, попробуем сбросить пользовательские настройки прайс-листа. Для этого:

Также проверим Региональные настройки операционной системы. Убедимся, что в качестве разделителя дробной части установлена запятая, а не точка (или наоборот, в зависимости от стандартов вашей ОС), так как это иногда влияет на интерпретацию числовых констант платформой при формировании запросов к файловой БД.

← На главную