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

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей
← На главную

При разработке внешних печатных форм (ВПФ) на базе MS Word в среде 1С:Предприятие часто возникает классическая проблема: числовые данные, такие как цена или сумма, передаются без «незначащих» нулей. Например, вместо ожидаемого значения «100,00» в документе отображается просто «100». Попытки решить это на уровне запроса обычно не приносят результата. В этой статье мы подробно разберем, почему так происходит, и рассмотрим эффективные методы решения этой задачи.

Выясним причину: почему «ВЫРАЗИТЬ» в запросе не помогает?

Рассмотрим ситуацию, с которой сталкиваются многие разработчики. В языке запросов 1С существует конструкция ВЫРАЗИТЬ(Поле КАК ЧИСЛО(15, 2)). На первый взгляд кажется, что она должна жестко зафиксировать два знака после запятой. Однако проанализируем механику работы платформы: ВЫРАЗИТЬ отвечает только за ограничение точности хранения и расчетов в базе данных. Тип данных результата остается Число.

Для платформы 1С числа 100, 100.0 и 100.00 — это одно и то же значение. При передаче данных в Word или при выводе в стандартный табличный документ система выполняет автоматическое преобразование числа в строку, отсекая нули в дробной части, если они не несут математического смысла. Таким образом, проблема кроется не в запросе, а в этапе представления данных пользователю.

Решение 1: Программная обработка результата запроса (Метод преобразования в строку)

Самый надежный способ гарантировать отображение нулей в Word — передать данные не как число, а как готовую отформатированную строку. Разберем по шагам, как это реализовать, основываясь на опыте решения подобных задач. Если мы используем типовую конфигурацию (например, УТ 11.4), то после выполнения запроса мы получаем таблицу значений или выборку, которую необходимо подготовить перед отправкой в макет.

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


// Получаем таблицу значений из результата запроса
ТаблицаРезультат = Запрос.Выполнить().Выгрузить();

// Добавляем новую колонку для строкового представления цены
ТаблицаРезультат.Колонки.Добавить("ЦенаСтрока", Новый ОписаниеТипов("Строка"));

// Проходим циклом по строкам и форматируем значения
Для Каждого СтрокаТЗ Из ТаблицаРезультат Цикл
    // Используем функцию Формат для жесткого задания 2 знаков после запятой
    // ЧДЦ=2 означает 2 знака в дробной части
    // ЧГ=0 убирает группировку разрядов (если не нужны пробелы между тысячами)
    СтрокаТЗ.ЦенаСтрока = Формат(СтрокаТЗ.Цена, "ЧДЦ=2; ЧГ=0");
КонецЦикла;

В макете Word в этом случае мы должны использовать параметр {ЦенаСтрока} вместо {Цена}. Поскольку в Word передается уже текст «100,00», сторонние приложения не будут пытаться его «интерпретировать» как число и обрезать нули.

Решение 2: Использование возможностей MS Word (Ключи форматирования поля)

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

Для этого выполните следующие действия в макете Word:

  1. Нажмите сочетание клавиш Alt + F9. Это переключит отображение имен полей на их программные коды.
  2. Найдите ваше поле, например: { MERGEFIELD Цена }.
  3. Добавьте специальный ключ числового формата в конец кода поля: \# "#,##0.00".
  4. В итоге код должен выглядеть так: { MERGEFIELD Цена \# "#,##0.00" }.
  5. Снова нажмите Alt + F9, чтобы вернуть привычный вид, и сохраните макет.

Теперь Word будет самостоятельно принудительно дописывать два нуля после запятой, даже если из 1С пришло целое число 100.

Решение 3: Применение функций БСП (Библиотеки стандартных подсистем)

Поскольку работа ведется в современной конфигурации УТ 11.4, нам доступны механизмы БСП. Это наиболее «правильный» путь с точки зрения архитектуры типовых решений. В БСП есть общие модули, предназначенные специально для форматирования сумм с учетом валюты и региональных настроек.

Рассмотрим использование функции ОбщегоНазначения.ФорматСуммы(). Этот метод удобен тем, что он автоматически подставляет разделители и нужную точность, основываясь на настройках конкретной валюты в базе данных.


// Пример заполнения структуры параметров для БСП
ПараметрыПечати = Новый Структура;
ЦенаЧислом = 150;
ВалютаДокумента = Справочники.Валюты.НайтиПоКоду("643"); // Рубли

// Форматируем сумму с помощью стандартной функции БСП
ПараметрыПечати.Вставить("Цена", ОбщегоНазначения.ФорматСуммы(ЦенаЧислом, ВалютаДокумента));

Этот подход гарантирует, что формат будет соответствовать правилам учета: например, для одних валют это может быть 2 знака, а для других — 0 или 3, и система обработает это автоматически.

Важные рекомендации при работе с типами данных

Подведем итог нашему анализу. При подготовке данных для вывода в Word важно разделять два слоя:

Помните, что передача данных через COM-соединение или механизмы БСП в Word часто выполняет неявное преобразование типов. Чтобы избежать сюрпризов с «пропавшими» знаками, всегда преобразуйте числовые значения в строку на стороне 1С непосредственно перед заполнением параметров макета.

← На главную