Больше знаков после запятой в 1С: где хранится точность и как её поменять

· 9 мин

Содержание

Разрядность после запятой в 1С задаётся в трёх разных местах, и каждое меняется отдельно: в типе реквизита (Число(15, 2)), в формате поля на форме и в формате ячейки печатной формы. Если вы поправили только последнее, на экране появятся четыре знака, а в базе по-прежнему лежат два. И наоборот: расширили реквизит, а форма по-прежнему показывает округлённое значение.

Сначала определите, что именно вам нужно: хранить точнее, считать точнее или только показывать больше знаков. От этого зависит, лезть ли в Конфигуратор.

Три уровня точности: что хранится, что считается, что показывается

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

УровеньГде задаётсяЧто даётНужен Конфигуратор
ХранениеТип реквизита или ресурса: длина и точностьСколько знаков реально записано в базуДа
ВычислениеКод и формулы: Окр() и порядок действийКогда происходит округлениеЗависит от места
ОтображениеФормат поля формы, ячейки макета, колонки отчётаСколько знаков видит пользовательНет, в большинстве случаев

Длина числа в Число(15, 2) — это общее количество цифр, а вторая цифра — знаки после запятой. Значит, под целую часть остаётся 13 цифр. Поднимете точность до четырёх знаков при длине 15 — целая часть сократится до 11 цифр, то есть до сотен миллиардов. Для цен и количеств этого хватает, для сумм в копейках по крупным оборотам — стоит увеличить и длину.

Если на экране уже видно больше знаков, чем вы хотите, а в базе их нет, значит, формат поля шире типа. Лишние нули появятся, лишней точности — нет.

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

Справочник номенклатуры и другие реквизиты: правим тип

Точность реквизита меняется только в Конфигураторе. Пользовательскими настройками её не поднять: на это нет ни галочки, ни команды.

Порядок такой:

  1. Откройте базу в Конфигураторе и найдите нужный объект в дереве конфигурации: справочник, документ или регистр.
  2. Откройте реквизит и найдите его свойство «Тип». Для числа задаётся длина и точность.
  3. Увеличьте точность, при необходимости — длину. Допустимо Число(15, 4) или Число(18, 4).
  4. Обновите конфигурацию базы данных. Платформа сама перестроит таблицы.

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

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

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

Документы поступления и реализации: строки табличной части и итог

В документах точность задаётся у каждой колонки табличной части отдельно: количество, цена, сумма, НДС. Это важно: увеличить цену до четырёх знаков и забыть про сумму — значит получить расхождение на пустом месте.

Посмотрите на пример. Цена 12,3456 за единицу, количество 1000:

  • при цене с двумя знаками (12,35) сумма строки равна 12 350,00;
  • при цене с четырьмя знаками (12,3456) сумма равна 12 345,60.

Разница 4,40 рубля на одной строке. На поставке в сто позиций она вырастает уже до заметных сумм. Поэтому когда поставщик присылает цену с четырьмя знаками, а накладная в базе округляет её до копеек, бухгалтер видит расхождение с первичным документом.

Что проверить, если нужна точная цена:

  • ✅ тип реквизита «Цена» в табличной части документа;
  • ✅ тип колонки «Сумма»: ей хватает двух знаков, она хранит рубли и копейки;
  • ✅ порядок расчёта: считается ли сумма как цена на количество или цена пересчитывается из суммы.

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

Не меняйте точность реквизитов проведённых документов задним числом без пересчёта. Старые значения останутся округлёнными, а новые будут точнее, и в отчётах за период окажутся строки разной точности.

Регистры: точность ресурсов и что происходит с уже записанными данными

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

Что важно знать при изменении ресурса:

  1. Увеличение точности не восстановит то, что уже было округлено. Записи прошлых периодов останутся с прежним значением, просто с дописанными нулями.
  2. Если нужны точные значения за прошлое, документы придётся перепровести. Для этого используйте групповое перепроведение за нужный период, а перед ним — копию базы .
  3. После смены типа ресурса стоит пересчитать итоги регистра. В Конфигураторе в меню «Администрирование» есть команда пересчёта итогов.
  4. Уменьшение точности, наоборот, обрезает данные. Назад дороги нет, поэтому работайте только на копии.

Отдельно про измерения регистров. Числовое измерение участвует в отборах и группировках итогов, и менять его точность рискованнее, чем ресурс. Если число в измерении нужно только как признак, замените его ссылкой на справочник или перечисление.

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

Печатные формы: показать больше знаков, не трогая данные

Если проблема только в печати, Конфигуратор не нужен. Достаточно поменять формат ячейки или параметра.

В макете печатной формы выделите ячейку с параметром, откройте её свойства и найдите «Формат». Там задаётся число знаков после запятой. Например, формат ЧДЦ=4 покажет 12,3456 вместо 12,35.

Если значение выводится в код формы, формат задаётся прямо там:

Область.Параметры.Цена = Формат(Цена, "ЧДЦ=4; ЧГ=0");

Здесь ЧДЦ=4 — четыре знака после запятой, ЧГ=0 — убрать разделитель групп разрядов. Без него число 1234,5678 превратится в «1 234,5678» с неразрывным пробелом, что неудобно при выгрузке в файл.

Для отчётов на системе компоновки данных формат задаётся в настройках оформления поля. Откройте отчёт в режиме изменения варианта, найдите нужное поле и задайте ему формат. То же делают в макете отчёта, если он написан вручную.

Если число в печатной форме выводится строкой, а не числом, формат ячейки не сработает: ячейка получит уже готовый текст. Формируйте строку функцией Формат() до присвоения.

Типовые печатные формы лучше не править прямо. Копируйте макет в расширение или используйте дополнительную печатную форму из подсистемы «Дополнительные отчёты и обработки».

Валюты и курсы: почему там отдельные правила

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

Пример. Курс за одну единицу валюты равен 0,0123 рубля. Рублёвая сумма всё равно хранится с двумя знаками, поэтому длинный хвост курса мало что даёт. Задайте курс 1,23 за кратность 100 — значение станет надёжнее и привычнее для сверки с официальными данными.

Из этого следуют три практических вывода:

  • ✅ не расширяйте точность курса, пока не пробовали кратность;
  • ✅ пересчёт суммы в рубли округляется до копеек в любом случае, потому что рублёвая сумма хранится с двумя знаками;
  • ✅ расхождения в копейках при пересчёте иностранной валюты — нормальное поведение, а не ошибка точности.

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

Программное изменение: форма, описание типов и округление

Метаданные в запущенной базе кодом не изменить. Но три вещи сделать можно.

Описание типа для нового реквизита формы. При динамическом добавлении реквизита на форму задайте квалификатор:

КвалификаторЧисла = Новый КвалификаторыЧисла(15, 4);
ОписаниеТипа = Новый ОписаниеТипов("Число", КвалификаторЧисла);

Так вы получите число с четырьмя знаками для реквизита, который создаёте сами в обработке.

Формат поля на управляемой форме. Для поля формы доступно свойство «Формат». Его задают в Конфигураторе или в коде при открытии формы:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	Элементы.Цена.Формат = "ЧДЦ=4";
	Элементы.Цена.ФорматРедактирования = "ЧДЦ=4";
КонецПроцедуры

Первое свойство управляет выводом, второе — вводом. Если задать только первое, пользователь по-прежнему будет вводить число с урезанной точностью. Проверьте оба.

Округление в вычислениях. Функция Окр(Число, Знаков) округляет до заданного числа знаков. Округляйте как можно позже: сначала посчитайте всё с полной точностью, а потом Окр() на итоговой сумме.

Сумма = Окр(Цена * Количество, 2);

Если округлить цену до копеек раньше, ошибка вырастет вместе с количеством. Именно так получается разница из примера выше.

Если не сработало: что проверить

Ошибка почти всегда сводится к одному из случаев:

  • Вы изменили формат поля, но значение в базе уже округлено. Откройте запись в режиме просмотра значений и убедитесь, что точное число там есть.
  • Значение пересчитывается из другого поля. Проверьте, что цена не выводится делением суммы на количество.
  • Данные приходят из обмена или загрузки. Тип реквизита в принимающей базе тоже нужно расширить, иначе знаки обрежутся при загрузке.
  • Работает кэш формы или отчёта. Закройте и откройте форму заново, а отчёт сформируйте с нуля.
  • Правка сделана на копии типовой конфигурации, а в рабочей базе её нет.

Если разница касается только отчёта, проверьте и его запрос: в запросе есть функция ВЫРАЗИТЬ(... КАК ЧИСЛО(15, 2)), которая округляет значение независимо от типа реквизита.

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

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