Как убрать копейки у суммы документа в 1С

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

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

Опасность визуального скрытия копеек: ловушка формата

Часто начинающие программисты или продвинутые пользователи пытаются решить задачу «малой кровью», изменяя лишь отображение чисел на форме или в макете. Для этого они используют свойства формата поля ввода или колонки таблицы значений, например, устанавливая точность ЧДЦ=0 (число десятичных знаков равное нулю).

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

Рассмотрим конкретный пример. Представим, что в табличной части нашего документа содержится 10 строк. В каждой строке сумма составляет 100 рублей и 40 копеек. Если мы настроим визуальный формат отображения без копеек (ЧДЦ=0), платформа округлит значения при выводе на экран по математическим правилам:

  1. Строка 1: отображается как 100 руб. (в базе хранится 100.40)
  2. Строка 2: отображается как 100 руб. (в базе хранится 100.40)
  3. ...
  4. Строка 10: отображается как 100 руб. (в базе хранится 100.40)

Теперь посмотрим на строку «Итого». Платформа складывает реальные значения из базы данных: 100.40 * 10 = 1004.00 рублей. На экран выводится итоговое значение — 1004 рубля. Пользователь видит перед собой таблицу, где в десяти строках написано по 100 рублей, но итоговая сумма почему-то равна 1004 рублям. Это гарантированно вызовет недоумение у пользователей, приведет к лишним вопросам и ошибкам при ручной проверке документов.

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

Программное округление с помощью функции Окр()

Для физического изменения сумм в кодовой базе 1С используется стандартная встроенная функция Окр(). В платформе 1С:Предприятие 8 она обладает мощным и гибким функционалом, который позволяет решать самые разные задачи округления.

Синтаксис функции выглядит следующим образом:

Окр(<Число>, <Разрядность>, <РежимОкругления>)

Рассмотрим подробнее параметры этой функции:

Давайте посмотрим на практические примеры использования функции Окр() в коде:


// Обычное округление до целого рубля (без копеек)
СуммаБезКопеек = Окр(125.45, 0); // Результат: 125
СуммаСПоловиной = Окр(125.50, 0, РежимОкругления.Округление15как20); // Результат: 126

// Округление до десятков рублей (используем отрицательную разрядность)
СуммаДоДесятков = Окр(1254.45, -1); // Результат: 1250

// Округление до сотен рублей
СуммаДоСотен = Окр(1254.45, -2); // Результат: 1300

Реализация нестандартного округления (например, до 50 копеек)

Иногда бизнес-логика требует округлять цены или суммы с определенным шагом или масштабом — например, до ближайших 50 копеек (0.5 рубля) или до 5 рублей. В стандартных параметрах функции Окр() нет прямой возможности указать дробный шаг округления, но мы можем легко реализовать это математически.

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

Посмотрим на пример кода, реализующий этот алгоритм:


// Округление суммы до ближайших 50 копеек (шаг 0.5)
МасштабОкругления = 0.5;
ИсходнаяСумма = 125.33;

РезультатОкругления = Окр(ИсходнаяСумма / МасштабОкругления, 0) * МасштабОкругления;
// РезультатОкругления будет равен 125.50

// Округление суммы до ближайших 5 рублей (шаг 5)
МасштабОкругления5 = 5;
ИсходнаяСумма2 = 123.00;

РезультатОкругления5 = Окр(ИсходнаяСумма2 / МасштабОкругления5, 0) * МасштабОкругления5;
// РезультатОкругления5 будет равен 125.00

Округление без программирования в типовых конфигурациях

Если вы работаете в современных типовых решениях 1С (таких как «1С:Управление торговлей», «1С:ERP», «1С:Комплексная автоматизация» или «1С:Управление нашей фирмой»), то прибегать к программированию для удаления копеек зачастую не требуется. Разработчики фирмы «1С» уже заложили мощный функционал округления в саму бизнес-логику прикладных решений.

Рассмотрим два основных механизма настройки округления без изменения кода:

  1. Округление через типы цен: Это наиболее правильный и системный способ избавления от копеек в торговых операциях. В настройках каждого типа цен (справочник «Виды цен» или «Типы цен номенклатуры») можно задать индивидуальные правила округления. Вы можете указать точность округления (например, до 1 рубля, до 10 рублей или даже до 100 рублей) и выбрать психологическое правило (всегда в пользу клиента, по арифметическим правилам или всегда в пользу предприятия). В этом случае копейки отсекаются еще на этапе назначения цен, и в документы продажи они просто не попадают.
  2. Округление как автоматическая скидка: В решениях «1С:Розница» и «1С:Управление нашей фирмой» часто используется округление итоговой суммы чека или накладной. Это реализовано через механизм автоматических скидок. Система рассчитывает сумму копеек в чеке и распределяет эту разницу в качестве скидки по строкам табличной части. Таким образом, покупатель платит ровную сумму без копеек, а математический баланс документа и учет НДС остаются абсолютно корректными.

Правильное округление и учет НДС

Если вы все же решили написать собственный код для округления сумм в документах, обязательно учитывайте требования законодательства по расчету НДС. Простое «срезание» копеек с итоговой суммы документа (например, принудительное переопределение Объект.СуммаДокумента = Окр(Объект.СуммаДокумента, 0) перед записью) — это прямой путь к проверкам и штрафам со стороны налоговых органов.

Величина НДС должна строго соответствовать установленной ставке от налогооблагаемой базы. Если вы округлите только итоговую сумму, у вас нарушится базовое равенство:

Сумма без НДС + НДС = Сумма документа

Давайте разберем правильный алгоритм программного округления табличной части документа с НДС:


// Правильный пересчет табличной части с округлением до целых рублей
Для Каждого СтрокаТЧ Из Объект.Товары Цикл
    
    // 1. Округляем цену товара до целых рублей
    СтрокаТЧ.Цена = Окр(СтрокаТЧ.Цена, 0, РежимОкругления.Округление15как20);
    
    // 2. Рассчитываем и округляем сумму строки
    СтрокаТЧ.Сумма = Окр(СтрокаТЧ.Цена * СтрокаТЧ.Количество, 0, РежимОкругления.Округление15как20);
    
    // 3. Вычисляем НДС от округленной суммы строки и округляем его до копеек (по закону НДС считается с точностью до копеек!)
    // Допустим, ставка НДС составляет 20%
    СтавкаНДСПроцент = 20;
    СтрокаТЧ.СуммаНДС = Окр((СтрокаТЧ.Сумма * СтавкаНДСПроцент) / (100 + СтавкаНДСПроцент), 2, РежимОкругления.Округление15как20);
    
КонецЦикла;

// 4. Пересчитываем общие итоги документа на основе округленных строк
Объект.СуммаДокумента = Объект.Товары.Итог("Сумма");

Проблема «зависания копеек» при списании запасов

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

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


// Проверяем, списываем ли мы последнюю единицу товара со склада
Если КоличествоКВыбытию = ОстатокКоличестваНаСкладе Тогда
    // Если списывается все подчистую, то стоимость списания принудительно 
    // приравниваем к стоимостному остатку на складе, не рассчитывая ее по формуле
    СтоимостьСписания = ОстатокСтоимостиНаСкладе;
Иначе
    // Если списывается только часть, рассчитываем стоимость по средней себестоимости с округлением
    СебестоимостьЕдиницы = ОстатокСтоимостиНаСкладе / ОстатокКоличестваНаСкладе;
    СтоимостьСписания = Окр(КоличествоКВыбытию * СебестоимостьЕдиницы, 2, РежимОкругления.Округление15как20);
КонецЕсли;

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

← На главную