В процессе разработки печатных форм в среде 1С:Предприятие 7.7 программисты часто сталкиваются с досадной ситуацией: в экранной форме или в самой переменной число отображается корректно (с копейками), а при выводе на печать дробная часть внезапно исчезает или обнуляется. Особенно часто это происходит, когда бухгалтерия требует добавить разделители триад (пробелы между тысячами) для удобства чтения больших сумм.
В этой статье мы подробно разберем, почему возникает эта ошибка, проанализируем поведение функции Формат и выясним, как правильно выводить денежные показатели, чтобы копейки всегда оставались на своем месте.
Рассмотрим типичную ситуацию. У нас есть переменная, например, МояПеременная, в которой хранится число 12345.67. Если мы просто выведем её в ячейку таблицы, копейки будут видны. Однако, как только мы пытаемся применить форматирование для красоты (добавить пробелы в тысячах и ограничить длину), копейки пропадают. Типичный код, который приводит к ошибке:
МояПеременная = 12345.67;
ТекстДляПечати = Формат(МояПеременная, "Ч15.2");
// В итоге вместо "12 345.67" мы можем получить "12" или "12 345"
Давайте разберемся по шагам, что именно происходит внутри системы.
Проанализируем наиболее частую причину ошибки, выявленную в обсуждении. Проблема часто кроется не в самой функции Формат, а в том, что именно в неё передается. Функция Формат в 1С 7.7 предназначена для работы с числовым типом данных. Если в какой-то момент в коде значение переменной уже было преобразовано в строку (например, другим вызовом функции или сложением со строкой), а затем мы пытаемся отформатировать эту строку еще раз — копейки теряются.
Система пытается выполнить неявное преобразование строки обратно в число. Но в 1С 7.7 этот механизм работает специфически: чтение числа из строки прекращается на первом же символе, который не является цифрой. Если в строке уже есть пробел (разделитель тысяч), функция увидит цифры только до этого пробела.
Посмотрим на пример:
СуммаСтр = Формат(12345.67, "Ч15.2 "); — получаем строку "12 345.67".ИтоговыйТекст = Формат(СуммаСтр, "Ч15.2 "); — система берет строку "12 345.67", видит пробел после "12", превращает строку в число 12 и форматирует уже его.В результате мы получаем "12.00" вместо ожидаемой суммы. Именно об этом сигнализирует решение проблемы: копейки терялись при повторном форматировании уже отформатированного значения.
Синтаксис форматной строки в 1С 7.7 требует строгого соблюдения правил. Разберем основные параметры конструкции Ч15.2:
"Ч15.2 "), система включит разделитель триад (группировку по тысячам).Если программист ошибается в написании, например, использует запятую вместо точки внутри форматной строки или забывает символ Ч, результат может быть непредсказуемым.
Проанализировав ситуацию, мы можем предложить несколько надежных способов решения проблемы.
Чтобы избежать "ловушки двойного форматирования", всегда используйте функцию Число() перед вызовом форматирования. Это гарантирует, что даже если в переменную попала строка, она будет корректно преобразована в число (насколько это возможно для 1С 7.7) перед наложением формата.
// Безопасный способ вывода
ПечСумма = Формат(Число(МояПеременная), "Ч15.2 ");
В большинстве типовых конфигураций (Бухгалтерия 7.7, Торговля и Склад) уже написаны специальные функции для вывода денежных сумм. Рекомендуется использовать именно их, так как они учитывают все нюансы платформы и настройки валют.
Попробуйте использовать функцию глФрм():
// В ячейке таблицы или в коде пишем:
ПечСумма = глФрм(МояПеременная);
Функция глФрм() обычно находится в Глобальном модуле и умеет правильно обрабатывать и нулевые значения, и копейки, и разделители, опираясь на системные настройки.
Выясним причину ошибки с помощью отладки. Если вы сомневаетесь, что именно хранится в переменной перед выводом, используйте функцию ТипЗначенияСтр(). Если она возвращает "Строка", значит, где-то в коде происходит предварительное преобразование, которое и "портит" данные для функции Формат.
Если ТипЗначенияСтр(МояПеременная) = "Строка" Тогда
Сообщить("Внимание: переменная уже является строкой!");
КонецЕсли;
Не стоит забывать, что 1С 7.7 крайне чувствительна к настройкам операционной системы. Если в Windows в качестве разделителя дробной части установлена "запятая", а в строке, которую вы пытаетесь форматировать, стоит "точка", функция Число() или Формат() может не распознать дробную часть. Всегда следите за тем, чтобы региональные стандарты на сервере и рабочих станциях были идентичны, либо обрабатывайте разделители программно, заменяя запятые на точки перед математическими операциями.
Для корректного отображения копеек в 1С 7.7 придерживайтесь следующих правил:
Число() внутри функции Формат() для защиты от неверных типов данных."Ч15.2 " (с пробелом в конце).глФрм, предусмотренные разработчиками вашей конфигурации.Следуя этим простым шагам, мы обеспечим точность финансовых отчетов и избавим бухгалтерию от необходимости вручную пересчитывать потерянные копейки.