Разработка и Конфигурация · 9 мин
Как в 1С получить целое от деления
Как получить целую часть от деления в 1С: функция Цел(), округление Окр(), целочисленное деление в запросах и типовые ошибки при работе с числами.
При разработке и доработке конфигураций 1С регулярно возникает задача: разделить одно число на другое и взять только целую часть результата, отбросив дробную. Типовые сценарии — расчёт количества полных упаковок товара, числа полных месяцев между датами, разбиение суммы на равные части, формирование номеров страниц при печати.
Во встроенном языке 1С нет отдельного оператора целочисленного деления, как в некоторых других языках (например, div в Pascal или // в Python). Обычный оператор деления «/» всегда возвращает дробный результат. Поэтому целая часть получается комбинацией деления и функции отбрасывания дробной части — либо через округление, если нужна другая логика.
Ниже разобраны все рабочие способы: функция Цел(), округление Окр(), целая часть в запросах, а также частые ошибки, из-за которых расчёты дают неверный результат.
Функция Цел() — основной способ получить целую часть
Функция Цел() возвращает целую часть числа, просто отбрасывая дробную. Она не округляет: Цел(9,9) вернёт 9, а не 10. Именно это поведение обычно требуется при делении, когда нужно узнать, сколько раз делитель «помещается» в делимое полностью.
Типовой пример в модуле:
КоличествоУпаковок = Цел(КоличествоТовара / КоличествоВУпаковке);
// 100 / 12 = 8,333... → результат 8
Обратите внимание на поведение с отрицательными числами: Цел(-8,7) вернёт -8, то есть функция отбрасывает дробную часть в сторону нуля, а не в сторону минус бесконечности. Если в расчётах возможны отрицательные значения (сторно, корректировки), проверяйте этот сценарий отдельно.
Результат = Цел(Делимое / Делитель); // целая часть от деленияКак получить остаток от деления вместе с целой частью
Часто вместе с целой частью нужен и остаток: например, 100 штук по 12 в упаковке — это 8 полных упаковок и 4 штуки остатка. Для остатка во встроенном языке используется оператор % (процент) — он возвращает остаток от деления.
ПолныхУпаковок = Цел(100 / 12); // 8
ОстатокШтук = 100 % 12; // 4
Оператор % работает и с дробными числами, но в практических учётных задачах его почти всегда применяют к целым. Пара «Цел() + %» полностью закрывает задачу целочисленного деления: и частное, и остаток.
Округление вместо отбрасывания: функция Окр()
Если нужно не отбросить дробную часть, а округлить результат деления по математическим правилам, используйте Окр(). Первый параметр — число, второй — разрядность (0 — до целых), третий необязательный параметр задаёт режим округления.
Окр(100 / 12, 0); // 8,333 → 8
Окр(100 / 16, 0); // 6,25 → 6
Окр(100 / 3, 0); // 33,33 → 33
Различие принципиально: Цел(9,9) = 9, а Окр(9,9, 0) = 10. Выбор зависит от бизнес-логики. Для «сколько полных упаковок» — только Цел(). Для «сколько упаковок заказать, чтобы хватило» нужен подъём вверх, и тогда применяют проверку остатка:
КоличествоУпаковок = Цел(Количество / ВУпаковке);
Если Количество % ВУпаковке > 0 Тогда
КоличествоУпаковок = КоличествоУпаковок + 1;
КонецЕсли;
Сравнение вариантов
Отбрасывает дробную часть. Подходит для подсчёта полных единиц: упаковок, месяцев, страниц.
Округляет по математическим правилам. Подходит, когда результат должен быть ближайшим целым.
Округление вверх. Подходит, когда неполную единицу нужно считать как полную (заказ тары, рейсы транспорта).
Целая часть от деления в запросах 1С
В языке запросов 1С доступна функция ЦЕЛ(), которая работает аналогично одноимённой функции встроенного языка — возвращает целую часть числа. Это удобно, когда расчёт нужно выполнить сразу в выборке, не обходя результат в цикле.
ВЫБРАТЬ
ЦЕЛ(Партии.Количество / &ВУпаковке) КАК ПолныхУпаковок
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки КАК Партии
Остаток от деления в запросе получить напрямую нельзя — оператора % в языке запросов нет. Обходной путь: вычислить целую часть, умножить на делитель и вычесть из исходного числа:
Партии.Количество - ЦЕЛ(Партии.Количество / &ВУпаковке) * &ВУпаковке КАК Остаток
Учитывайте, что вычисления в запросе выполняются с типами данных полей. Если оба операнда — целые числа с ограниченной разрядностью, промежуточный результат деления всё равно будет дробным, но точность зависит от настроек типа. При сомнениях приведите результат явно через ВЫРАЗИТЬ(... КАК ЧИСЛО(15, 3)).
Типичные ошибки при целочисленном делении
Самая частая ошибка — ожидание, что деление целых чисел само даст целый результат. В 1С оператор «/» всегда возвращает дробное число: 10 / 4 даст 2,5, а не 2. Если дальше результат сравнивается с целым или используется как счётчик, логика ломается.
Вторая группа ошибок связана с делением на ноль. Если делитель берётся из реквизита документа или результата запроса, он может оказаться нулём или NULL. Перед делением добавляйте проверку:
Если Делитель = 0 Тогда
Результат = 0;
Иначе
Результат = Цел(Делимое / Делитель);
КонецЕсли;
Третья ошибка — применение Цел() к каждому слагаемому вместо применения к итогу. Цел(а) + Цел(б) не равно Цел(а + б). Например, при распределении суммы по строкам округлять нужно либо итог, либо использовать алгоритм распределения с учётом накопленной погрешности, как это сделано в типовых механизмах распределения.
Проверка результата и отладка
Быстрый способ проверить формулу без изменения конфигурации — внешняя обработка или консоль кода (в тонком клиенте доступна через «Функции для технического специалиста» при соответствующих правах). Выполните выражение на тестовых значениях и сравните с ожидаемым.
Проверяйте граничные случаи: делимое меньше делителя (результат 0), точное деление без остатка, делитель равен единице, отрицательные числа, очень большие числа. Именно на границах проявляются ошибки округления.
Как проверить результат
Результат 8, дробная часть отброшена
Результат 8,33 или 9 — функция не применена или использовано округление
Результат 8, остаток 0
Результат 7 — лишнее вычитание или ошибка в формуле
Ветка обработки нулевого делителя, расчёт не падает
Ошибка «Деление на ноль» при выполнении
Результат 4
Результат 8 — перепутан остаток с целой частью
Где применять, а где лучше обратиться к разработчику
Самостоятельно и безопасно целочисленное деление применяется в собственных внешних обработках, отчётах на СКД, дополнительных печатных формах и в пользовательских выражениях. Риск минимален: даже ошибочная формула в отчёте не портит данные базы.
Изменение типовых модулей проведения документов, расчёта зарплаты или налогов — зона ответственности разработчика. Там целочисленная логика связана с копеечными округлениями, и неверное изменение приведёт к расхождениям в учёте, которые долго и дорого исправлять.
Что важно запомнить
Целое от деления в 1С получают через Цел(Делимое / Делитель): оператор «/» всегда даёт дробь, а Цел() отбрасывает дробную часть. Остаток считается оператором %. Для округления используйте Окр(), для округления вверх — Цел() с проверкой остатка. В запросах работает функция ЦЕЛ(). Всегда проверяйте делитель на ноль и тестируйте граничные значения.
Частые вопросы
Чем Цел() отличается от Окр() в 1С?
Цел() просто отбрасывает дробную часть: Цел(9,9) = 9. Окр() округляет по математическим правилам: Окр(9,9, 0) = 10. Для подсчёта полных единиц (упаковок, месяцев) нужен Цел(), для ближайшего целого — Окр().
Как округлить результат деления вверх до целого?
Отдельной функции округления вверх во встроенном языке нет. Используйте Цел(а / б) и добавьте единицу, если остаток от деления (а % б) больше нуля. Это стандартный приём для расчёта необходимого количества тары или рейсов.
Есть ли в 1С оператор целочисленного деления, как div?
Нет, отдельного оператора нет. Оператор «/» всегда возвращает дробный результат. Целочисленное деление реализуется парой Цел(а / б) для частного и а % б для остатка.
Как получить целую часть от деления в запросе 1С?
Используйте функцию ЦЕЛ(): ЦЕЛ(Поле.Количество / &Делитель). Остаток напрямую в запросе не вычисляется — его получают вычитанием произведения целой части на делитель из исходного значения.
Что вернёт Цел() для отрицательного числа?
Функция отбрасывает дробную часть в сторону нуля: Цел(-8,7) вернёт -8. Если логика требует округления в меньшую сторону (до -9), такое поведение нужно учитывать и обрабатывать отдельно.
Почему 10 / 4 в 1С даёт 2,5, а не 2?
Потому что оператор «/» выполняет обычное деление с дробным результатом независимо от типа операндов. Чтобы получить 2, примените Цел(10 / 4). Это ожидаемое поведение платформы, а не ошибка.