Больше разрядов в дробной части: числа, суммы и коэффициенты в 1С
Содержание
Частая ошибка: в поле вводят 0,0075, а программа показывает 0,01. Кажется, что 1С «округлила» значение. На деле она просто не умеет хранить больше знаков, чем задано в типе реквизита. Формат вывода тут вторичен.
Знаки после запятой зависят от двух разных настроек. Первая — точность типа «Число» в метаданных: сколько разрядов база физически хранит. Вторая — формат отображения: сколько из хранимых разрядов показать на экране или в печатной форме. Увеличить показ можно без разработчика. Увеличить хранение можно только в Конфигураторе.
Где теряются разряды: хранение, показ и расчёт
Любое число в 1С — это тип Число с двумя параметрами: длина (всего цифр) и точность (цифр после запятой). Запись «15,2» значит: до 15 цифр всего, из них 2 после запятой, значит 13 до запятой.
Потеря знаков возможна на трёх этапах:
- 📦 Хранение. Реквизит документа или ресурс регистра имеет точность 2. Всё, что дальше второго знака, отбрасывается при записи с округлением.
- 🖥️ Показ. Поле формы или колонка отчёта выводит меньше знаков, чем есть в данных. Сумма в базе
1,2345, на экране1,23. - 🧮 Расчёт. Промежуточный результат в коде или в отчёте округлили функцией
Окр()раньше времени, и итог разошёлся.
Начинать нужно с диагностики: откройте запись в списке или в режиме отладки и посмотрите, что лежит в базе. Если в базе нужные знаки есть — проблема только в показе, и Конфигуратор не нужен.
| Симптом | Где причина | Что менять |
|---|---|---|
В карточке ввели 0,0075, после записи 0,01 | Точность реквизита | Тип в Конфигураторе |
| Данные в базе точные, на экране округлено | Формат поля или колонки | Формат вывода |
Отчёт показывает 0,00, а в документах есть значения | Формат колонки или группировка | Настройки отчёта |
| Итог не бьётся с суммой строк на копейки | Порядок округления | Логика расчёта |
Как поднять точность в Конфигураторе
Это единственный способ изменить то, что база хранит. Понадобится право на изменение конфигурации и обычно монопольный доступ к базе на время обновления структуры.
Сначала сделайте резервную копию базы . Изменение типа реквизита перестраивает таблицы, а при уменьшении точности лишние знаки теряются безвозвратно.
Шаги для реквизита или ресурса
- Откройте базу в режиме
Конфигуратор. - Если конфигурация типовая и стоит на поддержке, сначала разрешите изменения: меню
Конфигурация → Поддержка → Настройка поддержки. Учтите, что после этого каждое обновление релиза потребует объединения ваших правок с типовыми. - Откройте окно конфигурации (
Конфигурация → Открыть конфигурацию) и найдите объект: документ, справочник, регистр. - Выберите нужный реквизит (для регистра — ресурс) и в палитре свойств нажмите кнопку выбора рядом с полем
Тип. - В окне редактирования типа оставьте
Числои задайте длину и точность. Пример: было 15,2 — ставим 15,4. - Сохраните конфигурацию и обновите её:
Конфигурация → Сохранить конфигурацию базы данных(в старых формулировках — «Обновить конфигурацию базы данных»). - Запустите 1С:Предприятие и проверьте ввод в тестовой копии.
Увеличивая точность, не уменьшайте целую часть. Было 15,2 (13 цифр до запятой). Если поставить 10,6, целая часть сузится до 4 цифр, и крупные суммы перестанут помещаться. Правильно — повышать длину на столько же, на сколько добавляете знаков: 17,4 или 19,6.
Для сумм в рублях две цифры после запятой — норма, и повышать их незачем. Нужна ли точность выше, определяет смысл величины: ставки, нормы расхода, коэффициенты пересчёта, цена за тысячу штук.
Что произойдёт с данными
Платформа перестраивает таблицы базы. Уже записанные значения сохраняются: число 12,50 останется 12,5000. Новые знаки появятся только в тех записях, которые вы введёте или перезапишете после изменения.
На больших регистрах реструктуризация идёт долго. Планируйте её на нерабочее время, когда в базе нет пользователей.
Формат отображения: показать больше знаков без правки конфигурации
Если в базе знаков достаточно, а на экране их нет, разработчик не нужен. Формат задаётся в трёх местах.
В форме документа или справочника
В Конфигураторе откройте форму, выделите поле и в его свойствах найдите Формат (и при необходимости Формат редактирования). Нажмите кнопку выбора и в диалоге задайте количество знаков после запятой. Например, значение ЧДЦ=4 показывает четыре знака.
Пользователь в режиме «1С:Предприятие» тоже может влиять на показ: во многих списках колонки настраиваются через команду смены состава и вида колонок в меню Ещё. Какие именно параметры там доступны, зависит от формы и версии.
В отчёте на СКД
Для отчётов на системе компоновки данных формат задаётся в настройках оформления поля:
- Откройте вариант отчёта в режиме настройки (кнопка с шестерёнкой или
Ещё → Изменить вариант отчёта). - Перейдите на закладку структуры, выберите колонку-ресурс и откройте условное оформление или параметры поля.
- В свойстве Формат задайте строку вида
ЧДЦ=4.
Для типовых отчётов это работает на уровне варианта пользователя, без правки конфигурации.
В печатных формах и макетах
В макете табличного документа выделите ячейку, откройте её свойства и укажите формат на закладке с форматом. Для параметров макета вида «Число» можно ничего не менять, если вы выводите значение через Формат() в коде (о нём ниже).
Показ не создаёт знаков, которых нет. Если в базе лежит 3,14, формат ЧДЦ=6 покажет 3,140000, но точнее число не станет.
Валюта и деньги: где лишние знаки вредят
С денежными суммами логика обратная: чаще нужно не увеличить, а удержать две цифры. Но есть места, где повышенная точность оправдана.
- 💱 Курсы валют. Курс хранится с четырьмя знаками (для редких валют бывает шесть) вместе с кратностью. Типовой регистр сведений курсов это уже учитывает.
- 🏷️ Цены. Цена за единицу может иметь больше двух знаков, если товар продаётся тысячами (гвозди, крепёж). Тогда сумма строки всё равно округляется до копеек.
- 📊 Ставки и проценты. Проценты скидок и надбавок часто хранят с тремя-четырьмя знаками.
Главное правило: сумма документа округляется до копеек в конце расчёта строки, а не в середине. Если округлять цену и количество по отдельности, итог разойдётся.
Пример. Цена 0,1234 ₽ за штуку, количество 10 000 штук:
- без промежуточного округления: 0,1234 × 10 000 = 1 234,00 ₽;
- если цену сначала округлить до двух знаков (0,12), получится 0,12 × 10 000 = 1 200,00 ₽.
Расхождение 34 рубля в одной строке. Поэтому цену с четырьмя знаками нужно хранить именно с четырьмя.
Производственный учёт: нормы, коэффициенты и единицы
В производстве и закупках знаков после запятой требуется больше всего:
- ⚙️ Нормы расхода. Три грамма краски на изделие —
0,003кг. При точности 2 это превратится в0,00. - 📏 Коэффициенты единиц измерения. Пересчёт штук в килограммы или метры даёт дробные коэффициенты.
- 🧪 Количество в спецификациях. Расход на единицу продукции часто меньше сотой доли.
Универсальный приём: меняйте не точность количества во всех документах, а единицу измерения. Вместо кг на изделие берите граммы: 3 вместо 0,003. Данные точны, конфигурацию править не нужно.
Если менять тип всё-таки придётся, найдите всю цепочку. Количество проходит через спецификацию, требование-накладную, выпуск продукции и регистры остатков. Увеличили точность только в одном объекте — потеряете знаки на следующем шаге. Проверяйте каждый объект цепочки.
| Метод | Когда подходит | Риск |
|---|---|---|
| Смена единицы измерения | Не хватает 1–3 знаков в количестве | Нужно пересчитать нормы и остатки |
| Увеличение точности типа | Знаки нужны везде в цепочке | Реструктуризация, расхождения с обновлениями |
| Только формат вывода | Данные в базе уже точные | Нет, но и точнее не станет |
Округление в коде: Окр, Формат и порядок действий
Если вы пишете обработку или расширение, держите в голове три функции.
Окр(Число, Разрядность, РежимОкругления) округляет значение. Разрядность — число знаков после запятой:
Результат = Окр(Цена * Количество, 2);
Формат(Число, "ЧДЦ=4") превращает число в строку заданного вида, для вывода пользователю. Не округляйте им значение для дальнейших расчётов.
Сообщение = "Расход на изделие: " + Формат(Норма, "ЧДЦ=4; ЧГ=0");
Параметр ЧГ=0 убирает разделитель групп разрядов, если он не нужен.
Третье — порядок. Сначала вычисляйте полное выражение, затем округляйте один раз:
// Верно: одно округление в конце
Сумма = Окр(Цена * Количество * (1 - СкидкаПроцент / 100), 2);
// Неверно: промежуточное округление накапливает ошибку
Сумма = Окр(Цена * Количество, 2) - Окр(Цена * Количество * СкидкаПроцент / 100, 2);
Второй вариант иногда даёт копейку расхождения с первым, потому что округляются два числа вместо одного.
Если в запросе нужно ограничить знаки, оборачивайте выражение в ВЫРАЗИТЬ(... КАК ЧИСЛО(15, 4)): длина и точность задаются прямо в запросе, иначе результат деления может получить непредсказуемую точность.
Деление в запросе делайте осторожно: результат ЧИСЛО(15, 2) на делении обрежет знаки. Приводите выражение к нужной точности явно.
Что проверить перед правкой типа
Прежде чем лезть в Конфигуратор, ответьте себе на четыре вопроса. Они отсекают половину ненужных доработок.
- ❓ Нельзя ли обойтись другой единицей измерения? Граммы вместо килограммов часто решают задачу за пять минут.
- ❓ Точно ли знаки теряются в базе, а не на экране? Откройте запись и сравните с форматом поля.
- ❓ Кто ещё читает это число? Обмены с другими базами, выгрузки в файлы и внешние отчёты могут ждать прежнюю точность. Если принимающая сторона хранит два знака, лишние разряды она отбросит.
- ❓ Есть ли свежая копия базы и тестовая площадка? Сначала правка и проверка на копии, потом рабочая база.
Мини-кейс. Склад получает заклёпки, учёт ведётся в килограммах, норма на изделие — 2 грамма. В поле норма значение 0,002, но реквизит хранит два знака, и в базе оказывается 0,00. Вместо правки типа в трёх документах и двух регистрах завели единицу «грамм» с коэффициентом 0,001 к килограмму и ввели норму 2. Остатки по-прежнему ведутся в килограммах, а расход считается верно.
Если суммы расходятся на копейки
Расхождение в 1–2 копейки между документом и отчётом, между строкой и итогом, между учётом и регламентированным отчётом почти всегда связано с округлением. Порядок проверки такой:
- Найдите документ с расхождением и сравните сумму строк с итогом по документу.
- Проверьте точность реквизитов цены, количества и суммы. Если цена с четырьмя знаками, а сумма строки с двумя, расчёт идёт через округление.
- Посмотрите, где считается итог: по строкам или по общему выражению. Это разные способы, и копейка набегает на длинных таблицах.
- Сравните формат колонки в отчёте с точностью данных. Иногда отчёт показывает округлённое, а суммирует точное: визуально не бьётся, на деле всё верно.
Частые вопросы
Можно ли увеличить знаки в типовой конфигурации без разработчика?
Что будет с уже введёнными данными после увеличения точности?
Какую длину задавать, если добавляю два знака?
Почему в отчёте нули, хотя в документах числа есть?
ЧДЦ=3 или ЧДЦ=4.