Точность чисел в 1С: меняем разрядность дробной части

· 9 мин

Содержание

Количество знаков после запятой в 1С задают три независимых слоя: тип числа в метаданных (поле «Точность»), вид поля на форме или в отчёте и формат вывода. Чтобы увеличить дробную часть, правят слой, на котором число обрезается. Если цифры теряются при записи в базу, помогает только изменение типа в Конфигураторе, а вывод на экране и в печатной форме настраивается отдельно.

Конфигуратор нужен не всегда. Если нужно просто показать больше знаков в отчёте или печатной форме, хватит формата. Если же реквизит документа хранит «12,35» вместо «12,3456», придётся менять тип и обновлять структуру базы. Ниже разобрано, в каком случае что делать.

Как платформа хранит число: длина и точность

Тип Число описывается двумя параметрами: общая длина (сколько всего цифр) и точность (сколько из них после запятой). Запись «Число(15,2)» значит: до 15 цифр всего, две из них дробные, то есть до 13 цифр в целой части.

Что из этого следует на практике:

  • 🔢 Точность определяет, сколько знаков хранит база. Всё, что не помещается, платформа округляет при записи.
  • 📏 Увеличивая точность, не забудьте про длину: при «Число(10,2)» переход на точность 4 оставит в целой части только 6 цифр. Для сумм в миллионах этого мало.
  • 🧮 Промежуточные вычисления в коде идут с большей точностью, чем у реквизита. Обрезка происходит в момент присвоения значения реквизиту или записи.

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

Что хранитсяТипичная разрядностьГде обычно упирается
Сумма в рублях2 знакаРедко, это норма для рублей
Цена2–4 знакаЦены в валюте, малые единицы товара
Количество3 знакаВесовой товар, мерные материалы
Курс валюты4 знака и большеКурсы с четырьмя знаками
Коэффициентдо 6–10 знаковПересчёт единиц измерения

Увеличиваем точность реквизита в Конфигураторе

Это основной способ, когда база обрезает данные. Он требует доступа к конфигурации: у вас должна быть возможность открыть Конфигуратор , а в типовой конфигурации на поддержке — возможность вносить изменения.

Изменение структуры хранения в рабочей базе делайте после выгрузки информационной базы в файл .dt и в то время, когда в базе никто не работает. Обновление структуры требует монопольного доступа.

Порядок действий:

  1. Запустите 1С в режиме Конфигуратор и откройте конфигурацию (Конфигурация → Открыть конфигурацию).
  2. В дереве метаданных найдите нужный объект: документ, справочник, регистр. Раскройте ветку «Реквизиты» (для регистров — «Ресурсы» или «Измерения»).
  3. Дважды щёлкните по реквизиту, чтобы открыть палитру свойств.
  4. Найдите свойство «Тип» и нажмите кнопку выбора. Откроется редактор типа.
  5. Для типа Число задайте длину и точность. Например, было 15 и 2, нужно 15 и 4.
  6. Подтвердите изменение и сохраните конфигурацию (Конфигурация → Обновить конфигурацию базы данных, можно клавишей 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Строка() подчиняется собственным правилам. Если важна фиксированная форма записи, всегда используйте Формат.

Единицы измерения, цены и коэффициенты

В прикладных конфигурациях точность количества и цены часто упирается не в реквизит документа, а в настройки учёта. Поэтому стоит пройти проверку по цепочке «от источника к результату».

  1. Откройте карточку номенклатуры и проверьте единицу измерения и коэффициент пересчёта. Если коэффициент задан грубо (например, 0,33 вместо 0,3333), все пересчёты будут неточными.
  2. Проверьте точность в документе поступления: цена и количество должны хранить нужные знаки. Если там уже обрезано, дальше всё считается от неточных данных.
  3. Проверьте регистры, куда документ пишет данные. Если там цена с двумя знаками, а в документе с четырьмя, расхождение появится в отчётах.

В управляемых типовых конфигурациях значительная часть настроек точности спрятана в разделе администрирования. Названия пунктов зависят от конфигурации, поэтому ищите нужный параметр через Администрирование (раздел верхнего уровня есть в БП, ЗУП и УТ) и поиск по слову «точность» или «знаков». Если параметра нет, значит, точность жёстко задана типом реквизита и меняется только в Конфигураторе.

Диагностика: куда пропадают знаки

Когда после изменения точности значения всё равно «плавают», используйте проверочную схему.

СимптомВероятная причинаЧто проверить
Число вводится с четырьмя знаками, а после записи видны дваУ реквизита точность 2Свойство «Тип» реквизита в Конфигураторе
В базе четыре знака, на форме дваЗадан формат поля ЧДЦ=2«Формат» и «Формат редактирования» поля
В отчёте одно значение, в документе другоеДругая точность у колонки отчёта или регистраТип ресурса регистра, формат поля СКД
Итог не сходится на копейкуСумма округляется построчно, а итог считается от неокруглённых значенийПорядок вычислений в обработчике
После Формат сумма не считаетсяФормат вернул строкуТип переменной в коде

Почему итог расходится на копейку

Это самая частая жалоба. Построчное округление и округление итога дают разные результаты: пять строк по 0,333 в сумме дают 1,665, что при округлении до двух знаков равно 1,67, а каждая строка отдельно округлится до 0,33 и даст 1,65. Расхождение возникает не из-за точности типа, а из-за порядка действий. Увеличение числа знаков его только сгладит, но не уберёт.

Чтобы расхождение исчезло, решите заранее, что считается первично: сумма строк или итог документа. Если в типовом документе итог не сходится, ищите расчёт в модуле объекта и приводите оба варианта к одному правилу округления.

Когда менять тип не нужно

Не трогайте точность реквизита, если:

  • ❌ хватает вывода в отчёте с другим форматом (данные в базе уже точные);
  • ❌ значение вычисляется и нигде не хранится;
  • ❌ конфигурация на поддержке, а задача решается формой или расширением;
  • ❌ платформа и так хранит нужные знаки, но их скрывает формат поля.

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

Что проверить после изменения

Короткий порядок проверки после того, как точность увеличена:

  • Обновление структуры базы завершилось без ошибок.
  • Новый документ сохраняет значение с нужным числом знаков.
  • Печатная форма и отчёт показывают те же знаки, что и документ.
  • Регистры, в которые пишет документ, имеют не меньшую точность.
  • Для старых документов решено, нужно ли их перепроводить.
Проверка после смены разрядности
Выполнено: 0 / 5

Частые вопросы

Можно ли увеличить точность без Конфигуратора?
Только для отображения: формат поля, формат ячейки отчёта и параметр ЧДЦ в коде. Хранение числа в базе меняется исключительно через тип реквизита в Конфигураторе.
Пропадут ли данные после увеличения количества знаков?
Нет. Старые значения сохранятся, новые разряды заполнятся нулями. Данные пропадают при уменьшении точности или длины.
Почему я задал четыре знака, а в итоге показывается округлённое число?
Скорее всего, у поля на форме или в макете задан формат с меньшим числом знаков. Проверьте свойства «Формат» и «Формат редактирования».
Чем отличается `Окр` от `Формат`?
Окр возвращает число и годится для расчётов. Формат возвращает строку и нужен для вывода на экран или в печать.
Как увеличить точность в типовой конфигурации на поддержке?
Лучше не менять типовой реквизит, а создать свой через расширение или использовать формат отображения. Правка типового объекта усложняет обновления.
Влияет ли длина числа на скорость работы?
Практически нет. Большие длины увеличивают размер таблицы, но на обычных базах разница не заметна.