Как управлять выводом чисел в 1С — от свойств реквизита до функции Формат()

· 9 мин

Содержание

Вид числа в 1С задаётся форматной строкой — набором параметров вроде ЧДЦ=2; ЧГ=0. Эта строка работает одинаково в трёх местах: в свойстве Формат поля на форме, в ячейке макета печатной формы и в функции Формат() встроенного языка. Разберём, как задать число знаков после запятой, убрать разделение разрядов, вывести ведущие нули и прочерк вместо нуля.

Важно с самого начала: в 1С число — это не число с плавающей точкой, а десятичное фиксированной точности. Разрядность и число дробных знаков закладываются в самом реквизите, а форматная строка только управляет тем, как это число показать пользователю. Хранимое значение она не меняет.

Форматная строка: из каких параметров она собирается

Форматная строка — это параметры через точку с запятой. Для чисел чаще всего нужны эти:

ПараметрЧто задаётПример значения
ЧДЦзнаков после запятойЧДЦ=2
ЧЦвсего разрядов (длина)ЧЦ=10
ЧГгруппировка разрядов; 0 — отключитьЧГ=0
ЧРДсимвол-разделитель дробной частиЧРД=.
ЧРГсимвол-разделитель группЧРГ=' '
ЧВНвыводить ведущие нулиЧВН=
ЧНчто показать вместо нуляЧН=—
Ллокаль (влияет на разделители)Л=en_US

По умолчанию, без форматной строки, число в русской локали выводится с разделением разрядов пробелом и запятой как разделителем дробной части: 1 234,56.

Посмотрим на поведение на одном значении 1234567.891:

  • Формат(Число, "ЧДЦ=2") → 1 234 567,89
  • Формат(Число, "ЧДЦ=2; ЧГ=0") → 1234567,89
  • Формат(Число, "ЧДЦ=0") → 1 234 568 (округление до целого)

Округление идёт по правилам 1С (к большему по модулю при .5), поэтому ЧДЦ — это не обрезка, а именно округление для показа. Само значение в базе остаётся с исходной точностью.

Здесь важно не перепутать два разных округления. Формат(Число, "ЧДЦ=2") округляет только представление — на экране 12,346, а в переменной по-прежнему 12,3456. Если нужно округлить само значение (например, перед записью суммы в документ), используйте функцию Окр(Число, 2) — она меняет хранимое число, а не его вид. Путаница этих двух вещей — источник расхождений в копейку между экраном и итогами.

Как задать разрядность и точность в свойствах реквизита

Базовый вид числа закладывается на уровне реквизита справочника, документа или регистра — в конфигураторе. Откройте свойства реквизита типа «Число»:

  • Длина — максимальное число знаков (целая и дробная части вместе).
  • Точность — сколько из них отводится под дробную часть.
  • Неотрицательное — флажок, запрещающий отрицательные значения.

Например, для суммы обычно ставят длину 15 и точность 2 — это до 13 знаков в целой части и 2 копейки. Для количества с дробными единицами точность делают 3, для штучного учёта — 0.

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

Как число выглядит на конкретной форме, настраивается отдельно. Выделите поле на форме, в палитре свойств найдите Формат (как показывать) и Формат редактирования (как вводить) и нажмите кнопку с многоточием — откроется конструктор формата. На вкладке «Число» галочками задаются те же ЧДЦ, ЧГ, ведущие нули и прочее, а внизу собирается готовая форматная строка.

Программное задание формата через функцию Формат()

В коде вид числа возвращает глобальная функция Формат(Значение, ФорматнаяСтрока):

Сумма = 1234.5;
Представление = Формат(Сумма, "ЧДЦ=2; ЧРГ=' '"); // 1 234,50

Несколько рабочих примеров с разными задачами:

// Денежный вид, два знака, пробел между разрядами
Формат(1234567.8, "ЧДЦ=2; ЧРГ=' '");   // 1 234 567,80

// Без разделения разрядов (для выгрузки в файл)
Формат(1234567.8, "ЧДЦ=2; ЧГ=0; ЧРД=.");  // 1234567.8

// Ведущие нули до 6 знаков (номер документа)
Формат(42, "ЧЦ=6; ЧВН=");  // 000042

// Прочерк вместо нуля (чтобы в отчёте не было голых нулей)
Формат(0, "ЧДЦ=2; ЧН=—");  // —

Склеивать число со строкой напрямую нельзя — получите системное представление с лишними пробелами и запятой. Для строки всегда оборачивайте число в Формат() или СтрШаблон:

Текст = СтрШаблон("Итого: %1 руб.", Формат(Итог, "ЧДЦ=2; ЧРГ=' '"));

Форматную строку удобнее собирать не руками, а конструктором: в редакторе модуля поставьте курсор в строковый параметр Формат() и вызовите конструктор форматной строки (кнопка в командной панели конструкторов). Он соберёт параметры без опечаток.

Формат чисел в отчётах, печатных формах и табличных документах

В отчёте на СКД формат задаётся без кода. Откройте схему компоновки, перейдите к списку полей набора данных, в колонке «Оформление» у нужного поля (или у ресурса) вызовите конструктор и задайте форматную строку — она применится ко всем ячейкам этого поля в результате.

В печатной форме на базе макета (табличного документа) формат задаётся прямо в ячейке:

  1. Откройте макет, выделите ячейку, где выводится число.
  2. В палитре свойств ячейки найдите свойство с форматной строкой и впишите параметры, например ЧДЦ=2; ЧРГ=' '.
  3. Ячейка должна быть заполнена параметром (тип заполнения «Параметр»), тогда формат применится к подставленному значению.

Если число подставляется в ячейку программно как уже готовая строка через Формат(), форматная строка ячейки на него не подействует — текст есть текст. Поэтому решите заранее: либо кладёте в ячейку число и форматируете ячейкой, либо кладёте строку и форматируете в коде. Смешивать не нужно.

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

Для текстового документа или вывода в сообщение пользователю остаётся только Формат() в коде — там свойств ячейки нет.

Бухгалтерский и международный вид суммы

Бухгалтерии нужен узнаваемый денежный формат: два знака после запятой, разделение разрядов, а отрицательные суммы — красным. Первая часть решается форматной строкой ЧДЦ=2; ЧРГ=' '. Красный цвет для минусов форматной строкой не задаётся — это условное оформление:

  • В отчёте на СКД добавьте условное оформление: условие «значение поля меньше 0», оформление — цвет текста красный.
  • В табличном документе цвет ячейки меняется кодом в зависимости от знака числа перед выводом области.

Скобки вокруг отрицательных сумм, как в западном «accounting», 1С отдельным параметром не делает — такой вид собирают вручную в коде.

Для международного вида переключите локаль параметром Л:

Формат(1234567.8, "ЧДЦ=2; Л=en_US");  // 1,234,567.80
Формат(1234567.8, "ЧДЦ=2; Л=ru_RU");  // 1 234 567,80

Локаль сама подставляет принятые в стране разделители: для en_US — запятая между разрядами и точка в дробной части, для ru_RU — пробел и запятая. Это надёжнее, чем вручную задавать ЧРД и ЧРГ под каждую страну.

Отдельная задача — сумма прописью для платёжных документов и счетов. Её даёт глобальная функция ЧислоПрописью:

Строка = ЧислоПрописью(1234.56, "Л=ru_RU",
    "рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 2");
// Одна тысяча двести тридцать четыре рубля 56 копеек

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

Как менять формат на лету под данные

Форматная строка — обычная строка, её можно собрать в коде из текущих условий. Это и есть «динамический формат»: число дробных знаков или локаль выбираются по данным строки.

// Точность зависит от валюты строки
ЧислоЗнаков = ?(Валюта = Валюты.JPY, 0, 2);
ФСтрока = "ЧДЦ=" + ЧислоЗнаков + "; ЧРГ=' '";
Представление = Формат(Сумма, ФСтрока);

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

Не плодите десяток почти одинаковых форматных строк по коду. Вынесите сборку строки в одну функцию и вызывайте её — проще сопровождать и менять единый стиль сумм по всей конфигурации.

Большие числа, точность и «научная нотация»

Частый вопрос — как 1С работает с очень большими числами и нотацией вида 1,2E+10. Ключевой факт: тип «Число» в 1С — десятичный фиксированной точности, а не плавающая точка, поэтому научной нотации 1С не выводит в принципе. Если вы видите E+ в данных — это пришло извне: из COM-объекта, Excel-файла или внешнего источника как строка.

Что это меняет на практике:

  • Разрядность большого числа ограничена свойством «Длина» реквизита. Если заложили длину 10, число из 12 знаков туда просто не поместится — расширяйте реквизит.
  • Для денег и количеств десятичная точность — плюс: нет накопления ошибок округления, как у double в других языках.
  • Пришедшую извне строку "1.2E+10" сначала приводите к числу (например, через выражение разбора или подготовку данных на стороне источника), а уже потом форматируйте Формат().

Если нужно показать большое число компактно (миллионы, тысячи), 1С не делит его автоматически — поделите значение в коде и подпишите единицу:

Представление = Формат(Сумма / 1000000, "ЧДЦ=1") + " млн";

Типичные ошибки при форматировании чисел

Короткий разбор того, что чаще всего ломает вывод числа.

  • 🔴 Лишние дробные знаки не появляются. Задали ЧДЦ=4, а видите два знака — упёрлись в «Точность» реквизита. Форматная строка не добавит точности, которой нет в хранимом значении.
  • 🔴 В выгрузке число склеилось с текстом. Строка "Сумма" + Итог даёт Сумма1 234,56 с разделителем разрядов. Для файлов форматируйте явно: Формат(Итог, "ЧДЦ=2; ЧГ=0; ЧРД=.").
  • 🔴 Формат ячейки макета не сработал. В ячейку положили уже готовую строку из Формат(). Форматная строка ячейки действует только на число, подставленное параметром.
  • 🔴 Разделитель разрядов попал в CSV и сломал колонки. Пробел-разделитель групп — часть представления. В выгрузках ставьте ЧГ=0.
  • 🔴 Ноль вместо прочерка в отчёте. Чтобы пустые суммы не выводились голым 0, добавьте ЧН= (пусто) или ЧН=—.
Проверьте себя
Как убрать разделение разрядов пробелом при выводе числа?
Что показывает параметр `ЧН` в форматной строке?
Почему заданные `ЧДЦ=4` не добавили знаки после запятой?

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

Чем отличается «Формат» от «Формат редактирования» у поля?
Формат управляет тем, как число показывается, когда поле неактивно. Формат редактирования — как оно выглядит в момент ввода. Часто редактирование делают без группировки разрядов, чтобы было удобнее печатать цифры.
Как вывести число всегда с двумя знаками, даже если дробная часть нулевая?
Задайте ЧДЦ=2 — тогда 100 покажется как 100,00. Параметр фиксирует число дробных знаков, а не обрезает незначащие нули.
Можно ли одной форматной строкой задать и дату, и число?
Нет. Для дат свои параметры (ДФ, ДЛФ), для чисел — свои (Ч...). Функция Формат() смотрит на тип значения и применяет подходящие параметры.
Почему при выгрузке в файл число записалось с пробелами внутри?
Сработало разделение разрядов по умолчанию. Для машинного формата добавьте ЧГ=0, а разделитель дробной части приведите к точке через ЧРД=..
Как показать сумму прописью для счёта или платёжки?
Используйте функцию ЧислоПрописью с указанием локали и предмета (рубли/копейки). Она возвращает готовую строку для печатной формы.