При проведении документов с большими табличными частями или при выполнении объемных пакетов запросов разработчики 1С могут столкнуться с сообщением «Ошибка SQL: Переполнение поля». Недоумение вызывает факт того, что текст ошибки ссылается на SQL, хотя информационная база работает в файловом режиме. Разберем по шагам причины этого сбоя и проанализируем практические способы его устранения.
Появление упоминания SQL в файловом режиме объясняется тем, что встроенный механизм платформы 1С для работы с файловой базой (SDBL) использует эмуляцию SQL-запросов. Выделим основные технические причины, приводящие к переполнению поля:
ОБЪЕДИНИТЬ ВСЕ: Итоговый тип и разрядность колонки определяются по первому запросу в объединении. Если в последующих запросах значения превышают вычисленный разряд, платформе не удается поместить их в поле.РАЗНОСТЬДАТ: Если одна из дат не заполнена (равна 0001-01-01 или NULL), расчет разницы в мелких единицах измерения (секунды, минуты) выводит число за границы допустимого интервала целого числа.ВЫРАЗИТЬ(... КАК ЧИСЛО): Ошибка возникает, когда целая часть вычисленного значения содержит больше знаков, чем отведено разрядностью вида ЧИСЛО(M, N).NULL: Наличие отрицательных остатков в регистрах учета и суммирование неопределенных значений без обертки в ЕСТЬNULL вызывают сбой при вычислении промежуточных итогов.Если ошибка возникает при выполнении конкретного запроса, проанализируем его текст и внесем следующие исправления:
ВЫРАЗИТЬ(Таблица.Сумма КАК ЧИСЛО(31, 2))
ЕСТЬNULL:
ЕСТЬNULL(Таблица.Количество, 0) * ЕСТЬNULL(Таблица.Цена, 0)
РАЗНОСТЬДАТ от пустых значений:
ВЫБОР
КОГДА Таблица.ДатаНачала НЕ ЕСТЬ NULL И Таблица.ДатаНачала <> ДАТАВРЕМЯ(1, 1, 1)
ТОГДА РАЗНОСТЬДАТ(Таблица.ДатаНачала, Таблица.ДатаОкончания, СЕКУНДА)
ИНАЧЕ 0
КОНЕЦ
ОБЪЕДИНИТЬ ВСЕ — первым должен идти запрос с максимальной разрядностью полей.По умолчанию файловая база данных создается в формате хранения 8.2, имеющем жесткие лимиты на размер таблиц и промежуточные вычисления. Мы можем перевести базу в формат 8.3.8 с увеличенным размером страницы (16 Кб) с помощью утилиты cnvdbfl.
Разберем процесс по шагам:
1cv8.1cd.bin, например: C:\Program Files\1cv8\8.3.XX.XXXX\bin\) и найдем утилиту cnvdbfl.exe.
cnvdbfl -c -f 8.3.8 -p 16k c:\temp\1cv8.1cd
Параметр -p 16k задает размер страницы 16 Кб, что существенно расширяет границы таблиц и позволяет платформе без ошибок обрабатывать громоздкие временные таблицы при выполнении тяжелых запросов.
Файловый движок 1С имеет ограничения по работе с памятью при выполнении многоэтажных запросов. Если оптимизация кода и изменение формата файла не дали полного эффекта, рассмотрим вариант переноса информационной базы на клиент-серверный вариант (MS SQL Server или PostgreSQL).
Полноценные СУБД корректно и динамически выделяют ресурсы под промежуточные вычисления любой сложности, навсегда устраняя проблему переполнения полей в файловых механизмах.