К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как получить целое число в 1С

Как получить целое число в 1С: функции Цел(), Окр(), ОкрЦел, округление в запросах и на форме. Примеры кода, ошибки и проверка результата.

Получить целое число в 1С чаще всего требуется при расчётах количества упаковок, целых дней, целой части суммы или при приведении результата деления к целому типу. Во встроенном языке 1С для этого есть несколько инструментов, и они ведут себя по-разному: одни отбрасывают дробную часть, другие округляют по математическим правилам.

Главная ошибка новичков — путать отсечение дробной части и округление. Цел(7.9) вернёт 7, а Окр(7.9) вернёт 8. Если в расчёте количества коробок использовать не ту функцию, итог будет занижен или завышен, а ошибка всплывёт только при сверке остатков.

Ниже разобраны все основные способы: функции встроенного языка, округление в запросах, приведение типов, а также типичные сценарии — деление нацело, целая часть суммы, округление вверх и вниз.

Функция Цел(): отсечение дробной части

Функция Цел() возвращает целую часть числа, просто отбрасывая всё, что после запятой. Округления не происходит: и Цел(5.1), и Цел(5.9) дадут 5.

Результат = Цел(123.75); // 123

Результат = Цел(-7.8); // -7

Обратите внимание на поведение с отрицательными числами: Цел(-7.8) возвращает -7, то есть отсечение идёт в сторону нуля, а не в сторону минус бесконечности. Если нужен «пол» числа (всегда вниз), для отрицательных значений потребуется дополнительная проверка.

Типичный сценарий — выделение целой части суммы: рублей из суммы с копейками, целых дней из дробного количества, целых упаковок при делении объёма на ёмкость тары.

Функция Окр(): математическое округление

Функция Окр() округляет число по арифметическим правилам. Первый параметр — число, второй — разрядность: 0 означает округление до целых.

Результат = Окр(123.49, 0); // 123

Результат = Окр(123.50, 0); // 124

Результат = Окр(123.75, 0); // 124

Если второй параметр не указан, по умолчанию используется округление до целых, то есть Окр(Число) эквивалентно Окр(Число, 0). Тем не менее явное указание разрядности делает код читаемее и защищает от неоднозначной трактовки при ревью.

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

Сравнение вариантов

Цел(Число)

Отбрасывает дробную часть без округления. Подходит для выделения целых единиц: рублей, дней, полных упаковок.

Окр(Число, 0)

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

Цел(Число) + 1 или проверка остатка

Округление вверх. Нужно при расчёте количества тары, рейсов, страниц — когда неполная единица всё равно требует ресурса.

ВЫРАЗИТЬ КАК ЧИСЛО(15, 0) в запросе

Округление на стороне СУБД при выборке. Подходит, когда результат нужен сразу в целом виде без постобработки.

Как округлить вверх или вниз принудительно

Во встроенном языке 1С нет отдельных функций «округлить вверх» и «округлить вниз», поэтому их реализуют комбинацией Цел() и проверки дробной части.

Округление вверх (потолок)

Классическая задача — расчёт количества коробок: если товара 10.2 коробки, нужно 11. Реализация:

Функция ОкруглитьВверх(Число)

ЦелаяЧасть = Цел(Число);

Если Число > ЦелаяЧасть Тогда

Возврат ЦелаяЧасть + 1;

Иначе

Возврат ЦелаяЧасть;

КонецЕсли;

КонецФункции

Округление вниз (пол)

Для положительных чисел Цел() уже работает как округление вниз. Для универсального варианта с отрицательными значениями:

Функция ОкруглитьВниз(Число)

ЦелаяЧасть = Цел(Число);

Если Число < ЦелаяЧасть Тогда

Возврат ЦелаяЧасть - 1;

Иначе

Возврат ЦелаяЧасть;

КонецЕсли;

КонецФункции

Целочисленное деление и остаток от деления

Часто «получить целое» означает разделить нацело: сколько полных упаковок в количестве, сколько целых часов в минутах. Для этого используют Цел() поверх деления, а остаток получают оператором %.

ВсегоМинут = 200;

Часов = Цел(ВсегоМинут / 60); // 3

Минут = ВсегоМинут % 60; // 20

Оператор % возвращает остаток от деления и сам по себе тоже способ получить целое: остаток всегда целый, если делимое и делитель целые. Пара деления и остатка покрывает большинство задач разложения на целые единицы.

При делении следите за типом делителя: деление на ноль вызовет ошибку времени выполнения. Перед вычислением убедитесь, что знаменатель не равен нулю, особенно если он берётся из реквизита документа, где поле могли не заполнить.

Порядок действий при расчёте целого количества
  1. 1
    Определите правило: отсечение, математическое округление, вверх или вниз
  2. 2
    Выберите функцию: Цел(), Окр(Число, 0) или комбинацию с проверкой дробной части
  3. 3
    Проверьте делитель на ноль перед делением
  4. 4
    Протестируйте на граничных значениях: 5.0, 5.5, 5.999, отрицательное число
  5. 5
    Убедитесь, что результат корректно записывается в реквизит с нужной разрядностью

Получение целого числа в запросе

В языке запросов 1С функции Цел() и Окр() недоступны напрямую. Стандартный способ привести число к целому — оператор ВЫРАЗИТЬ с указанием типа ЧИСЛО с нулевой точностью:

ВЫБРАТЬ

ВЫРАЗИТЬ(Сумма / Курс КАК ЧИСЛО(15, 0)) КАК ЦелоеЗначение

ИЗ

Документ.Реализация КАК Реализация

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

Альтернатива — выбрать исходное дробное значение и обработать его в коде после выполнения запроса. Такой подход прозрачнее: все правила округления сосредоточены в одном месте модуля, а не размазаны между запросом и кодом.

Приведение строки к целому числу

Иногда целое число нужно получить из строки — например, при загрузке данных из файла или обмене. Встроенное преобразование Число(Строка) вернёт число, но строка вида «12.7» даст дробное значение, а нечисловая строка — 0 без ошибки.

Значение = Число("123");      // 123, число

Значение = Число("12.7"); // 12.7 — дробное

Значение = Число("abc"); // 0 — ошибка замаскирована

Для надёжной загрузки используйте ОписаниеТипов с квалификатором числа без дробной части и метод ПривестиЗначение() — он выполнит приведение и округление по правилам типа. Дополнительно полезно проверять входную строку на пустое значение и недопустимые символы, чтобы отличать «ноль как данные» от «ноль как ошибка парсинга».

Типичные ошибки и как их проверить

Первая распространённая ошибка — использование Окр() там, где нужно отсечение. Пример: расчёт целых отгруженных дней. Окр(2.6) даст 3, хотя фактически отгружено только 2 полных дня. Вторая ошибка — применение Цел() к результату, который потом снова округляется при записи в реквизит с разрядностью 0, что даёт двойную обработку.

Третья группа ошибок связана с реквизитами: если реквизит объявлен как Число(10, 0), платформа сама округлит записываемое значение. Разработчик может не заметить, что дробная часть теряется на уровне метаданных, и искать причину расхождений в коде.

Типичные ошибки
01
Использование Окр() вместо Цел() — значение округляется вверх и завышает количество целых единиц
02
Двойное округление: в запросе через ВЫРАЗИТЬ и повторно в коде — итог расходится на единицу
03
Игнорирование отрицательных чисел: Цел(-7.8) = -7, а не -8, что ломает расчёты сторно
04
Деление без проверки нуля — ошибка времени выполнения на незаполненных реквизитах
05
Округление промежуточных результатов в цепочке расчётов — накопление погрешности в копейках

Проверка результата проста: прогоните функцию на контрольном наборе — 5.0, 5.4, 5.5, 5.9, 0, -5.5 — и сверьте с ожидаемым правилом. Если правило «вверх», то 5.0 должно остаться 5, а 5.1 стать 6; если правило «отсечение», то 5.9 обязано дать 5.

Контрольные точки

Как проверить результат

Цел(5.9)
Норма

5 — дробная часть отсечена

Тревожный признак

6 — использовано округление вместо отсечения

Окр(5.5, 0)
Норма

6 — математическое округление

Тревожный признак

5 — функция ведёт себя как Цел()

Цел(-5.9)
Норма

-5 — отсечение к нулю

Тревожный признак

-6 — ожидалось округление вниз, нужна отдельная функция

Запись в реквизит Число(10,0)
Норма

Значение совпадает с рассчитанным в коде

Тревожный признак

Платформа округлила повторно — расхождение на единицу

FAQ

Чем Цел() отличается от Окр() в 1С?

Цел() отбрасывает дробную часть без округления: Цел(7.9) = 7. Окр() округляет по математическим правилам: Окр(7.9, 0) = 8. Выбор зависит от бизнес-правила: для «полных единиц» нужен Цел(), для расчётных сумм — Окр().

Как округлить число вверх до целого в 1С?

Отдельной функции нет. Возьмите Цел(Число) и прибавьте 1, если исходное число больше полученной целой части. Для положительных чисел работает и приём Цел(Число + 0.999...), но явная проверка читаемее и безопаснее.

Как получить целое число в запросе 1С?

Используйте ВЫРАЗИТЬ(Поле КАК ЧИСЛО(15, 0)) — приведение типа округлит значение на стороне запроса. Учтите, что это округление, а не отсечение, и не округляйте результат повторно в коде.

Почему Цел() возвращает неожиданный результат для отрицательных чисел?

Цел() отсекает дробную часть в сторону нуля: Цел(-7.8) = -7. Если нужно округление всегда вниз (математический «пол»), добавьте проверку: когда число меньше своей целой части, вычтите единицу.

Как разделить нацело и получить остаток?

Целую часть частного получают через Цел(Делимое / Делитель), остаток — оператором %: Остаток = Делимое % Делитель. Перед делением проверьте, что делитель не равен нулю.

Можно ли получить целое из строки?

Да: Число(Строка) преобразует строку в число, а затем примените Цел() или Окр(). Для загрузки данных надёжнее использовать ОписаниеТипов с нулевой разрядностью и метод ПривестиЗначение(), который выполнит приведение по правилам типа.

Итог

Что важно запомнить

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