При разработке печатных форм в 1С 7.7 программисты часто сталкиваются с задачей эстетичного вывода денежных сумм. Стандартное требование заказчиков звучит так: если у суммы нет копеек (например, 10 000.00), нужно вывести её как 10 000. Однако если копейки есть (например, 10 000.50), их необходимо оставить в формате 10 000.50. При этом обязательным условием является наличие пробела в качестве разделителя тысяч для удобства чтения.
В этой статье мы подробно разберем, как реализовать такую логику, проанализируем структуру форматной строки и выясним, какие подводные камни могут возникнуть при работе с типами данных в «семерке».
Самый эффективный и распространенный способ решить задачу — это использование встроенной функции Формат совместно с тернарным оператором ?(). Суть метода заключается в предварительной проверке: является ли число целым.
Рассмотрим по шагам реализацию этого кода в ячейке таблицы или в модуле формирования печатной формы. Проанализируем следующую конструкцию:
ЦенаДляПечати = ?(Цена = Цел(Цена), Формат(Цена, "Ч.0. "), Формат(Цена, "Ч.2. "));
Разберем, как это работает:
Цел(Цена) отсекает дробную часть числа. Если исходная Цена равна результату функции Цел(), значит, копейки отсутствуют или равны нулю."Ч.0. ". Она указывает системе вывести число с 0 знаков после запятой."Ч.2. ", которая гарантирует вывод двух знаков дробной части.Важно понимать, что каждый символ в строке "Ч.2. " имеет значение. В 1С 7.7 форматная строка для чисел жестко структурирована. Если вы допустите ошибку в позиции точки или пробела, результат будет непредсказуемым.
Структура выглядит так: Ч[Длина].[Точность][РазделительДробной][РазделительТриад]
0 или 2.Важный нюанс: Чтобы тысячи отделялись именно пробелом, этот пробел должен стоять строго на своем месте. Посмотрите на пример: "Ч.2. ". Здесь после цифры 2 стоит точка (разделитель копеек), а за ней — пробел (разделитель тысяч). Если вы просто напишете "Ч.2.", пробела между тысячами не будет.
Иногда программисты пытаются использовать более сложные форматные строки, чтобы избежать условий. Однако в 1С 7.7 форматная строка не умеет самостоятельно определять, нужно ли скрывать только нулевые знаки. Поэтому условие ?(Цена = Цел(Цена)...) остается золотым стандартом.
Тем не менее, полезно знать, как вывести число со строгим соблюдением длины. Например, если вам нужно, чтобы число всегда занимало 20 символов и дополнялось нулями слева (что редко нужно для цен, но полезно для артикулов), можно использовать:
// Выведет что-то вроде 00000000000010000.50
Результат = Формат(Цена, "Ч020.2. ");
В типовых конфигурациях (таких как «Бухгалтерский учет» или «Торговля и Склад») разработчики фирмы «1С» уже создали вспомогательные функции в Глобальном модуле. Использование этих функций делает ваш код чище и позволяет соблюдать единообразие в отчетах.
Проанализируем функцию глФрм(), которая часто встречается в конфигурациях 1С 7.7. Она автоматически учитывает настройки валюты и правила округления. Вместо написания сложных условий, можно вызвать:
// Пример использования глобальной функции форматирования
ТекЦена = глФрм(Цена);
Однако помните, что глФрм часто добавляет к числу название валюты или символ рубля. Если вам нужно чистое число без букв, лучше придерживаться Метода 1.
Особое внимание следует уделить совету из профессионального сообщества: будьте осторожны с переменными, в которых может лежать не число, а строка. В 1С 7.7 переменная может динамически менять тип.
Выясним причину возможной ошибки. Если в переменную Цена попало строковое представление числа, полученное из другой функции (например, "10 000.00"), то функция Цел("10 000.00") может отработать некорректно или выдать ошибку, так как пробел внутри строки мешает преобразованию.
Чтобы обезопасить свой код, рекомендуется принудительно преобразовывать значение к числу перед сравнением:
ЧисловаяЦена = Число(СтрЗаменить(Цена, " ", "")); // Убираем пробелы и приводим к числу
Если ЧисловаяЦена = Цел(ЧисловаяЦена) Тогда
// Ваша логика форматирования
КонецЕсли;
Рассмотрим ситуацию, когда форматная строка не содержит явных разделителей, например: Формат(Цена, "Ч15.2"). В этом случае 1С 7.7 будет использовать настройки из панели управления Windows (региональные стандарты).
Это опасно тем, что на сервере разделителем может быть точка, а на рабочей станции пользователя — запятая. В результате печатные формы будут выглядеть по-разному. Всегда указывайте разделители явно внутри форматной строки (как в примерах выше), чтобы гарантировать одинаковый результат на всех компьютерах.
Подводя итог, приведем наиболее надежный вариант кода, который можно вставить непосредственно в ячейку таблицы (в поле «Выражение»):
// Прямо в ячейке таблицы 1С 7.7:
Формат(ПечЧисло, ?(ПечЧисло = Цел(ПечЧисло), "Ч.0. ", "Ч.2. "))
Здесь ПечЧисло — это переменная, содержащая вашу цену. Этот код обеспечит:
Используя этот подход, вы сделаете свои отчеты и первичные документы (счета, накладные) профессиональными и удобными для восприятия пользователями и контрагентами.