Разработка и Конфигурация · 9 мин
Что значит точность числа в 1С и как её правильно настроить
Что означает точность числа в 1С: разрядность, дробная часть, округление. Как задать формат Число(15,2), исправить ошибки округления в документах и отчётах.
В конфигураторе 1С при описании реквизита типа «Число» задаются два параметра: длина (общее количество разрядов) и точность (количество разрядов дробной части). Запись вида Число(15, 2) означает, что число может содержать максимум 15 цифр, из которых 2 цифры отведены под дробную часть после запятой. Точность напрямую определяет, сколько знаков после запятой сохраняется в базе данных и участвует в расчётах.
Этот параметр влияет не только на отображение, но и на хранение и вычисления. Если реквизиту задана точность 2, а в расчёте получилось значение 10,456, то при записи в базу оно будет округлено до 10,46. Все промежуточные значения, присвоенные такому реквизиту, теряют «лишние» знаки без возможности восстановления.
Неправильно выбранная точность — частая причина копеечных расхождений в проводках, ошибок в расчёте НДС, расхождений между суммой документа и суммой строк табличной части. Поэтому понимание этого параметра важно и разработчику, и внедренцу, и бухгалтеру, который сталкивается с «странными» суммами в отчётах.
Как устроен формат Число(Длина, Точность)
Числовой тип в 1С описывается квалификатором с двумя параметрами. Первый — общая длина числа в разрядах, включая знаки дробной части, но не считая самого разделителя. Второй — точность, то есть сколько из этих разрядов приходится на дробную часть.
Пример: Число(10, 3) допускает значения до 9 999 999,999 — семь разрядов целой части и три разряда дробной. Если попытаться записать число с бо́льшим количеством знаков после запятой, лишние разряды отсекаются округлением. Если задать точность 0, значение станет целым: 15,7 превратится в 16.
Отдельно стоит упомянуть признак «неотрицательное». Если он установлен, платформа не даст записать отрицательное значение в реквизит, что полезно для количеств и остатков, но требует аккуратности при сторнировании.
Какую точность выбирать для типовых величин
Универсального значения нет — точность подбирается под смысл реквизита. Ориентиры, которые используются в типовых конфигурациях:
- Денежные суммы — 2 знака после запятой (рубли и копейки). Длина обычно 15, чтобы покрывать крупные обороты.
- Количество товара — 3 знака: позволяет учитывать дробные упаковки, вес, метраж.
- Курсы валют и коэффициенты — 4 и более знаков, иначе пересчёты дают заметные погрешности.
- Проценты — 2–4 знака в зависимости от требований учёта.
- Цены — иногда 2 знака, но при работе с мелким оптом или валютными ценами может понадобиться больше.
Сравнение вариантов
Стандарт для денег. Не подходит для курсов, коэффициентов и дробных количеств — накапливаются ошибки округления.
Подходит для количеств, курсов, весовых товаров. Требует согласования с точностью связанных суммовых полей.
Только для целых величин: штуки, счётчики, порядковые номера. Любая дробная часть будет потеряна.
Важно согласовывать точность связанных полей. Если цена хранится с точностью 4, а сумма строки — с точностью 2, то произведение «цена × количество» будет округляться при записи суммы, и проверка «сумма = цена × количество» может не сходиться на копейки.
Как задать и изменить точность в конфигураторе
Точность задаётся в свойствах реквизита объекта метаданных: справочника, документа, регистра, табличной части. Откройте свойства реквизита, найдите поля «Длина» и «Точность» и укажите нужные значения.
- 1Откройте конфигуратор и найдите нужный объект (документ, справочник, регистр).
- 2Выделите реквизит и откройте палитру свойств.
- 3Установите Длину и Точность, например 15 и 2.
- 4Обновите конфигурацию базы данных (F7) — платформа выполнит реструктуризацию таблиц.
- 5Проверьте на тестовом документе, что значения хранятся и отображаются корректно.
При изменении точности существующего реквизита платформа выполняет реструктуризацию. Уменьшение точности необратимо обрежет дробные разряды уже хранящихся данных. Увеличение безопасно: старые значения просто дополнятся нулями.
Точность и округление в расчётах
Ключевой момент: встроенный язык 1С оперирует числами с высокой внутренней точностью, а обрезание происходит в момент присвоения значения реквизиту с заданным квалификатором. Пока значение находится в переменной, оно хранит все знаки; как только записано в реквизит объекта — округляется до его точности.
Для явного округления в коде используется функция Окр(Число, Разрядность, РежимОкругления). Например, Окр(СуммаСНДС, 2) округлит значение до копеек. Явное округление предпочтительнее надежды на квалификатор реквизита: оно делает логику расчёта прозрачной и одинаковой везде.
СуммаБезОкругления = Цена * Количество;
СуммаСтроки = Окр(СуммаБезОкругления, 2, РежимОкругления.Окр15как20);Типичная ситуация: сумма НДС считается от каждой строки и округляется до копеек, а потом эти округлённые значения складываются. Итог может отличаться от НДС, посчитанного от общей суммы документа. Это не ошибка платформы, а следствие выбранной методики округления — её нужно зафиксировать и применять единообразно.
Точность в запросах и отчётах
В запросах функция ВЫРАЗИТЬ(Поле КАК ЧИСЛО(15, 2)) приводит значение к заданным длине и точности. Это полезно при соединениях и сравнениях: числа с разной точностью могут не совпадать при сравнении на равенство из-за хвостов дробной части.
В отчётах на СКД формат отображения задаётся отдельно через «Оформление» — там можно показать меньше знаков, чем хранится, не меняя сами данные. Не путайте формат отображения с точностью хранения: первое влияет только на вывод, второе — на данные в базе.
Типичные ошибки и как их избежать
Ещё одна ошибка — делить на число без проверки и округления результата. Деление часто даёт бесконечную дробь, и если результат записывается в реквизит с точностью 2, а дальше используется в контрольных сравнениях, итоги «не сходятся» на копейки.
Как проверить результат
Количество знаков после запятой соответствует заданной точности
Лишние знаки или обрезанные значения, которых не должно быть
Сумма документа равна сумме округлённых сумм строк
Расхождение на копейки между итогом и строками
Результат стабилен при повторном пересчёте туда-обратно в пределах заданной точности
Суммы «плывут» при обратном пересчёте
Когда точности недостаточно: ограничения и альтернативы
Числовой тип 1С фиксированной разрядности не предназначен для расчётов, где требуется произвольная точность — например, для научных вычислений или точного деления больших величин с десятками знаков. В таких случаях промежуточные результаты хранят в переменных, а в базу записывают только округлённый итог.
Если нужно хранить значение «как ввёл пользователь» без обрезания, иногда применяют строковое представление с последующим разбором — но это исключение, усложняющее запросы и сортировку. В подавляющем большинстве учётных задач достаточно правильно выбранной пары «длина–точность» и явного округления в расчётах.
Что важно запомнить
Точность числа в 1С — это разряды дробной части в формате Число(Длина, Точность). Она определяет хранение и итоги расчётов: деньги — 2 знака, количества и курсы — 3–4. Изменение точности в меньшую сторону необратимо обрезает данные, поэтому сначала делайте копию базы. Явное округление через Окр() надёжнее, чем надежда на квалификатор реквизита.
Частые вопросы
Что означает запись Число(15, 2) в свойствах реквизита?
Число занимает до 15 разрядов, из которых 2 отведены под дробную часть. Целая часть может содержать до 13 цифр. Значения с бо́льшим числом знаков после запятой округляются до двух при записи.
Что будет, если уменьшить точность существующего реквизита?
При реструктуризации платформа обрежет дробные разряды уже хранящихся значений, и восстановить их будет невозможно. Перед таким изменением обязательно сделайте резервную копию и протестируйте на копии базы.
Почему сумма документа не сходится с суммой строк на копейки?
Чаще всего из-за округления: суммы строк округляются до копеек по отдельности, а итог считается от неокруглённых значений. Приведите методику к единому виду — округляйте каждую строку через Окр() и суммируйте уже округлённые значения.
Чем точность отличается от формата отображения?
Точность определяет, сколько знаков реально хранится в базе и участвует в расчётах. Формат (например, через функцию Формат()) влияет только на вывод числа на экран или в печатную форму и не меняет данные.
Какую точность ставить для курсов валют и коэффициентов?
Рекомендуется не менее 4 знаков после запятой. При точности 2 пересчёт сумм по курсу накапливает заметные погрешности, особенно на крупных оборотах и при обратных пересчётах.
Как в запросе сравнить числа с разной точностью?
Приведите оба значения к одному виду через ВЫРАЗИТЬ(Поле КАК ЧИСЛО(15, 2)) и только потом сравнивайте. Прямое сравнение на равенство чисел с разной точностью часто даёт ложные расхождения из-за хвостов дробной части.