Разработка и Конфигурация · 13 мин
Как в 1С увеличить количество знаков после запятой
Как увеличить точность (число знаков после запятой) в 1С: настройка длины и точности числа в конфигураторе, в отчётах, печатных формах и при выводе на экран.
Вопрос о количестве знаков после запятой в 1С возникает в двух разных ситуациях. Первая — число физически хранится с недостаточной точностью: реквизит объявлен как «Число (15, 2)», а цену нужно хранить с четырьмя знаками, например для импортных товаров или курсов валют. Вторая — число хранится точно, но на экране или в печатной форме отображается округлённым до двух знаков.
Это принципиально разные задачи, и решаются они по-разному. В первом случае нужно менять определение типа данных в конфигураторе, во втором — достаточно настроить формат вывода, не трогая конфигурацию. Ошибка в выборе подхода приводит либо к потере копеек в учёте, либо к лишней доработке там, где хватило бы одной настройки.
Ниже разобраны оба сценария: изменение точности реквизита в конфигураторе, настройка формата отображения, округление в запросах и коде, а также типичные ошибки, которые приводят к расхождениям в суммах документов.
Определяем, где именно теряется точность
Прежде чем что-то менять, нужно понять, на каком этапе «обрезаются» знаки после запятой. Возможны три варианта: число хранится с малой точностью (проблема в типе данных), число хранится точно, но отображается округлённым (проблема в формате), либо округление происходит в коде или запросе при расчёте.
Простая проверка: откройте элемент справочника или документ и посмотрите значение поля. Затем сравните его с тем, что выводится в отчёте или печатной форме. Если в карточке объекта знаков больше, чем в отчёте — проблема только в отображении. Если уже в карточке число округлено до двух знаков — точность ограничена на уровне типа реквизита.
Проверьте свойства реквизита в конфигураторе: тип Число, параметр Точность
Проверьте свойство Формат поля отчёта или печатной формы
Ищите функции Окр(), ОКРУГЛ() или ВЫРАЗИТЬ с точностью 2
Проверьте порядок округления: по строкам или по итогу
Увеличиваем точность реквизита в конфигураторе
Основной способ — изменить свойства типа данных у реквизита. Для этого откройте конфигуратор, найдите нужный объект (справочник, документ, регистр) и перейдите к реквизиту, точность которого нужно увеличить. В палитре свойств найдите строку «Тип» и нажмите кнопку выбора — откроется редактор типа данных.
В редакторе типа для «Числа» задаются три параметра: «Длина» — общее количество цифр, «Точность» — количество знаков после запятой, и признак «Неотрицательное». Например, «Число (15, 2)» хранит максимум 15 цифр, из которых 2 — после запятой. Чтобы хранить цену с четырьмя знаками, установите «Точность» равной 4, а при необходимости увеличьте и общую длину, чтобы не потерять целую часть.
После изменения сохраните конфигурацию и выполните обновление конфигурации базы данных (меню «Конфигурация» → «Обновить конфигурацию базы данных»). Платформа выполнит реструктуризацию таблиц — на больших базах это может занять заметное время, поэтому операцию лучше проводить в нерабочие часы.
- 1Откройте конфигуратор и найдите нужный объект (справочник, документ, регистр)
- 2Выделите реквизит и откройте редактор типа данных через свойство «Тип»
- 3Увеличьте параметр «Точность» до нужного числа знаков, при необходимости увеличьте «Длину»
- 4Сохраните конфигурацию и обновите конфигурацию базы данных
- 5Проверьте на тестовом документе, что значения вводятся и сохраняются с новой точностью
Что учесть при изменении типа
Увеличение точности — безопасная операция для существующих данных: старые значения просто дополнятся нулями в дробной части. Опасно обратное действие: уменьшение точности или длины приведёт к округлению или отсечению уже хранящихся значений, и восстановить их будет нельзя.
Учтите, что одно и то же поле может использоваться в нескольких местах: реквизит документа, ресурс регистра накопления, реквизит табличной части. Если увеличить точность только в одном месте, значения будут округляться при записи в регистр, и в отчётах снова появятся расхождения. Проверьте все связанные объекты — удобно использовать поиск ссылок на объект в конфигураторе.
Меняем точность в типовой конфигурации без снятия с поддержки
Если конфигурация типовая и обновляется автоматически, прямое изменение реквизита нежелательно: объект окажется на замке, и при каждом обновлении изменение придётся сопоставлять вручную. В таких случаях используют механизм расширений конфигурации.
Расширение позволяет добавить собственный реквизит с нужной точностью и вывести его на форму, не изменяя типовой объект. Однако есть ограничение: изменить тип существующего типового реквизита через расширение нельзя — можно только добавить новый. Поэтому если нужно хранить цену с четырьмя знаками, а типовой реквизит «Цена» имеет точность 2, придётся добавить свой реквизит «Цена точная» и доработать логику расчётов в расширении.
Перед выбором этого пути оцените трудозатраты: если точность нужна только для аналитики и отчётов, часто проще хранить точное значение в дополнительном реквизите или регистре сведений, а в учётных документах оставить типовое округление.
Как выбрать действие
Настраиваем отображение знаков без изменения данных
Если данные хранятся точно, а задача — показать больше знаков на экране, в отчёте или печатной форме, используется свойство «Формат». Оно есть у полей ввода на формах, у колонок таблиц, у полей отчётов СКД и у ячеек табличных макетов.
Строка формата для числа задаётся параметром ЧДЦ (число десятичных знаков). Например, конструкция ЧДЦ=4 выведет число с четырьмя знаками после запятой, а ЧДЦ=4; ЧН=0,0000 дополнительно покажет нули вместо пустого значения. В конфигураторе формат можно задать через удобный конструктор: откройте палитру свойств поля, найдите «Формат» и нажмите кнопку выбора.
В отчётах на СКД формат задаётся на закладке «Наборы данных» для поля (колонка «Оформление») или в настройках отчёта через «Дополнительные настройки» — параметр «Формат» у выбранного поля. В печатных формах на основе табличного документа формат устанавливается в свойствах ячейки макета либо программно через функцию Формат().
// Программный вывод числа с 4 знаками после запятой
СтрокаЦены = Формат(Цена, "ЧДЦ=4; ЧРД=.; ЧН=0,0000");Округление в коде и запросах
Даже при правильных типах данных точность может теряться в алгоритмах. Во встроенном языке за округление отвечает функция Окр(Число, Разрядность) — если в коде расчёта цены стоит Окр(Сумма / Количество, 2), результат всегда будет иметь два знака, независимо от типа реквизита. Найдите такие места через глобальный поиск по строке «Окр(» и при необходимости увеличьте второй параметр.
В запросах аналогичную роль играет конструкция ВЫРАЗИТЬ(Поле КАК ЧИСЛО(15, 2)) — она принудительно приводит значение к указанной точности. Также округление может происходить при вычислении среднего или делении итогов, если разработчик явно ограничил разрядность результата.
Отдельная тема — порядок округления в документах. Если округлять цену до копеек в каждой строке, а потом суммировать, итог документа может разойтись с расчётом «сумма без округления, потом округлить». Это не ошибка платформы, а особенность методики. При увеличении точности расчётов убедитесь, что порядок округления согласован во всех связанных документах и отчётах, иначе получите расхождения на копейки между ними.
Проверяем результат после изменений
После любых изменений выполните контрольную проверку на тестовых данных. Создайте документ с ценой, содержащей три-четыре знака после запятой, проведите его и убедитесь, что значение сохранилось без округления. Затем постройте отчёт по соответствующему регистру и сверьте цифры с документом.
Дополнительно проверьте печатную форму и обмены данными, если они настроены: при выгрузке в XML или через планы обмена точность определяется типом поля в формате обмена, и несоответствие типов может снова обрезать знаки уже на стороне приёмника.
Как проверить результат
После записи значение сохраняется полностью
Значение округляется до 12,35 — точность реквизита не изменилась
Суммы в отчёте совпадают с документом до последнего знака
В отчёте два знака — не увеличена точность ресурса регистра
Выводится нужное число знаков
Знаки обрезаны — проверьте формат ячейки макета
Итог сходится с расчётом вне 1С
Расхождение на копейки — несогласованный порядок округления
Ограничения и альтернативные подходы
У числового типа в 1С есть предел разрядности — максимальная длина числа ограничена (38 разрядов, из них на дробную часть можно выделить не более установленного в типе значения точности). Для подавляющего большинства учётных задач этого достаточно, но при работе с очень малыми величинами (например, нормы расхода материалов на единицу продукции) иногда рациональнее изменить единицу измерения: хранить расход в граммах вместо тонн, а не наращивать знаки после запятой.
Ещё одна альтернатива — хранение значения вместе с множителем: например, курс валюты и кратность. Такой подход исторически используется в типовых конфигурациях и позволяет обойтись стандартной точностью без потери точности пересчётов.
Наконец, помните о регламенте: если точность увеличивается для цен или сумм, которые попадают в регламентированную отчётность и печатные документы, убедитесь, что внешний вид документов остаётся приемлемым — лишние знаки в печатной форме счёта могут выглядеть неуместно, и для печати стоит задать отдельный формат с округлением до копеек.
Что важно запомнить
Сначала определите, где теряются знаки: в типе данных, в формате вывода или в коде округления. Точность хранения меняется в конфигураторе через свойства типа «Число» с последующим обновлением конфигурации базы и обязательной копией. Для отображения достаточно формата ЧДЦ. В типовых конфигурациях используйте расширения. После изменений проверьте документ, регистры, печать и обмены.
Частые вопросы
Увеличил точность реквизита, но старые документы всё равно показывают два знака. Это нормально?
Да. Старые значения были записаны с двумя знаками, и увеличение точности не восстанавливает потерянные разряды — они просто дополняются нулями. Новая точность начнёт работать для вновь вводимых и перезаписанных значений. Если нужно пересчитать исторические данные, потребуется отдельная обработка с исходными точными данными.
Можно ли изменить точность числа без конфигуратора, прямо в режиме Предприятия?
Точность хранения (тип реквизита) — нет, это свойство метаданных и меняется только в конфигураторе. А вот формат отображения в отчётах пользователь часто может настроить сам: в настройках отчёта на СКД через дополнительные настройки поля или через «Изменить вариант отчёта».
Почему после увеличения длины и точности числа в документе отчёт всё равно округляет?
Скорее всего, документ при проведении пишет данные в регистр, а у ресурса регистра точность осталась прежней. Проверьте все регистры, по которым двигается документ, и синхронизируйте точность ресурсов с точностью реквизитов. Также проверьте, нет ли в запросе отчёта конструкции ВЫРАЗИТЬ с малой точностью.
Опасно ли увеличивать точность на рабочей базе с данными?
Само по себе увеличение точности и длины безопасно: существующие значения не искажаются. Риск связан с процессом реструктуризации — на больших таблицах она занимает время и требует монопольного доступа. Обязательно сделайте резервную копию и проводите обновление вне рабочего времени. Опасно только уменьшение точности или длины — оно необратимо обрезает данные.
Как вывести в печатной форме четыре знака, если в макете выводится два?
Откройте макет печатной формы в конфигураторе, выделите нужную ячейку и в палитре свойств задайте «Формат» со значением ЧДЦ=4. Если значение выводится программно через функцию Формат() в модуле менеджера печати, измените параметры форматной строки там. В типовых конфигурациях макет лучше переопределить через расширение, чтобы не потерять изменение при обновлении.
Что делать, если расхождение на копейки возникает между документом и отчётом даже при одинаковой точности?
Проверьте порядок округления: в документе сумма может считаться как сумма округлённых строк, а в отчёте — как округление суммы точных значений. Приведите методику к единому виду: либо везде округлять по строкам и суммировать, либо суммировать точные значения и округлять итог. Также проверьте, не округляются ли промежуточные результаты функцией Окр() в модуле проведения.