Разработка и Конфигурация · 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). Тем не менее явное указание разрядности делает код читаемее и защищает от неоднозначной трактовки при ревью.
Важно понимать: Окр() возвращает число, которое может по-прежнему иметь дробный тип с нулевой дробной частью. Если дальше значение сравнивается с целым или выводится в строку, разницы обычно нет, но при строгой типизации стоит учитывать этот момент.
Сравнение вариантов
Отбрасывает дробную часть без округления. Подходит для выделения целых единиц: рублей, дней, полных упаковок.
Математическое округление до ближайшего целого. Подходит для сумм и расчётных показателей, где важна точность.
Округление вверх. Нужно при расчёте количества тары, рейсов, страниц — когда неполная единица всё равно требует ресурса.
Округление на стороне СУБД при выборке. Подходит, когда результат нужен сразу в целом виде без постобработки.
Как округлить вверх или вниз принудительно
Во встроенном языке 1С нет отдельных функций «округлить вверх» и «округлить вниз», поэтому их реализуют комбинацией Цел() и проверки дробной части.
Округление вверх (потолок)
Классическая задача — расчёт количества коробок: если товара 10.2 коробки, нужно 11. Реализация:
Функция ОкруглитьВверх(Число)
ЦелаяЧасть = Цел(Число);
Если Число > ЦелаяЧасть Тогда
Возврат ЦелаяЧасть + 1;
Иначе
Возврат ЦелаяЧасть;
КонецЕсли;
КонецФункции
Округление вниз (пол)
Для положительных чисел Цел() уже работает как округление вниз. Для универсального варианта с отрицательными значениями:
Функция ОкруглитьВниз(Число)
ЦелаяЧасть = Цел(Число);
Если Число < ЦелаяЧасть Тогда
Возврат ЦелаяЧасть - 1;
Иначе
Возврат ЦелаяЧасть;
КонецЕсли;
КонецФункции
Целочисленное деление и остаток от деления
Часто «получить целое» означает разделить нацело: сколько полных упаковок в количестве, сколько целых часов в минутах. Для этого используют Цел() поверх деления, а остаток получают оператором %.
ВсегоМинут = 200;
Часов = Цел(ВсегоМинут / 60); // 3
Минут = ВсегоМинут % 60; // 20
Оператор % возвращает остаток от деления и сам по себе тоже способ получить целое: остаток всегда целый, если делимое и делитель целые. Пара деления и остатка покрывает большинство задач разложения на целые единицы.
При делении следите за типом делителя: деление на ноль вызовет ошибку времени выполнения. Перед вычислением убедитесь, что знаменатель не равен нулю, особенно если он берётся из реквизита документа, где поле могли не заполнить.
- 1Определите правило: отсечение, математическое округление, вверх или вниз
- 2Выберите функцию: Цел(), Окр(Число, 0) или комбинацию с проверкой дробной части
- 3Проверьте делитель на ноль перед делением
- 4Протестируйте на граничных значениях: 5.0, 5.5, 5.999, отрицательное число
- 5Убедитесь, что результат корректно записывается в реквизит с нужной разрядностью
Получение целого числа в запросе
В языке запросов 1С функции Цел() и Окр() недоступны напрямую. Стандартный способ привести число к целому — оператор ВЫРАЗИТЬ с указанием типа ЧИСЛО с нулевой точностью:
ВЫБРАТЬ
ВЫРАЗИТЬ(Сумма / Курс КАК ЧИСЛО(15, 0)) КАК ЦелоеЗначение
ИЗ
Документ.Реализация КАК Реализация
Приведение типа в запросе выполняет округление по правилам платформы, а не простое отсечение, поэтому результат может отличаться от Цел() в коде. Если в обработке результата запроса снова применить округление, можно получить двойное округление и расхождение в единицу.
Альтернатива — выбрать исходное дробное значение и обработать его в коде после выполнения запроса. Такой подход прозрачнее: все правила округления сосредоточены в одном месте модуля, а не размазаны между запросом и кодом.
Приведение строки к целому числу
Иногда целое число нужно получить из строки — например, при загрузке данных из файла или обмене. Встроенное преобразование Число(Строка) вернёт число, но строка вида «12.7» даст дробное значение, а нечисловая строка — 0 без ошибки.
Значение = Число("123"); // 123, число
Значение = Число("12.7"); // 12.7 — дробное
Значение = Число("abc"); // 0 — ошибка замаскирована
Для надёжной загрузки используйте ОписаниеТипов с квалификатором числа без дробной части и метод ПривестиЗначение() — он выполнит приведение и округление по правилам типа. Дополнительно полезно проверять входную строку на пустое значение и недопустимые символы, чтобы отличать «ноль как данные» от «ноль как ошибка парсинга».
Типичные ошибки и как их проверить
Первая распространённая ошибка — использование Окр() там, где нужно отсечение. Пример: расчёт целых отгруженных дней. Окр(2.6) даст 3, хотя фактически отгружено только 2 полных дня. Вторая ошибка — применение Цел() к результату, который потом снова округляется при записи в реквизит с разрядностью 0, что даёт двойную обработку.
Третья группа ошибок связана с реквизитами: если реквизит объявлен как Число(10, 0), платформа сама округлит записываемое значение. Разработчик может не заметить, что дробная часть теряется на уровне метаданных, и искать причину расхождений в коде.
Проверка результата проста: прогоните функцию на контрольном наборе — 5.0, 5.4, 5.5, 5.9, 0, -5.5 — и сверьте с ожидаемым правилом. Если правило «вверх», то 5.0 должно остаться 5, а 5.1 стать 6; если правило «отсечение», то 5.9 обязано дать 5.
Как проверить результат
5 — дробная часть отсечена
6 — использовано округление вместо отсечения
6 — математическое округление
5 — функция ведёт себя как Цел()
-5 — отсечение к нулю
-6 — ожидалось округление вниз, нужна отдельная функция
Значение совпадает с рассчитанным в коде
Платформа округлила повторно — расхождение на единицу
FAQ
Чем Цел() отличается от Окр() в 1С?
Цел() отбрасывает дробную часть без округления: Цел(7.9) = 7. Окр() округляет по математическим правилам: Окр(7.9, 0) = 8. Выбор зависит от бизнес-правила: для «полных единиц» нужен Цел(), для расчётных сумм — Окр().
Как округлить число вверх до целого в 1С?
Отдельной функции нет. Возьмите Цел(Число) и прибавьте 1, если исходное число больше полученной целой части. Для положительных чисел работает и приём Цел(Число + 0.999...), но явная проверка читаемее и безопаснее.
Как получить целое число в запросе 1С?
Используйте ВЫРАЗИТЬ(Поле КАК ЧИСЛО(15, 0)) — приведение типа округлит значение на стороне запроса. Учтите, что это округление, а не отсечение, и не округляйте результат повторно в коде.
Почему Цел() возвращает неожиданный результат для отрицательных чисел?
Цел() отсекает дробную часть в сторону нуля: Цел(-7.8) = -7. Если нужно округление всегда вниз (математический «пол»), добавьте проверку: когда число меньше своей целой части, вычтите единицу.
Как разделить нацело и получить остаток?
Целую часть частного получают через Цел(Делимое / Делитель), остаток — оператором %: Остаток = Делимое % Делитель. Перед делением проверьте, что делитель не равен нулю.
Можно ли получить целое из строки?
Да: Число(Строка) преобразует строку в число, а затем примените Цел() или Окр(). Для загрузки данных надёжнее использовать ОписаниеТипов с нулевой разрядностью и метод ПривестиЗначение(), который выполнит приведение по правилам типа.
Что важно запомнить
Цел() отсекает дробную часть, Окр(Число, 0) округляет математически, округление вверх и вниз реализуется проверкой дробной части. В запросах используйте ВЫРАЗИТЬ КАК ЧИСЛО(15, 0). Проверяйте делитель на ноль, учитывайте знак числа и не округляйте промежуточные результаты.