Точность чисел в 1С 8.3: где задаётся разрядность и как её изменить
Содержание
Количество знаков после запятой в 1С 8.3 задаётся не галочкой в настройках, а типом реквизита: в Конфигураторе у каждого числового поля есть свойства Длина и Точность. Точность — это и есть число десятичных знаков. Поменять её можно только доработкой конфигурации. В пользовательском режиме доступно другое: настроить, сколько знаков показывать в отчёте, форме или печатной форме.
Выбор простой. Нужно хранить больше знаков (цена 0,0035 руб., вес 0,0125 кг) — меняют точность в Конфигураторе. Нужно лишь красиво вывести уже сохранённое число — меняют формат отображения, базу трогать не надо. Ниже разобраны оба пути и места, где копейки теряются чаще всего: валюта, себестоимость, печать.
Как 1С хранит число: длина, точность и почему знаки «пропадают»
Числовой тип в 1С описывается тремя параметрами:
- 🔢 Длина — сколько всего цифр в числе, вместе с дробной частью. Максимум — 38 цифр.
- 🎯 Точность — сколько из них после запятой. Не может быть больше длины.
- ➖ Неотрицательное — флажок, запрещающий ввод чисел меньше нуля.
Пример: тип Число(15, 2) хранит до 13 цифр в целой части и 2 в дробной. Максимальное значение — 9 999 999 999 999,99. Если записать в такой реквизит 125,4567, в базе останется 125,46.
Отсюда главное правило: лишние знаки отбрасываются в момент записи в реквизит. Вернуть их потом нельзя — в базе их просто нет. Поэтому если цена поставщика пришла с четырьмя знаками, а у реквизита «Цена» точность 2, расчёт уже искажён.
Внутри кода точность другая. Переменная во встроенном языке хранит число без ограничения в 2 или 3 знака, пока его не присвоят реквизиту. Деление 100 / 3 даст длинную дробь, и только запись в поле обрежет её до заданной точности.
Как это выглядит в типовых конфигурациях
| Что хранится | Типичная разрядность | На что влияет |
|---|---|---|
| Сумма, НДС | 2 знака | Копейки в документах и проводках |
| Количество | 3 знака | Граммы при учёте в килограммах |
| Цена | 2 знака | Цены с долями копейки не сохранятся |
| Курс валюты | 4 знака | Точность пересчёта в рубли |
Конкретная длина зависит от конфигурации и релиза. Посмотреть её можно в Конфигураторе, открыв нужный реквизит.
Настройка точности реквизита в Конфигураторе
Это единственный способ действительно увеличить число хранимых знаков. Порядок такой.
- Сделайте резервную копию:
Администрирование → Выгрузить информационную базув Конфигураторе. Изменение структуры типового объекта без копии — риск потерять данные. - Откройте конфигурацию:
Конфигурация → Открыть конфигурацию. - Найдите объект в дереве метаданных: документ, справочник или регистр. Удобно искать по имени через строку поиска над деревом.
- Откройте его свойства (двойной щелчок), перейдите на вкладку Данные.
- Выделите числовой реквизит (в шапке или в табличной части) и откройте палитру свойств.
- В свойстве Тип нажмите кнопку выбора и измените Точность. Длину увеличьте на столько же, иначе уменьшится целая часть.
- Сохраните конфигурацию и выполните
Конфигурация → Обновить конфигурацию базы данных(F7). Платформа покажет список реструктурируемых объектов — примите изменения.
Для обновления структуры базы нужен монопольный режим: остальных пользователей придётся попросить выйти. На большой базе реструктуризация таблиц движений занимает от минут до часов, планируйте её на нерабочее время.
Одного реквизита мало: цепочка объектов
Новая точность цены в документе ничего не даст, если дальше число пишется в поле с прежней разрядностью. Пройдите всю цепочку:
- 📄 реквизит табличной части документа;
- 📦 ресурс регистра накопления или сведений, куда документ делает движения;
- 🧾 реквизиты связанных документов, которые копируют значение при вводе на основании;
- 🧮 общие модули, где результат округляется функцией
Окр()до 2 знаков.
Последний пункт часто забывают. Точность поля увеличили, а в коде пересчёта стоит Окр(Сумма / Количество, 2) — и число снова обрезается.
Типовая конфигурация на поддержке
Если конфигурация на поддержке без возможности изменения, Конфигуратор не даст править типовой реквизит. Придётся включить возможность изменения в Конфигурация → Поддержка → Настройка поддержки. После этого каждое обновление потребует сравнения и объединения конфигураций, а изменённый реквизит придётся проверять заново.
Расширение конфигурации тут не поможет: у заимствованного реквизита нельзя поменять тип. Расширением можно добавить свой новый реквизит с нужной точностью, но тогда переписывать придётся все места, где используется типовой.
Часто проще обойти задачу без доработки. Цену за штуку в 0,0035 руб. удобнее учитывать в тысячах штук: 3,50 руб. за тысячу. Вес 0,0125 кг — в граммах: 12,5 г.
Разрядность в пользовательском режиме: что можно поменять без программиста
В режиме 1С:Предприятие точность хранения изменить нельзя. Зато вывод настраивается гибко, и для многих задач этого хватает.
Отчёты на системе компоновки
Почти все стандартные отчёты в типовых конфигурациях построены на системе компоновки данных (СКД). Количество знаков в колонке меняется через условное оформление:
- Откройте отчёт и нажмите Настройки.
- Переключите вид настроек на расширенный, если он доступен.
- Перейдите на вкладку Условное оформление и добавьте новую строку.
- В поле Оформление найдите параметр Формат и откройте конструктор формата.
- На вкладке «Число» задайте нужное число дробных знаков, при желании — разделитель групп.
- В Оформляемых полях укажите колонку, к которой применить формат.
Условие оставьте пустым — тогда формат применится ко всем строкам. Сохраните вариант отчёта, чтобы не настраивать заново.
Формат меняет только отображение. Если в базе количество хранится с тремя знаками, отчёт с форматом «4 знака» покажет четвёртый ноль, а не реальное значение.
Поля формы и сумма в итогах
В форме документа пользователь формат поля сменить не может — это свойство элемента формы. Если в колонке табличной части видно два знака, а в реквизите хранится три, программист меняет свойства Формат и ФорматРедактирования у поля формы. Первое отвечает за просмотр, второе — за ввод.
Валюта и курсы: где теряются копейки при пересчёте
Курс валюты в типовых конфигурациях хранится с четырьмя знаками после запятой, вместе с кратностью. Кратность нужна для валют с маленьким курсом: курс 100 единиц валюты удобнее хранить как число с кратностью 100, чем как 0,0123 за единицу.
Сумма в валюте и сумма в рублях — отдельные реквизиты по 2 знака. Пересчёт идёт по формуле:
СуммаРуб = Окр(СуммаВал * Курс / Кратность, 2)
Пример: 1 234,57 USD по курсу 92,4518 при кратности 1. Произведение — 114 138,218726, в рублёвую сумму попадёт 114 138,22. Если в документе стоит другое число, сначала сравните курс в документе с курсом в справочнике валют на дату.
Несколько документов по одному договору, каждый округлённый отдельно, дают расхождение в копейку-две с пересчётом общей суммы. Это не ошибка программы, а результат округления каждой строки. Такие копейки уходят в курсовые разницы при переоценке.
Увеличивать точность курса бессмысленно: курс ЦБ РФ публикуется с четырьмя знаками после запятой, больше данных просто нет.
Себестоимость и материалы: откуда «висящие» копейки
Это главный источник вопросов про знаки после запятой у бухгалтера. Ситуация типичная: количество на складе стало 0, а сумма осталась 0,01 или −0,01.
Почему так происходит:
- ⚖️ стоимость списания считается делением суммы на количество, а результат округляется до копеек;
- 📉 при частичном списании 3 шт. из 7 на 100 руб. получается 42,857…, в движение попадёт 42,86;
- 🔁 после нескольких списаний остаток копеек расходится с нулём.
Пример с проверкой, если считать каждое списание по средней без корректировки: партия 7 шт. на 100,00 руб. Списали 3 шт. — 42,86 руб., ещё 3 шт. — 42,86 руб., последнюю 1 шт. — 14,29 руб. Итого списано 100,01 руб., остаток по сумме −0,01 при нулевом количестве.
Как это решается в учёте
Типовые конфигурации умеют закрывать такие остатки сами. При списании последней единицы программа берёт не расчётную стоимость, а весь остаток суммы. Плюс регламентная операция расчёта себестоимости в закрытии месяца корректирует стоимость списания задним числом.
Если копейки всё же висят:
- Проверьте, что закрытие месяца выполнено полностью и без ошибок.
- Сформируйте оборотно-сальдовую ведомость по счёту с отбором по номенклатуре и складу — найдите позицию с нулевым количеством и ненулевой суммой.
- Перепроведите документы списания за период, затем повторите закрытие месяца.
- Если остаток остался, спишите его ручной операцией или корректировкой, согласовав с главным бухгалтером.
Материалы в мелких единицах
Для материалов, которые расходуются граммами или миллилитрами, трёх знаков в количестве иногда мало. Решения без доработки:
- 📏 ведите учёт в более мелкой базовой единице (грамм вместо килограмма);
- 📦 используйте упаковки или единицы с коэффициентом, если конфигурация их поддерживает: закупка в килограммах, хранение в граммах;
- 🧮 нормы расхода в спецификациях указывайте на 1 000 изделий, а не на одно.
Форматирование чисел в печатных формах и коде
Печатная форма — это табличный документ, построенный по макету. Количество знаков в нём задаётся двумя способами.
Через свойство ячейки макета
- В Конфигураторе откройте макет печатной формы в объекте.
- Выделите ячейку с параметром (например,
Цена). - В палитре свойств найдите Формат и вызовите конструктор форматной строки.
- На вкладке «Число» укажите количество дробных знаков.
Для типовых конфигураций правка макета — это изменение на поддержке. Печатную форму удобнее сделать внешней обработкой или переопределить в расширении, чтобы не снимать конфигурацию с поддержки.
Через функцию Формат()
В коде заполнения печатной формы число превращают в строку функцией Формат(). Основные параметры форматной строки:
| Параметр | Что делает | Пример результата |
|---|---|---|
ЧДЦ=3 | Число дробных знаков | 1 250,500 |
ЧГ=0 | Отключает разделитель групп | 1250,50 |
ЧРД=. | Разделитель дробной части | 1250.50 |
ЧН=0 | Что выводить при нуле | 0 вместо пустой строки |
Пример, который выводит цену с четырьмя знаками без пробелов между разрядами:
ЦенаСтрокой = Формат(Цена, "ЧДЦ=4; ЧГ=0");
// Цена = 1250.0035 -> "1250,0035"
Округление для расчётов делают функцией Окр(). Третий параметр задаёт режим для пятёрки:
Окр(2.345, 2, РежимОкругления.Окр15как20); // 2.35 — пятёрка вверх
Окр(2.345, 2, РежимОкругления.Окр15как10); // 2.34 — пятёрка вниз
Формат() с параметром ЧДЦ тоже округляет при выводе, но число в переменной остаётся прежним. Для сумм, которые пойдут в учёт, всегда используйте Окр(), а не форматирование.
Деление в запросе
Деление в языке запросов даёт результат с большим числом знаков. Если поле дальше выводится или сравнивается, ограничьте его явно:
ВЫРАЗИТЬ(Остатки.СуммаОстаток / Остатки.КоличествоОстаток КАК ЧИСЛО(15, 4)) КАК ЦенаСредняя
Деление на ноль в запросе не вызывает ошибку, как в коде, но результат лучше защитить конструкцией ВЫБОР КОГДА Остатки.КоличествоОстаток = 0 ТОГДА 0 ИНАЧЕ ... КОНЕЦ.