При разработке внешних печатных форм (ВПФ) на базе MS Word в среде 1С:Предприятие часто возникает классическая проблема: числовые данные, такие как цена или сумма, передаются без «незначащих» нулей. Например, вместо ожидаемого значения «100,00» в документе отображается просто «100». Попытки решить это на уровне запроса обычно не приносят результата. В этой статье мы подробно разберем, почему так происходит, и рассмотрим эффективные методы решения этой задачи.
Рассмотрим ситуацию, с которой сталкиваются многие разработчики. В языке запросов 1С существует конструкция ВЫРАЗИТЬ(Поле КАК ЧИСЛО(15, 2)). На первый взгляд кажется, что она должна жестко зафиксировать два знака после запятой. Однако проанализируем механику работы платформы: ВЫРАЗИТЬ отвечает только за ограничение точности хранения и расчетов в базе данных. Тип данных результата остается Число.
Для платформы 1С числа 100, 100.0 и 100.00 — это одно и то же значение. При передаче данных в Word или при выводе в стандартный табличный документ система выполняет автоматическое преобразование числа в строку, отсекая нули в дробной части, если они не несут математического смысла. Таким образом, проблема кроется не в запросе, а в этапе представления данных пользователю.
Самый надежный способ гарантировать отображение нулей в Word — передать данные не как число, а как готовую отформатированную строку. Разберем по шагам, как это реализовать, основываясь на опыте решения подобных задач. Если мы используем типовую конфигурацию (например, УТ 11.4), то после выполнения запроса мы получаем таблицу значений или выборку, которую необходимо подготовить перед отправкой в макет.
Рассмотрим пример кода, где мы создаем вспомогательную колонку со строковым типом и заполняем её отформатированными данными:
// Получаем таблицу значений из результата запроса
ТаблицаРезультат = Запрос.Выполнить().Выгрузить();
// Добавляем новую колонку для строкового представления цены
ТаблицаРезультат.Колонки.Добавить("ЦенаСтрока", Новый ОписаниеТипов("Строка"));
// Проходим циклом по строкам и форматируем значения
Для Каждого СтрокаТЗ Из ТаблицаРезультат Цикл
// Используем функцию Формат для жесткого задания 2 знаков после запятой
// ЧДЦ=2 означает 2 знака в дробной части
// ЧГ=0 убирает группировку разрядов (если не нужны пробелы между тысячами)
СтрокаТЗ.ЦенаСтрока = Формат(СтрокаТЗ.Цена, "ЧДЦ=2; ЧГ=0");
КонецЦикла;
В макете Word в этом случае мы должны использовать параметр {ЦенаСтрока} вместо {Цена}. Поскольку в Word передается уже текст «100,00», сторонние приложения не будут пытаться его «интерпретировать» как число и обрезать нули.
Проанализируем альтернативный вариант, который позволяет оставить данные в 1С числовыми, но изменить их отображение на стороне самого текстового процессора. Если ваша печатная форма использует «Поля слияния» (MergeFields), вы можете задать формат непосредственно в шаблоне документа.
Для этого выполните следующие действия в макете Word:
{ MERGEFIELD Цена }.\# "#,##0.00".{ MERGEFIELD Цена \# "#,##0.00" }.Теперь Word будет самостоятельно принудительно дописывать два нуля после запятой, даже если из 1С пришло целое число 100.
Поскольку работа ведется в современной конфигурации УТ 11.4, нам доступны механизмы БСП. Это наиболее «правильный» путь с точки зрения архитектуры типовых решений. В БСП есть общие модули, предназначенные специально для форматирования сумм с учетом валюты и региональных настроек.
Рассмотрим использование функции ОбщегоНазначения.ФорматСуммы(). Этот метод удобен тем, что он автоматически подставляет разделители и нужную точность, основываясь на настройках конкретной валюты в базе данных.
// Пример заполнения структуры параметров для БСП
ПараметрыПечати = Новый Структура;
ЦенаЧислом = 150;
ВалютаДокумента = Справочники.Валюты.НайтиПоКоду("643"); // Рубли
// Форматируем сумму с помощью стандартной функции БСП
ПараметрыПечати.Вставить("Цена", ОбщегоНазначения.ФорматСуммы(ЦенаЧислом, ВалютаДокумента));
Этот подход гарантирует, что формат будет соответствовать правилам учета: например, для одних валют это может быть 2 знака, а для других — 0 или 3, и система обработает это автоматически.
Подведем итог нашему анализу. При подготовке данных для вывода в Word важно разделять два слоя:
ВЫРАЗИТЬ для точности вычислений и оперируем типом Число. Здесь нули в конце не важны.Строку с помощью функции Формат(), если хотим гарантировать пользователю конкретный визуальный вид.Помните, что передача данных через COM-соединение или механизмы БСП в Word часто выполняет неявное преобразование типов. Чтобы избежать сюрпризов с «пропавшими» знаками, всегда преобразуйте числовые значения в строку на стороне 1С непосредственно перед заполнением параметров макета.