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

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

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

Способ 1. Математическое выделение в программном коде

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

Рассмотрим пример кода:


Цена = 123.45;
Рубли = Цел(Цена); // Результат: 123
Копейки = (Цена - Рубли) * 100; // Результат: 45

Однако при использовании этого метода программисты часто сталкиваются с проблемой точности вещественных чисел (Floating Point). Из-за особенностей хранения чисел в памяти компьютера результат вычитания может выглядеть как 0.449999999999. Чтобы избежать ошибок при печати, обязательно применяем округление:

Копейки = Окр((Цена - Цел(Цена)) * 100, 0);

Способ 2. Выделение частей в запросе или СКД

Если вы работаете в конфигурации 1С:Розница 2.2 или подобных, где печать ценников строится на базе СКД, вам может потребоваться выделить копейки прямо в тексте запроса. В языке запросов 1С долгое время не было функции ЦЕЛОЕ, поэтому разработчики используют функцию ВЫРАЗИТЬ.

Проанализируем ситуацию: функция ВЫРАЗИТЬ(Число КАК ЧИСЛО(15, 0)) работает по правилам математического округления. Это значит, что если цена 12.55, то функция вернет 13, а не 12. Чтобы получить именно целую часть («рубли»), нам нужно использовать конструкцию ВЫБОР.

Пример «гениального» (как его называют на форумах) костыля, который гарантированно работает в запросе:


ВЫБОР
    КОГДА ВЫРАЗИТЬ(Цены.Цена КАК ЧИСЛО(15, 0)) > Цены.Цена
        ТОГДА ВЫРАЗИТЬ(Цены.Цена КАК ЧИСЛО(15, 0)) - 1
    ИНАЧЕ ВЫРАЗИТЬ(Цены.Цена КАК ЧИСЛО(15, 0))
КОНЕЦ КАК ЦенаРуб

Для копеек в запросе формула будет выглядеть так:


(Цены.Цена - (ВЫБОР
    КОГДА ВЫРАЗИТЬ(Цены.Цена КАК ЧИСЛО(15, 0)) > Цены.Цена
        ТОГДА ВЫРАЗИТЬ(Цены.Цена КАК ЧИСЛО(15, 0)) - 1
    ИНАЧЕ ВЫРАЗИТЬ(Цены.Цена КАК ЧИСЛО(15, 0))
КОНЕЦ)) * 100 КАК ЦенаКоп

Важное примечание: Если ваша платформа версии 8.3.20 и выше, в языке запросов наконец-то появилась функция ЦЕЛОЕ(). В этом случае запрос становится значительно проще и чище.

Способ 3. Использование форматной строки и строковых функций

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

Разберем по шагам:

  1. Преобразуем число в формат с двумя знаками после запятой: Формат(Цена, "ЧДЦ=2; ЧГ=0").
  2. Используем функцию Прав, чтобы забрать 2 символа справа.

Пример реализации:


СтрокаЦены = Формат(123.5, "ЧДЦ=2; ЧГ=0"); // "123.50"
КопейкиТекстом = Прав(СтрокаЦены, 2); // "50"

Этот метод хорош тем, что он автоматически обрабатывает ситуацию, когда копеек меньше 10 (например, 5 копеек превратятся в «05», а не в «5»).

Способ 4. Визуальное разделение в макете

Если вы не хотите писать код вовсе, можно прибегнуть к «хитрости» верстки макета табличного документа. Выясним, как это реализовать:

  1. Создаем в макете две узкие ячейки рядом.
  2. В левую ячейку выводим полную цену. Устанавливаем в свойствах: Горизонтальное положение — «Лево», Выравнивание — «По левому краю». Ограничиваем ширину ячейки так, чтобы дробная часть просто не помещалась в видимую область.
  3. В правую ячейку также выводим цену, но применяем форматную строку ЧЦ=2; ЧДЦ=2; ЧРД=; ЧГ=0.

Однако мы рекомендуем избегать этого метода, так как при изменении шрифта или масштаба печати текст может «поехать», и покупатель увидит некорректную цену.

Правильное форматирование копеек

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

Рассмотрим идеальную форматную строку для поля копеек:

Результат = Формат(Копейки, "ЧЦ=2; ЧВН=; ЧГ=0");

Где основные параметры означают следующее:

Подводные камни при обновлении конфигураций

Как отмечали участники дискуссии, при изменении макетов СКД в типовых решениях (например, через расширения или правку метаданных), можно столкнуться с трудностями при обновлении. Если вы правите запрос в справочнике «Шаблоны ценников и этикеток», помните, что при обновлении конфигурации фирма 1С может изменить структуру таблиц. В этом случае ваш кастомный запрос с конструкцией ВЫРАЗИТЬ может перестать работать.

Поэтому, если есть возможность использовать Вычисляемые поля в СКД вместо правок основного запроса, лучше воспользоваться ими. В вычисляемых полях доступны функции встроенного языка Цел(), что делает задачу тривиальной.

Подытожим: для разовых задач проще всего использовать математическое вычитание с округлением в коде. Для массовой печати через типовые механизмы лучше всего подходит выделение копеек в запросе или через вычисляемые поля СКД с обязательным использованием форматной строки ЧВН= для сохранения ведущих нулей.

← На главную