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

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

При разработке печатных форм в 1С 7.7 программисты часто сталкиваются с задачей эстетичного вывода денежных сумм. Стандартное требование заказчиков звучит так: если у суммы нет копеек (например, 10 000.00), нужно вывести её как 10 000. Однако если копейки есть (например, 10 000.50), их необходимо оставить в формате 10 000.50. При этом обязательным условием является наличие пробела в качестве разделителя тысяч для удобства чтения.

В этой статье мы подробно разберем, как реализовать такую логику, проанализируем структуру форматной строки и выясним, какие подводные камни могут возникнуть при работе с типами данных в «семерке».

Метод 1: Использование функции Формат с условием

Самый эффективный и распространенный способ решить задачу — это использование встроенной функции Формат совместно с тернарным оператором ?(). Суть метода заключается в предварительной проверке: является ли число целым.

Рассмотрим по шагам реализацию этого кода в ячейке таблицы или в модуле формирования печатной формы. Проанализируем следующую конструкцию:


ЦенаДляПечати = ?(Цена = Цел(Цена), Формат(Цена, "Ч.0. "), Формат(Цена, "Ч.2. "));

Разберем, как это работает:

  1. Функция Цел(Цена) отсекает дробную часть числа. Если исходная Цена равна результату функции Цел(), значит, копейки отсутствуют или равны нулю.
  2. Если условие выполняется, применяется форматная строка "Ч.0. ". Она указывает системе вывести число с 0 знаков после запятой.
  3. Если условие не выполняется (копейки есть), применяется строка "Ч.2. ", которая гарантирует вывод двух знаков дробной части.

Разбор синтаксиса форматной строки «Ч»

Важно понимать, что каждый символ в строке "Ч.2. " имеет значение. В 1С 7.7 форматная строка для чисел жестко структурирована. Если вы допустите ошибку в позиции точки или пробела, результат будет непредсказуемым.

Структура выглядит так: Ч[Длина].[Точность][РазделительДробной][РазделительТриад]

Важный нюанс: Чтобы тысячи отделялись именно пробелом, этот пробел должен стоять строго на своем месте. Посмотрите на пример: "Ч.2. ". Здесь после цифры 2 стоит точка (разделитель копеек), а за ней — пробел (разделитель тысяч). Если вы просто напишете "Ч.2.", пробела между тысячами не будет.

Метод 2: Проверка на «пустые» копейки через форматную строку

Иногда программисты пытаются использовать более сложные форматные строки, чтобы избежать условий. Однако в 1С 7.7 форматная строка не умеет самостоятельно определять, нужно ли скрывать только нулевые знаки. Поэтому условие ?(Цена = Цел(Цена)...) остается золотым стандартом.

Тем не менее, полезно знать, как вывести число со строгим соблюдением длины. Например, если вам нужно, чтобы число всегда занимало 20 символов и дополнялось нулями слева (что редко нужно для цен, но полезно для артикулов), можно использовать:


// Выведет что-то вроде 00000000000010000.50
Результат = Формат(Цена, "Ч020.2. ");

Метод 3: Использование глобальных функций конфигурации

В типовых конфигурациях (таких как «Бухгалтерский учет» или «Торговля и Склад») разработчики фирмы «1С» уже создали вспомогательные функции в Глобальном модуле. Использование этих функций делает ваш код чище и позволяет соблюдать единообразие в отчетах.

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


// Пример использования глобальной функции форматирования
ТекЦена = глФрм(Цена); 

Однако помните, что глФрм часто добавляет к числу название валюты или символ рубля. Если вам нужно чистое число без букв, лучше придерживаться Метода 1.

Типизация данных и функция Цел(): ловушка для разработчика

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

Выясним причину возможной ошибки. Если в переменную Цена попало строковое представление числа, полученное из другой функции (например, "10 000.00"), то функция Цел("10 000.00") может отработать некорректно или выдать ошибку, так как пробел внутри строки мешает преобразованию.

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


ЧисловаяЦена = Число(СтрЗаменить(Цена, " ", "")); // Убираем пробелы и приводим к числу
Если ЧисловаяЦена = Цел(ЧисловаяЦена) Тогда
    // Ваша логика форматирования
КонецЕсли;

Работа с региональными настройками Windows

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

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

Резюме: универсальный код для печатной формы

Подводя итог, приведем наиболее надежный вариант кода, который можно вставить непосредственно в ячейку таблицы (в поле «Выражение»):


// Прямо в ячейке таблицы 1С 7.7:
Формат(ПечЧисло, ?(ПечЧисло = Цел(ПечЧисло), "Ч.0. ", "Ч.2. "))

Здесь ПечЧисло — это переменная, содержащая вашу цену. Этот код обеспечит:

  1. Отсутствие «.00», если цена целая.
  2. Вывод копеек, если они есть.
  3. Разделение тысяч пробелом.
  4. Независимость от региональных настроек операционной системы.

Используя этот подход, вы сделаете свои отчеты и первичные документы (счета, накладные) профессиональными и удобными для восприятия пользователями и контрагентами.

← На главную