Точность чисел в 1С: меняем разрядность дробной части
Содержание
Количество знаков после запятой в 1С задают три независимых слоя: тип числа в метаданных (поле «Точность»), вид поля на форме или в отчёте и формат вывода. Чтобы увеличить дробную часть, правят слой, на котором число обрезается. Если цифры теряются при записи в базу, помогает только изменение типа в Конфигураторе, а вывод на экране и в печатной форме настраивается отдельно.
Конфигуратор нужен не всегда. Если нужно просто показать больше знаков в отчёте или печатной форме, хватит формата. Если же реквизит документа хранит «12,35» вместо «12,3456», придётся менять тип и обновлять структуру базы. Ниже разобрано, в каком случае что делать.
Как платформа хранит число: длина и точность
Тип Число описывается двумя параметрами: общая длина (сколько всего цифр) и точность (сколько из них после запятой). Запись «Число(15,2)» значит: до 15 цифр всего, две из них дробные, то есть до 13 цифр в целой части.
Что из этого следует на практике:
- 🔢 Точность определяет, сколько знаков хранит база. Всё, что не помещается, платформа округляет при записи.
- 📏 Увеличивая точность, не забудьте про длину: при «Число(10,2)» переход на точность 4 оставит в целой части только 6 цифр. Для сумм в миллионах этого мало.
- 🧮 Промежуточные вычисления в коде идут с большей точностью, чем у реквизита. Обрезка происходит в момент присвоения значения реквизиту или записи.
Хороший ориентир по умолчанию: суммы хранятся с двумя знаками, цены и курсы валют — с четырьмя-шестью, количество — с тремя, коэффициенты пересчёта единиц — с большим запасом. Типовые конфигурации уже следуют этой схеме, и менять нужно только то, что действительно не хватает.
| Что хранится | Типичная разрядность | Где обычно упирается |
|---|---|---|
| Сумма в рублях | 2 знака | Редко, это норма для рублей |
| Цена | 2–4 знака | Цены в валюте, малые единицы товара |
| Количество | 3 знака | Весовой товар, мерные материалы |
| Курс валюты | 4 знака и больше | Курсы с четырьмя знаками |
| Коэффициент | до 6–10 знаков | Пересчёт единиц измерения |
Увеличиваем точность реквизита в Конфигураторе
Это основной способ, когда база обрезает данные. Он требует доступа к конфигурации: у вас должна быть возможность открыть Конфигуратор , а в типовой конфигурации на поддержке — возможность вносить изменения.
Изменение структуры хранения в рабочей базе делайте после выгрузки информационной базы в файл .dt и в то время, когда в базе никто не работает. Обновление структуры требует монопольного доступа.
Порядок действий:
- Запустите 1С в режиме
Конфигуратори откройте конфигурацию (Конфигурация → Открыть конфигурацию). - В дереве метаданных найдите нужный объект: документ, справочник, регистр. Раскройте ветку «Реквизиты» (для регистров — «Ресурсы» или «Измерения»).
- Дважды щёлкните по реквизиту, чтобы открыть палитру свойств.
- Найдите свойство «Тип» и нажмите кнопку выбора. Откроется редактор типа.
- Для типа
Числозадайте длину и точность. Например, было 15 и 2, нужно 15 и 4. - Подтвердите изменение и сохраните конфигурацию (
Конфигурация → Обновить конфигурацию базы данных, можно клавишейF7).
Платформа предложит изменить структуру хранения. Для увеличения точности при достаточной длине старые данные сохранятся: значения «12,35» останутся «12,35», дополнительные знаки заполнятся нулями.
Что будет с существующими данными
Увеличение точности безопасно: старые значения не меняются, но и «вернуть» отброшенные когда-то цифры нельзя. Если документ был записан с суммой 12,35 из-за округления до двух знаков, в четыре знака он сам не превратится в 12,3456. Историю надо перезаполнять: перепровести документы, если в них вычисляется значение по формуле, или заново ввести данные.
Уменьшение точности устроено наоборот: лишние знаки обрежутся окончательно. Если тип нужно сузить, сначала сохраните резервную копию.
Регистры и измерения
Особняком стоят регистры. Точность ресурса регистра накопления или сведений меняется так же, как реквизита, но обновление структуры может занять заметное время на большой базе: платформа перестраивает таблицу и индексы. Измерение с числовым типом встречается редко; менять его точность без необходимости не стоит, потому что она входит в ключ записи.
Если один и тот же показатель живёт и в документе, и в регистре (цена, количество), увеличивайте точность в обоих местах. Иначе значение хранится в документе точно, а в регистр попадает уже округлённым.
Поле на форме и в списке: почему цифры не показываются
Бывает, что в базе число хранится с четырьмя знаками, а на экране видны два. Тогда причина не в типе, а в оформлении поля. Платформа выводит число в формате, который либо взят из типа, либо задан вручную.
В управляемой форме откройте её в Конфигураторе, выберите поле и посмотрите свойства:
- «Формат» — управляет отображением в режиме просмотра.
- «Формат редактирования» — управляет тем, как число выглядит в момент ввода.
- Для поля на основе реквизита формата по умолчанию нет: ширина и дробная часть берутся из типа.
Если в «Формате» стоит строка вида ЧДЦ=2, то именно она обрезает отображение. Замените цифру на нужную, например ЧДЦ=4. Если же свойство пустое, поле показывает ровно столько знаков, сколько задано типом.
Колонки табличной части и динамических списков
Для колонки табличной части формат задаётся у самой колонки. Для динамического списка — у колонки запроса в настройках списка. Если колонка получена вычислением в запросе, у выражения нет собственной точности. Её нужно задать явно приведением типа ВЫРАЗИТЬ(Выражение КАК ЧИСЛО(15, 4)).
Пример запроса:
ВЫБРАТЬ
Номенклатура.Ссылка КАК Номенклатура,
ВЫРАЗИТЬ(Цены.Цена / Цены.Коэффициент КАК ЧИСЛО(15, 4)) КАК ЦенаЗаЕдиницу
ИЗ
Справочник.Номенклатура КАК Номенклатура
Без ВЫРАЗИТЬ результат деления получит ту точность, которую вернёт СУБД, и в отчёте можно увидеть странные хвосты или, наоборот, обрезку.
Формат вывода в отчётах и печатных формах
Табличный документ и СКД не берут точность из реквизитов автоматически. Для макета печатной формы и поля СКД она задаётся на уровне оформления.
- В макете табличного документа выделите ячейку, откройте свойства и в поле «Формат» нажмите кнопку выбора. На закладке «Число» укажите «Количество знаков после запятой» (в строке формата это будет
ЧДЦ=). - В схеме компоновки данных формат задаётся в настройках оформления поля или в параметре «Формат» у вычисляемого поля.
- В пользовательском отчёте формат можно поменять без Конфигуратора: в режиме 1С:Предприятие откройте настройки отчёта, раздел оформления, и добавьте условное оформление или формат для нужного поля.
Если печатная форма собрана программно, формат добавляют в сам вывод значения, как показано в следующем разделе.
Управляем точностью из кода
Три инструмента: Окр, Формат и описание типа при создании значений.
Округление числа — функция Окр(Число, КоличествоЗнаков, РежимОкругления). Она не меняет тип, а лишь убирает лишние знаки:
Значение = 1234.56789;
Результат = Окр(Значение, 4); // 1234,5679
Третий параметр задаёт правило: по умолчанию округление идёт «по-математически» (до ближайшего, половина вверх). Нужно отбрасывать лишнее без округления — используйте Цел на умноженном значении или режим округления из перечисления РежимОкругления.
Формат строки — функция Формат(Значение, ПараметрыФормата). Она возвращает строку, а не число, так что для расчётов не годится:
Значение = 12.3;
Строка = Формат(Значение, "ЧДЦ=4; ЧГ=0"); // "12,3000"
Параметр ЧДЦ задаёт количество знаков после запятой, ЧГ=0 убирает разделитель групп разрядов.
Описание типа для нового значения создаётся так:
КвалификаторЧисла = Новый КвалификаторыЧисла(15, 4);
ОписаниеТипов = Новый ОписаниеТипов("Число", КвалификаторЧисла);
ПриведённоеЗначение = ОписаниеТипов.ПривестиЗначение(12.34567891);
// 12,3457
Так удобно задавать точность реквизитам формы, которые создаются в коде, и колонкам программно создаваемых таблиц значений.
Преобразование числа в строку через Строка() или XMLСтрока() подчиняется собственным правилам. Если важна фиксированная форма записи, всегда используйте Формат.
Единицы измерения, цены и коэффициенты
В прикладных конфигурациях точность количества и цены часто упирается не в реквизит документа, а в настройки учёта. Поэтому стоит пройти проверку по цепочке «от источника к результату».
- Откройте карточку номенклатуры и проверьте единицу измерения и коэффициент пересчёта. Если коэффициент задан грубо (например, 0,33 вместо 0,3333), все пересчёты будут неточными.
- Проверьте точность в документе поступления: цена и количество должны хранить нужные знаки. Если там уже обрезано, дальше всё считается от неточных данных.
- Проверьте регистры, куда документ пишет данные. Если там цена с двумя знаками, а в документе с четырьмя, расхождение появится в отчётах.
В управляемых типовых конфигурациях значительная часть настроек точности спрятана в разделе администрирования. Названия пунктов зависят от конфигурации, поэтому ищите нужный параметр через Администрирование (раздел верхнего уровня есть в БП, ЗУП и УТ) и поиск по слову «точность» или «знаков». Если параметра нет, значит, точность жёстко задана типом реквизита и меняется только в Конфигураторе.
Диагностика: куда пропадают знаки
Когда после изменения точности значения всё равно «плавают», используйте проверочную схему.
| Симптом | Вероятная причина | Что проверить |
|---|---|---|
| Число вводится с четырьмя знаками, а после записи видны два | У реквизита точность 2 | Свойство «Тип» реквизита в Конфигураторе |
| В базе четыре знака, на форме два | Задан формат поля ЧДЦ=2 | «Формат» и «Формат редактирования» поля |
| В отчёте одно значение, в документе другое | Другая точность у колонки отчёта или регистра | Тип ресурса регистра, формат поля СКД |
| Итог не сходится на копейку | Сумма округляется построчно, а итог считается от неокруглённых значений | Порядок вычислений в обработчике |
После Формат сумма не считается | Формат вернул строку | Тип переменной в коде |
Почему итог расходится на копейку
Это самая частая жалоба. Построчное округление и округление итога дают разные результаты: пять строк по 0,333 в сумме дают 1,665, что при округлении до двух знаков равно 1,67, а каждая строка отдельно округлится до 0,33 и даст 1,65. Расхождение возникает не из-за точности типа, а из-за порядка действий. Увеличение числа знаков его только сгладит, но не уберёт.
Чтобы расхождение исчезло, решите заранее, что считается первично: сумма строк или итог документа. Если в типовом документе итог не сходится, ищите расчёт в модуле объекта и приводите оба варианта к одному правилу округления.
Когда менять тип не нужно
Не трогайте точность реквизита, если:
- ❌ хватает вывода в отчёте с другим форматом (данные в базе уже точные);
- ❌ значение вычисляется и нигде не хранится;
- ❌ конфигурация на поддержке, а задача решается формой или расширением;
- ❌ платформа и так хранит нужные знаки, но их скрывает формат поля.
Для конфигурации на поддержке без права редактирования изменение типа реквизита в типовом объекте усложнит последующие обновления. Если нужна другая точность, лучше добавить собственный реквизит через расширение или вывести значение в отчёте с нужным форматом.
Что проверить после изменения
Короткий порядок проверки после того, как точность увеличена:
- Обновление структуры базы завершилось без ошибок.
- Новый документ сохраняет значение с нужным числом знаков.
- Печатная форма и отчёт показывают те же знаки, что и документ.
- Регистры, в которые пишет документ, имеют не меньшую точность.
- Для старых документов решено, нужно ли их перепроводить.
Частые вопросы
Можно ли увеличить точность без Конфигуратора?
ЧДЦ в коде. Хранение числа в базе меняется исключительно через тип реквизита в Конфигураторе.Пропадут ли данные после увеличения количества знаков?
Почему я задал четыре знака, а в итоге показывается округлённое число?
Чем отличается `Окр` от `Формат`?
Окр возвращает число и годится для расчётов. Формат возвращает строку и нужен для вывода на экран или в печать.