Формат числа в 1С задают функцией Формат(): она превращает число в строку по форматной строке — с нужным числом знаков после запятой, без пробелов между разрядами, с ведущими нулями или с подписью валюты. Значение при этом не меняется, меняется только вид числа в сообщении, печатной форме, файле выгрузки или адресе HTTP-запроса.
Задача встречается в трёх местах. В печатных формах суммы выводят с копейками, а нулевые строки — прочерком. В обменах число должно уйти с точкой и без разделителей групп, иначе принимающая сторона его не разберёт. В кодах и номерах нужны ведущие нули: «000042». Ниже — шпаргалка по параметрам и готовые функции для каждого случая. Результаты в комментариях даны для русской локали, платформа 1С 8.3.
Синтаксис: Формат(Значение, ФорматнаяСтрока). Форматная строка состоит из пар Имя=Значение через точку с запятой: "ЧДЦ=2; ЧГ=0". Значение с пробелом или служебным символом берут в кавычки. Удобнее одинарные: двойную кавычку внутри строкового литерала 1С приходится удваивать. В скобках в таблице — английские имена параметров из синтаксис-помощника.
| Параметр | Что задаёт | Пример | Результат |
|---|---|---|---|
ЧДЦ (NFD) | знаков после запятой, с округлением | ЧДЦ=2 | 1 234 567,89 |
ЧЦ (ND) | всего цифр в целой и дробной части; без ЧДЦ дробь не выводится | ЧЦ=10 | 1 234 568 |
ЧГ (NG) | группировка разрядов, 0 — без групп | ЧГ=0 | 1234567,891 |
ЧРГ (NGS) | разделитель групп разрядов | ЧРГ=. | 1.234.567,891 |
ЧРД (NDS) | разделитель целой и дробной части | ЧРД=. | 1 234 567.891 |
ЧН (NZ) | строка вместо нуля; без параметра ноль — пустая строка | ЧН=0 | 0 |
ЧВН (NLZ) | ведущие нули до длины ЧЦ, значение параметра не важно | ЧЦ=6; ЧВН=; ЧГ=0 | 000042 |
ЧО (NN) | вид отрицательного числа, варианты 0–4 | ЧО=0 | (1 234,5) |
ЧС (NS) | сдвиг разрядов: 3 — деление на тысячу | ЧС=3; ЧДЦ=1 | 1 234,6 |
ЧФ (NF) | шаблон, Ч — место числа | ЧФ="Ч руб." | 1 234 567,891 руб. |
Л (L) | язык и страна для стандартного вида | Л=en_US | 1,234,567.891 |
Примеры — на числе 1234567,891; для ЧН взят ноль, для ЧВН — 42, для ЧО — минус 1234,5. Варианты ЧО: 0 — «(1,1)», 1 — «-1,1», 2 — «- 1,1», 3 — «1,1-», 4 — «1,1 -». То же в коде:
&НаКлиенте
Процедура ПоказатьФорматыЧисла(Команда)
Сумма = 1234567.891;
// Без форматной строки: группы разрядов, запятая, все знаки дроби
Сообщить(Формат(Сумма)); // 1 234 567,891
Сообщить(Формат(Сумма, "ЧДЦ=2")); // 1 234 567,89
Сообщить(Формат(Сумма, "ЧДЦ=0")); // 1 234 568
// Без разделителей групп и с точкой
Сообщить(Формат(Сумма, "ЧДЦ=2; ЧГ=0")); // 1234567,89
Сообщить(Формат(Сумма, "ЧДЦ=2; ЧГ=0; ЧРД=.")); // 1234567.89
// Свои разделители: обычный пробел вместо неразрывного, точка в группах
Сообщить(Формат(Сумма, "ЧДЦ=2; ЧРГ=' '")); // 1 234 567,89
Сообщить(Формат(Сумма, "ЧДЦ=2; ЧРГ=.")); // 1.234.567,89
// ЧГ=3 группирует только три младших разряда, стандартный вид - ЧГ=3,0
Сообщить(Формат(Сумма, "ЧГ=3")); // 1234 567,891
// ЧЦ - всего цифр; без ЧДЦ дробная часть не выводится
Сообщить(Формат(Сумма, "ЧЦ=10")); // 1 234 568
Сообщить(Формат(Сумма, "ЧЦ=10; ЧДЦ=2")); // 1 234 567,89
// ЧС=3 - в тысячах, ЧО=0 - минус скобками
Сообщить(Формат(Сумма, "ЧС=3; ЧДЦ=1")); // 1 234,6
Сообщить(Формат(-1234.5, "ЧДЦ=2; ЧО=0")); // (1 234,50)
// Ноль: без ЧН получается пустая строка
Сообщить("[" + Формат(0, "ЧДЦ=2") + "]"); // []
Сообщить(Формат(0, "ЧН=0")); // 0
Сообщить(Формат(0, "ЧДЦ=2; ЧН='0,00'")); // 0,00
Сообщить(Формат(0, "ЧДЦ=2; ЧН='—'")); // —
// Ведущие нули: длину задаёт ЧЦ
Сообщить(Формат(42, "ЧЦ=6; ЧВН=; ЧГ=0")); // 000042
// Шаблон ЧФ: двойные кавычки внутри литерала удваиваются
Сообщить(Формат(1500, "ЧДЦ=2; ЧФ=""Ч руб.""")); // 1 500,00 руб.
// Л - разделители по правилам другого языка и страны
Сообщить(Формат(Сумма, "Л=en_US; ЧДЦ=2")); // 1,234,567.89
КонецПроцедуры
Что видно из листинга:
Символы.НПП, код 160). СтрЗаменить(Текст, " ", "") его не уберёт, а обычный пробел задают явно: ЧРГ=' '.Строка(0) вернёт «0», Формат(0) — пустую строку, пока не задан ЧН.Окр15как20, но только представление: значение в переменной не меняется.ЧГ=3,0 или параметр не задан.Стандартный вид зависит от региональных установок информационной базы (в конфигураторе: «Администрирование» → «Региональные установки информационной базы») и языка сеанса. Параметр Л фиксирует язык и страну, например для инвойса иностранному покупателю. Округлить само значение, а не строку, — задача Окр(), режимы разобраны в статье про округление в 1С.
Форматную строку можно не набирать вручную: кнопка «...» у свойства «Формат» в палитре свойств и пункт «Конструктор форматной строки...» в контекстном меню модуля открывают конструктор, который разбирает и готовую строку.
Когда число склеивают со строкой ("limit=" + 1000) или передают в СтрШаблон(), платформа берёт стандартное представление с разделителями групп. Человеку «1 000» читать удобно, а адресу запроса, строке CSV или коду для внешней системы нужно число без разделителей и с предсказуемым знаком дробной части. Способы перевести число в строку:
| Способ | 1234567,891 | 0 | -1500 |
|---|---|---|---|
Строка(Ч), "" + Ч, СтрШаблон() | 1 234 567,891 | 0 | -1 500 |
Формат(Ч) | 1 234 567,891 | пустая строка | -1 500 |
Формат(Ч, "ЧГ=0") | 1234567,891 | пустая строка | -1500 |
Формат(Ч, "ЧН=0; ЧГ=0") | 1234567,891 | 0 | -1500 |
Формат(Ч, "ЧДЦ=2; ЧРД=.; ЧН=0; ЧГ=0") | 1234567.89 | 0 | -1500.00 |
XMLСтрока(Ч) | 1234567.891 | 0 | -1500 |
Для XML подходит XMLСтрока(): это представление decimal из схемы XML, оно не зависит от настроек базы, а обратно строку читает XMLЗначение(Тип("Число"), Строка). Обе функции есть на сервере и в тонком клиенте, но не в веб-клиенте. Фиксированного числа знаков XMLСтрока() не держит: 1500,50 станет «1500.5». В JSON число строкой не превращают — ЗаписатьJSON() запишет его сам, см. статью про JSON в 1С. Для CSV, банковских файлов, адресов и кодов — функции общего модуля:
// Общий модуль ФорматЧислаКлиентСервер:
// флажки «Клиент (управляемое приложение)» и «Сервер».
// XMLСтрока() в веб-клиенте недоступна, поэтому числа в строки переводит Формат().
// Число для CSV, TXT и банковских файлов: точка, без разделителей групп.
// ЧислоДляФайла(1234567.891) = "1234567.89", ЧислоДляФайла(-15) = "-15.00",
// ЧислоДляФайла(0) = "0.00".
Функция ЧислоДляФайла(Знач Число, Знач Знаков = 2) Экспорт
// Ноль в том же виде, что и остальные числа
Ноль = ?(Знаков > 0, "0." + Лев("0000000000", Знаков), "0");
// Разделители и минус заданы явно: вид не зависит от настроек базы
ФорматнаяСтрока = "ЧДЦ=" + Формат(Знаков, "ЧН=0; ЧГ=0")
+ "; ЧРД=.; ЧГ=0; ЧО=1; ЧН='" + Ноль + "'";
Возврат Формат(Число, ФорматнаяСтрока);
КонецФункции
// Код фиксированной длины с ведущими нулями: КодСНулями(42, 6) = "000042".
Функция КодСНулями(Знач Число, Знач Длина) Экспорт
Если Число <= 0 Или Число <> Цел(Число) Тогда
// Ноль Формат() превратит в пустую строку, дробь в коде не нужна
ВызватьИсключение "Код должен быть целым положительным числом";
КонецЕсли;
Если Число >= Pow(10, Длина) Тогда
ВызватьИсключение СтрШаблон("Число %1 не помещается в %2 знаков",
Формат(Число, "ЧГ=0"), Формат(Длина, "ЧГ=0"));
КонецЕсли;
Возврат Формат(Число, "ЧЦ=" + Формат(Длина, "ЧГ=0") + "; ЧВН=; ЧГ=0");
КонецФункции
// Сумма в копейках для платёжных API: СуммаВКопейках(1500.5) = "150050".
Функция СуммаВКопейках(Знач Сумма) Экспорт
Возврат Формат(Окр(Сумма * 100), "ЧН=0; ЧГ=0");
КонецФункции
// Адрес постраничной выгрузки:
// АдресСтраницы("orders", 12, 1000) = "orders?page=12&limit=1000".
// Склейка "&limit=" + 1000 дала бы "&limit=1 000".
Функция АдресСтраницы(Знач Ресурс, Знач НомерСтраницы, Знач РазмерСтраницы) Экспорт
Возврат Ресурс + "?page=" + Формат(НомерСтраницы, "ЧН=0; ЧГ=0")
+ "&limit=" + Формат(РазмерСтраницы, "ЧН=0; ЧГ=0");
КонецФункции
// Убирает разделители из готового представления: "1 234 567,89" -> "1234567,89".
// Нужна, когда число пришло строкой, например из текста ячейки.
Функция БезПробелов(Знач Текст) Экспорт
Текст = СтрЗаменить(Текст, Символы.НПП, "");
Возврат СтрЗаменить(Текст, " ", "");
КонецФункции
Разбор ключевых строк:
ЧН задан везде, где строка уходит в файл или адрес, иначе ноль станет пустым полем, а адрес — «page=&limit=». В ЧислоДляФайла ноль выводится в том же виде, что и остальные числа: «0.00».ЧРД=., ЧГ=0 и ЧО=1 задают разделитель, отсутствие групп и минус слева явно — результат одинаков на любой базе. Числа внутри форматной строки и текста исключения тоже идут через Формат(): модуль клиент-серверный, а XMLСтрока() в веб-клиенте нет.КодСНулями проверяет число до форматирования: ноль без ЧН станет пустой строкой, а число длиннее ЧЦ не выведется целиком. Для кода-строки в БСП есть СтроковыеФункцииКлиентСервер.ДополнитьСтроку(Строка, Длина) — она дополняет нулями слева и не обрезает длинную строку.БезПробелов убирает Символы.НПП и обычный пробел из готового представления, например из текста ячейки.Строку обратно в число переводит Число(). Функция понимает канонический вид и вид по региональным установкам своей базы, а строку с обычными пробелами из Excel или с чужими разделителями не разберёт. Подробнее — в статье о преобразовании значения к типу Число.
В макете печатной формы формат задают у ячейки с параметром: выделите ячейку и в палитре свойств заполните «Формат», например ЧДЦ=2; ЧН='—'. В модуле остаётся передать число в Область.Параметры. В УТ 11.4 и КА 2.5 есть типовые функции модуля ФормированиеПечатныхФорм: ФорматСумм(Сумма, Валюта, ЧН, ЧРГ) — сумма с ЧДЦ=2 и валютой (в УТ 11.4 без знака), СуммаПлатежногоДокумента() — вид «1500-00» для платёжки. Для своей конфигурации — независимый вариант:
// Денежный формат для печатных форм: модуль менеджера или серверный общий модуль.
// "1 234 567,89 руб.", для нуля "0,00 руб."
Функция СуммаСВалютой(Знач Сумма, Знач Валюта = "руб.") Экспорт
// Валюту дописываем строкой: шаблон ЧФ к нулю не применяется
Возврат Формат(Сумма, "ЧДЦ=2; ЧН='0,00'") + " " + Валюта;
КонецФункции
// Сумма для платёжного поручения: "1500-50", целые рубли - "1500=".
Функция СуммаДляПлатежки(Знач Сумма) Экспорт
Если Сумма = Цел(Сумма) Тогда
Возврат Формат(Сумма, "ЧН=0; ЧГ=0") + "=";
КонецЕсли;
Возврат Формат(Сумма, "ЧДЦ=2; ЧРД='-'; ЧГ=0");
КонецФункции
// Управленческий отчёт в тысячах: 1234567.891 -> "1 234,6", ноль - прочерк.
Функция СуммаВТысячах(Знач Сумма) Экспорт
Возврат Формат(Сумма, "ЧС=3; ЧДЦ=1; ЧН='—'");
КонецФункции
// Табличный документ: в ячейке хранится число, формат отвечает только за вид.
// Товары - табличная часть или таблица значений с колонками
// Номенклатура, Количество, Сумма.
Функция ТаблицаСумм(Товары) Экспорт
ТабДок = Новый ТабличныйДокумент;
ТабДок.Область(1, 1, 1, 1).Текст = "Товар";
ТабДок.Область(1, 2, 1, 2).Текст = "Количество";
ТабДок.Область(1, 3, 1, 3).Текст = "Сумма";
НомерСтроки = 1;
Итого = 0;
Для Каждого СтрокаТоваров Из Товары Цикл
НомерСтроки = НомерСтроки + 1;
СуммаСтроки = Окр(СтрокаТоваров.Сумма, 2);
ТабДок.Область(НомерСтроки, 1, НомерСтроки, 1).Текст = Строка(СтрокаТоваров.Номенклатура);
ВывестиЧисло(ТабДок.Область(НомерСтроки, 2, НомерСтроки, 2), СтрокаТоваров.Количество, "ЧДЦ=3; ЧН='—'");
ВывестиЧисло(ТабДок.Область(НомерСтроки, 3, НомерСтроки, 3), СуммаСтроки, "ЧДЦ=2; ЧН='—'");
// Итог - по тем же округлённым суммам, что напечатаны в строках
Итого = Итого + СуммаСтроки;
КонецЦикла;
СтрокаИтога = НомерСтроки + 1;
ТабДок.Область(СтрокаИтога, 1, СтрокаИтога, 1).Текст = "Итого";
ВывестиЧисло(ТабДок.Область(СтрокаИтога, 3, СтрокаИтога, 3), Итого, "ЧДЦ=2; ЧН='0,00'");
ТабДок.Область(СтрокаИтога + 1, 1, СтрокаИтога + 1, 1).Текст = "Всего к оплате: " + СуммаСВалютой(Итого);
Возврат ТабДок;
КонецФункции
Процедура ВывестиЧисло(Область, Значение, ФорматнаяСтрока)
Область.СодержитЗначение = Истина;
Область.ТипЗначения = Новый ОписаниеТипов("Число");
Область.Значение = Значение;
Область.Формат = ФорматнаяСтрока;
Область.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Право;
КонецПроцедуры
ЧФ: по синтаксис-помощнику шаблон к нулю не применяется, и у нулевой суммы «руб.» пропало бы.ЧРД='-' — разделитель рублей и копеек в платёжном поручении; сумма в целых рублях заканчивается знаком «=», как в типовой функции с флагом ВыводитьСуммуБезКопеек.ЧС=3 делит только представление: «тыс. руб.» напишите в заголовке колонки.ВывестиЧисло кладёт в ячейку само число (СодержитЗначение, ТипЗначения, Значение), а Формат отвечает только за вид. Итог считается по тем же округлённым суммам, что напечатаны в строках.Задать формат числа можно и без кода. У реквизита в конфигураторе есть свойства «Формат» и «Формат редактирования» — их подхватывают поля форм, где реквизит выводится. Красный минус задаёт свойство «Выделять отрицательные», а не форматная строка. Если формат нужен только в одной форме, его меняют у элемента:
// Модуль формы документа: формат полей задаём при создании формы.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Колонки табличной части: Формат действует, пока ячейка не редактируется
Элементы.ТоварыСумма.Формат = "ЧДЦ=2";
Элементы.ТоварыКоличество.Формат = "ЧДЦ=3";
// Отдельное поле ввода показывает значение по формату редактирования
Элементы.СуммаДокумента.ФорматРедактирования = "ЧДЦ=2";
// Поле надписи с итогом: ноль прочерком, минус красным
Элементы.ИтогоСкидка.Формат = "ЧДЦ=2; ЧН='—'";
Элементы.ИтогоСкидка.ВыделятьОтрицательные = Истина;
КонецПроцедуры
У поля ввода два свойства. Формат, по синтаксис-помощнику, используется при отображении текста в колонке таблицы, ФорматРедактирования — при редактировании. Отдельное поле ввода показывает значение по формату редактирования, поэтому Формат на нём ничего не меняет. ЧН в числовых полях ввода не используется: ноль прочерком выводите в поле надписи.
В отчёте на СКД формат задают в конструкторе схемы: вкладка «Наборы данных», колонка «Оформление» у поля, параметр «Формат». Для одного варианта отчёта — вкладка «Настройки», «Условное оформление», тот же параметр. Программная установка через Оформление.УстановитьЗначениеПараметра("Формат", …) показана в статье о полях СКД. В языке запросов функции Формат() нет: ВЫРАЗИТЬ(Сумма КАК ЧИСЛО(15, 2)) меняет точность значения, но не его вид.
СтрШаблон(). Нужен Формат(Число, "ЧН=0; ЧГ=0") или XMLСтрока().XMLСтрока(), читайте через XMLЗначение().СтрЗаменить(Текст, " ", "") не убрал пробелы. Это неразрывный пробел, заменяйте и Символы.НПП.Формат(0) возвращает пустую строку, добавьте ЧН=0.ЧЦ без ЧДЦ: дробь не выводится, число округлено.ЧЦ целиком не выводится — проверяйте длину заранее, как в КодСНулями.ЧВН забыли ЧГ=0, и нули разбились на группы.ФорматРедактирования.Окр() и считайте итог по ним.Формат(Число, "ЧГ=0") убирает разделители групп разрядов: «1234567,891». Чтобы ноль не превратился в пустую строку, добавьте ЧН=0. Для XML и других обменов берите XMLСтрока(Число) — там и точка вместо запятой.
Задайте общую длину и включите нули: Формат(42, "ЧЦ=6; ЧВН=; ЧГ=0") вернёт «000042». Если код уже строка, подойдёт СтроковыеФункцииКлиентСервер.ДополнитьСтроку(Код, 6) из БСП.
Параметр ЧРД=.: Формат(12.5, "ЧДЦ=2; ЧРД=.; ЧГ=0") даёт «12.50». Если нужен английский вид целиком, с запятыми между группами, задайте Л=en_US.
Сдвигом разрядов: ЧС=3 делит на тысячу, ЧС=6 — на миллион. Формат(1234567.891, "ЧС=6; ЧДЦ=2") даёт «1,23». Подпись «млн руб.» вынесите в заголовок колонки.
Нет, в языке запросов нет Формат(). Получите число запросом, а вид задайте в коде, в макете или в оформлении поля СКД.
Если нужно поправить суммы в типовых печатных формах или вид чисел в выгрузке для банка, а разбираться с макетами и расширениями некогда, поручите это программисту: доработка печатных форм 1С. Разместите задание с образцом нужного вида числа — оценка бесплатная, ответ в течение рабочего дня.
Станьте частью сообщества!
Войдите или зарегистрируйтесь, и вы сможете участвовать в обсуждениях.