Как управлять выводом чисел в 1С — от свойств реквизита до функции Формат()
Содержание
Вид числа в 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; ЧРГ=' '"));
Форматную строку удобнее собирать не руками, а конструктором: в редакторе модуля поставьте курсор в строковый параметр Формат() и вызовите конструктор форматной строки (кнопка в командной панели конструкторов). Он соберёт параметры без опечаток.
Формат чисел в отчётах, печатных формах и табличных документах
В отчёте на СКД формат задаётся без кода. Откройте схему компоновки, перейдите к списку полей набора данных, в колонке «Оформление» у нужного поля (или у ресурса) вызовите конструктор и задайте форматную строку — она применится ко всем ячейкам этого поля в результате.
В печатной форме на базе макета (табличного документа) формат задаётся прямо в ячейке:
- Откройте макет, выделите ячейку, где выводится число.
- В палитре свойств ячейки найдите свойство с форматной строкой и впишите параметры, например
ЧДЦ=2; ЧРГ=' '. - Ячейка должна быть заполнена параметром (тип заполнения «Параметр»), тогда формат применится к подставленному значению.
Если число подставляется в ячейку программно как уже готовая строка через Формат(), форматная строка ячейки на него не подействует — текст есть текст. Поэтому решите заранее: либо кладёте в ячейку число и форматируете ячейкой, либо кладёте строку и форматируете в коде. Смешивать не нужно.
Удобный приём для печатных форм: задайте формат в ячейке макета один раз, а в код кладите чистое число. Тогда правка стиля сумм (скажем, переход на разделитель-пробел) делается в макете, без переписывания кода. Для итоговых строк, где нужны разные форматы в одном столбце, проще оставить ячейку с типом «Параметр» и подставлять число, а внешний вид менять через дубль ячейки под каждый случай.
Для текстового документа или вывода в сообщение пользователю остаётся только Формат() в коде — там свойств ячейки нет.
Бухгалтерский и международный вид суммы
Бухгалтерии нужен узнаваемый денежный формат: два знака после запятой, разделение разрядов, а отрицательные суммы — красным. Первая часть решается форматной строкой ЧДЦ=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, добавьтеЧН=(пусто) илиЧН=—.
Частые вопросы
Чем отличается «Формат» от «Формат редактирования» у поля?
Формат управляет тем, как число показывается, когда поле неактивно. Формат редактирования — как оно выглядит в момент ввода. Часто редактирование делают без группировки разрядов, чтобы было удобнее печатать цифры.Как вывести число всегда с двумя знаками, даже если дробная часть нулевая?
ЧДЦ=2 — тогда 100 покажется как 100,00. Параметр фиксирует число дробных знаков, а не обрезает незначащие нули.Можно ли одной форматной строкой задать и дату, и число?
ДФ, ДЛФ), для чисел — свои (Ч...). Функция Формат() смотрит на тип значения и применяет подходящие параметры.Почему при выгрузке в файл число записалось с пробелами внутри?
ЧГ=0, а разделитель дробной части приведите к точке через ЧРД=..Как показать сумму прописью для счёта или платёжки?
ЧислоПрописью с указанием локали и предмета (рубли/копейки). Она возвращает готовую строку для печатной формы.