Как в 1С заменить точку на дефис в формате суммы и вывести копейки (например, 800-00)?

Программист 1С v7.7 Финансы и профессиональные услуги
← На главную

При выгрузке данных в текстовые файлы, формировании реестров для банков или специфических печатных форм программисты часто сталкиваются с требованием представить сумму в нестандартном виде. Самый популярный запрос — замена стандартной точки (разделителя дробной части) на дефис, при этом необходимо, чтобы даже у целых чисел всегда отображались копейки (например, вместо 800 нужно получить 800-00).

В этой статье мы подробно разберем, как решить эту задачу, используя стандартную функцию Формат(), проанализируем различия в синтаксисе между платформами 7.7 и 8.х, а также выясним, почему код может не срабатывать в определенных условиях.

Разбираем синтаксис функции Формат в 1С 7.7

В платформе 1С 7.7 функция Формат() работает по позиционному принципу. Это означает, что символы внутри форматной строки имеют строго определенное назначение в зависимости от их расположения. Для работы с числами используется префикс Ч. Рассмотрим структуру подробнее: Ч[ОбщаяДлина].[Точность][РазделительДробной][РазделительТриад].

Чтобы преобразовать число 625.25 в 625-25, нам нужно явно указать дефис в качестве разделителя дробной части. Проанализируем пример кода:


Сумма = 625.25;
Результат = Формат(Сумма, "Ч15.2-");
// Результат будет: "         625-25"

В данном примере 15 — это общая ширина поля. Если число короче, слева будут добавлены пробелы. Чтобы избавиться от лишних пробелов, мы рекомендуем использовать функцию СокрЛ() или задать нулевую ширину (хотя в 7.7 это не всегда срабатывает идеально).

Если нам нужно обеспечить вывод копеек для целых чисел (например, 800 превратить в 800-00), форматная строка остается такой же. Важно понимать, что число знаков после точки (в нашем случае 2) заставляет функцию всегда выводить дробную часть.


ЧислоДляПреобразования = 800;
СтрокаСуммы = СокрЛ(Формат(ЧислоДляПреобразования, "Ч15.2-"));
// Получим: "800-00"

Если вы хотите также разделить тысячи (триады) точкой, добавьте ее после дефиса:


БольшаяСумма = 1500000;
Результат = СокрЛ(Формат(БольшаяСумма, "Ч15.2-."));
// Получим: "1.500.000-00"

Особенности решения для платформы 1С 8.х (8.2, 8.3)

В современных версиях 1С (v8) синтаксис функции Формат() стал более гибким и читаемым благодаря использованию именованных параметров. Для замены разделителя используется параметр ЧРД (Числовой Разделитель Дробной части), а для представления нулевых копеек — ЧДЦ (Число Десятичных Цифр).

Рассмотрим, как добиться аналогичного результата в 1С 8.3:


Сумма = 800;
ФорматнаяСтрока = "ЧЦ=15; ЧДЦ=2; ЧРД=-; ЧГ=0";
Результат = Формат(Сумма, ФорматнаяСтрока);
// Получим: "800-00"

Разберем параметры подробнее:

Почему Формат() может не работать: решаем проблему типа данных

Часто программисты жалуются: «Я копирую код, но у меня все равно выводится 800 вместо 800-00». Проанализируем ситуацию. Основная причина кроется в типе исходной переменной. Функция Формат() предназначена для преобразования Числа в Строку. Если в переменную уже записана строка (например, полученная из другого текстового поля или ранее отформатированная), функция Формат() просто вернет ее без изменений, так как не поймет, где там дробная часть.

Чтобы гарантированно получить результат, мы рекомендуем всегда выполнять принудительное преобразование к числу внутри функции:


// Безопасный способ преобразования
СуммаИзДокумента = "800"; // Допустим, здесь оказалась строка
Результат = Формат(Число(СуммаИзДокумента), "Ч15.2-");

Важный нюанс для 1С 7.7: Если вы используете формат в печатной форме (в ячейке таблицы), проверьте, не задан ли формат в свойствах самой ячейки. Системные настройки формата в шаблоне могут перекрывать программный код.

Альтернативный метод: использование СтрЗаменить

Если по каким-то причинам стандартная форматная строка кажется слишком сложной или непредсказуемой (например, из-за влияния региональных настроек Windows), можно воспользоваться методом прямой замены символов. Однако этот метод требует осторожности.

Рассмотрим последовательность действий:

  1. Сначала форматируем число стандартным способом с фиксированной точкой.
  2. Затем меняем точку на дефис.

// Вариант для 1С 8.х
Сумма = 800;
ВременнаяСтрока = Формат(Сумма, "ЧГ=0; ЧДЦ=2"); // Получаем "800.00" (в зависимости от региона)
Результат = СтрЗаменить(ВременнаяСтрока, ".", "-");
Результат = СтрЗаменить(Результат, ",", "-"); // Подстраховка на случай запятой

Этот метод считается менее «красивым», но он выручает, когда нужно быстро решить задачу, не вникая в тонкости позиционного синтаксиса 7.7 или когда региональные настройки пользователя меняют разделитель на запятую непредсказуемым образом.

Выясняем причины влияния региональных настроек

Проанализируем ситуацию: 1С часто берет символы-разделители из настроек операционной системы. Если вы напишете просто Формат(Сумма, "Ч15.2") без указания символа в конце строки, программа подставит то, что выбрано в «Региональных стандартах» Windows (точку или запятую). Чтобы «перебить» эти настройки и жестко зафиксировать дефис, обязательно указывайте разделители в конце форматной строки (для 7.7) или используйте параметр ЧРД (для 8.х).

Используя приведенные выше инструкции, вы сможете гибко настраивать вывод денежных сумм для любых нужд — от формирования текстовых файлов экспорта до специфических бухгалтерских отчетов.

← На главную