Как вывести цену с копейками и нулевой дробной частью (например, 1600.00 руб.) в ценнике 1С?

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

Разработка и редактирование печатных форм ценников и этикеток — одна из самых частых задач, с которой сталкиваются программисты и администраторы систем на платформе 1С:Предприятие 8. Очень часто от пользователей или клиентов поступает вполне логичное требование: выводить цену товара строго с копейками, даже если копейки нулевые (например, 1600.00 РУБ. вместо дефолтных 1600 РУБ.). Однако при попытке настроить макет ценника стандартными средствами разработчики сталкиваются с тем, что платформа упорно отбрасывает дробную часть, если она равна нулю.

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

Выясняем причину: почему пропадают копейки в режиме «Шаблон»?

Рассмотрим стандартный механизм работы ячеек табличного документа 1С. В свойствах ячейки макета за ее наполнение отвечает свойство Заполнение, которое может принимать три значения: Текст, Параметр и Шаблон.

Когда разработчик хочет вывести в одной ячейке и саму цену, и валюту (например, написать [Цена] руб.), он устанавливает тип заполнения Шаблон. В этом режиме платформа выполняет следующие действия:

  1. Находит внутри квадратных скобок имена параметров (в нашем примере — Цена).
  2. Берет переданное числовое значение цены (например, 1600).
  3. Неявно преобразует его в текстовую строку, используя стандартные системные правила преобразования типов.
  4. Подставляет полученную строку вместо квадратных скобок и склеивает ее со статическим текстом (в результате получается «1600 руб.»).

Главная проблема заключается в том, что при неявном преобразовании числа в строку платформа 1С всегда отбрасывает незначащие нули в дробной части. Настроить формат вывода отдельного параметра внутри шаблона с помощью свойств самой ячейки интерактивно невозможно. Свойство ячейки Формат применяется только к конечному результату. А поскольку результатом сборки шаблона является обычная текстовая строка (а не число), то числовой конструктор формата к ней просто не применяется.

Давайте подробно рассмотрим, как обойти это ограничение платформы.

Решение 1. Перевод ячейки в режим «Параметр» и настройка форматной строки

Это самый простой, чистый и рекомендуемый способ, не требующий написания программного кода. Суть метода заключается в отказе от использования текстовых шаблонов внутри одной ячейки в пользу строгого использования параметров.

Выполним настройку по шагам:

  1. Откройте макет ценника (или этикетки) в режиме редактирования.
  2. Выделите ячейку, в которой должна выводиться цена, и откройте ее палитру свойств (клавиша F4).
  3. В поле Заполнение установите значение Параметр вместо значения Шаблон.
  4. В поле Текст (которое для параметра выполняет роль его имени) укажите имя параметра без квадратных скобок: Цена.
  5. Найдите свойство Формат и нажмите кнопку с многоточием для открытия конструктора форматной строки.
  6. На вкладке Число установите следующие флаги и параметры:
    • Дробная часть: укажите значение 2. Это принудительно заставит платформу выводить два знака после запятой (копейки).
    • Разделитель дробной части: если вам принципиально выводить точку вместо запятой, укажите в этом поле символ точки .. В форматной строке это запишется как ЧРД='.'. Это позволит игнорировать региональные настройки Windows на компьютерах пользователей.
  7. В результате конструктор сформирует форматную строку вида: ЧЦ=15; ЧДЦ=2; ЧРД='.' (где ЧЦ — общее число знаков, а ЧДЦ — число знаков дробной части).

Но как же быть с выводом валюты («руб.»), если мы убрали ее из ячейки? Для этого применим проверенную практику, которая используется в большинстве типовых конфигураций 1С (например, в «Управлении торговлей 11»):

  1. Разбейте исходное поле на две соседние колонки (две ячейки).
  2. В левой ячейке разместите параметр Цена с настроенным форматом, как мы описали выше. Выровняйте текст в этой ячейке по правому краю.
  3. В правой ячейке напишите обычный текст руб. или используйте параметр валюты. Выровняйте его по левому краю.
  4. Отключите видимость границы (линии) между этими двумя ячейками. На печати цена и валюта сольются в единую красивую строку без лишних пробелов и разрывов.

Решение 2. Программное форматирование данных перед выводом в макет

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

Разберем ситуацию, когда данные подготавливаются в модуле обработки печати (например, в обработке ПечатьЭтикетокИЦенников). Вместо передачи числового значения в параметр макета, мы передадим туда уже готовую строковую переменную, собранную по нашим правилам.

Проанализируем пример кода:


// Предположим, у нас есть выборка данных товаров ВыборкаСтрок
ЦенаЧислом = ВыборкаСтрок.Цена;

// Преобразуем число в строку с жестким форматом: 2 знака дробной части, разделитель - точка
ЦенаСтрокой = Формат(ЦенаЧислом, "ЧЦ=15; ЧДЦ=2; ЧРД='.'");

// Прибавляем к полученной строке обозначение валюты
ИтоговыйТекстЦены = ЦенаСтрокой + " руб.";

// Заполняем параметр в области макета
ОбластьМакета.Параметры.Цена = ИтоговыйТекстЦены;

При таком подходе в свойствах ячейки макета должно быть установлено заполнение Параметр (имя параметра — Цена). Платформа получит уже готовую текстовую строку "1600.00 руб." и выведет ее «как есть», ничего не усекая и не округляя.

Решение 3. Реализация через расширение конфигурации (для УТ 11, Розницы 2/3, УНФ)

В современных типовых конфигурациях 1С печать ценников реализована через сложные механизмы компоновки данных (СКД). Чтобы не снимать конфигурацию с поддержки и не мешать последующим обновлениям, правильнее всего внедрить доработку через расширение конфигурации.

Вся логика заполнения параметров ценников обычно находится в модуле менеджера обработки ПечатьЭтикетокИЦенников. Мы можем перехватить заполнение параметров непосредственно в момент формирования областей табличного документа.

Рассмотрим пример кода для расширения (метод «После» или «Вместо» для процедуры формирования печатных форм):


&Вместо("ПодготовитьДанныеДляПечати")
Функция ИмяРасширения_ПодготовитьДанныеДляПечати(ПараметрыПечати)
    
    // Вызываем оригинальный алгоритм заполнения данных
    РезультатЗаполнения = ПродолжитьВызов(ПараметрыПечати);
    
    // Производим постобработку сформированного табличного документа
    ТабДок = РезультатЗаполнения.ТабличныйДокумент;
    
    Для Строка = 1 По ТабДок.ВысотаТаблицы Цикл
        Для Колонка = 1 По ТабДок.ШиринаТаблицы Цикл
            Ячейка = ТабДок.Область(Строка, Колонка);
            
            // Если в ячейке находится текст шаблона, содержащий валюту, но без копеек
            Если Найти(Ячейка.Текст, " руб.") > 0 Тогда
                // Извлекаем числовое значение, форматируем его и записываем обратно
                ТекущийТекст = Ячейка.Текст;
                ЧисловойТекст = СтрЗаменить(ТекущийТекст, " руб.", "");
                
                // Пробуем преобразовать очищенный текст в число
                Попытка
                    ЧислоЦены = Число(ЧисловойТекст);
                    НовыйТекст = Формат(ЧислоЦены, "ЧЦ=15; ЧДЦ=2; ЧРД='.'") + " руб.";
                    Ячейка.Текст = НовыйТекст;
                Исключение
                    // Если в ячейке был сложный текст, оставляем без изменений
                КонецПопытки;
            КонецЕсли;
        КонецЦикла;
    КонецЦикла;
    
    Возврат РезультатЗаполнения;
КонецФункции

Этот способ гарантирует, что даже если пользователи создадут собственный макет с типом заполнения «Шаблон», система автоматически переформатирует вывод цен перед отправкой документа на принтер.

Резюме

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

← На главную