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

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

Как в 1С выразить значение как целое число

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

Задача выразить значение как целое число возникает в 1С постоянно: при расчёте количества упаковок, нумерации строк, делении без остатка, приведении результата запроса к нужному типу. Встроенный язык 1С не имеет отдельного типа «целое число» — есть единый тип «Число», поэтому «сделать целым» означает либо отбросить дробную часть, либо округлить значение, либо получить число из строки.

Выбор способа зависит от бизнес-смысла операции. Отбрасывание дробной части и округление до ближайшего целого дают разные результаты: Цел(7,9) вернёт 7, а Окр(7,9) — 8. Ошибка в выборе метода приводит к неверным суммам, количествам и расхождениям в отчётах, поэтому важно понимать поведение каждой функции.

Ниже разобраны все рабочие способы: функции Цел() и Окр(), преобразование строк в числа, приведение типов в запросах через ВЫРАЗИТЬ, а также проверка, является ли число целым. Отдельно рассмотрены типичные ошибки и ограничения, о которых нужно помнить при самостоятельной доработке кода.

Что значит «целое число» в контексте 1С

В 1С:Предприятии нет разделения на целые и вещественные типы, как в C++ или Pascal. Тип «Число» хранит значения с фиксированной точностью: до 38 разрядов в целой и дробной части суммарно (точный предел зависит от настройки длины и точности при описании реквизита). Поэтому «целое» — это обычное число, у которого дробная часть равна нулю.

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

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

Функция Цел() возвращает целую часть числа, просто отсекая всё после запятой. Для положительных чисел это эквивалентно округлению вниз: Цел(12,99) даст 12. Синтаксис предельно прост: функция принимает один параметр — число или выражение, которое платформа сможет привести к числу.

Важная особенность — поведение с отрицательными значениями. Цел(-5,7) вернёт -5, то есть функция отбрасывает дробную часть по направлению к нулю, а не в меньшую сторону. Если нужна математическая операция «округление вниз» для отрицательных чисел, результат Цел() придётся скорректировать вручную.

КоличествоУпаковок = Цел(ВсегоШтук / ШтукВУпаковке);

// 25 штук по 6 в упаковке: Цел(4,166...) = 4 упаковки

Типичный сценарий — расчёт количества полных упаковок, полных страниц, полных лет. Если нужно наоборот — узнать, сколько упаковок потребуется с учётом неполной, — используйте конструкцию Цел(х) + 1 при наличии остатка или проверку через оператор % (остаток от деления).

Функция Окр(): округление до целого

Если требуется не отбросить, а округлить значение по арифметическим правилам, применяется Окр(Число, Разрядность). Второй параметр 0 означает округление до целых: Окр(7,5, 0) вернёт 8, Окр(7,4, 0) вернёт 7. Значения ровно посередине округляются от нуля вверх по модулю.

Разрядность может быть отрицательной — тогда округление идёт влево от запятой: Окр(1234, -2) даст 1200. Это удобно для укрупнённых плановых показателей, но к теме целых чисел относится косвенно.

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

Цел(х)

Отбрасывает дробную часть к нулю. Подходит для подсчёта полных единиц: упаковок, лет, страниц. Не округляет: Цел(9,99) = 9.

Окр(х, 0)

Арифметическое округление до целого. Подходит для сумм и количеств, где важен ближайший результат: Окр(9,5, 0) = 10.

ВЫРАЗИТЬ(х КАК ЧИСЛО(N, 0))

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

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

Преобразование строки и других типов в число

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

СтрокаИзФайла = "1024";

Значение = Число(СтрокаИзФайла); // 1024

ЦелоеЗначение = Цел(Значение);

Если строка содержит недопустимые символы — буквы, пробелы внутри числа, лишние разделители — платформа выдаст ошибку преобразования и прервёт выполнение. Поэтому данные из внешних источников (файлов, HTTP-ответов, ввода пользователя) стоит предварительно очищать или оборачивать в Попытка/Исключение.

Булево значение тоже преобразуется: Число(Истина) даст 1, Число(Ложь) — 0. Даты напрямую в число не преобразуются — для них используют функции День(), Месяц(), Год() или разность дат в секундах.

Целые числа в запросах: ВЫРАЗИТЬ и ВЫБОР

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

ВЫБРАТЬ

ВЫРАЗИТЬ(Продажи.Количество КАК ЧИСЛО(10, 0)) КАК КоличествоЦелое

ИЗ

РегистрНакопления.Продажи КАК Продажи

Дополнительная выгода ВЫРАЗИТЬ — избавление от избыточной точности. Если реквизит описан как Число(31, 6), а в отчёте нужны целые, приведение типа прямо в запросе упрощает дальнейшую обработку и группировку. Группировка по округлённому значению выполняется корректно, тогда как группировка по исходному дробному может раздробить итоги.

Проверка, является ли число целым

Для проверки целочисленности используется сравнение исходного значения с его целой частью. Если Число = Цел(Число), дробной части нет. Альтернатива — остаток от деления на 1: выражение Число % 1 равно нулю только для целых значений.

Такая проверка полезна при валидации ввода: например, если пользователь ввёл количество 2,5 там, где допустимы только целые единицы, программа должна сообщить об ошибке до записи документа, а не молча обрезать значение.

Порядок действий
  1. 1
    Определите смысл операции: отсечь дробную часть (Цел) или округлить (Окр).
  2. 2
    Если исходное значение — строка, сначала преобразуйте её функцией Число() с обработкой ошибок.
  3. 3
    Примените выбранную функцию и сохраните результат в переменную.
  4. 4
    Проверьте результат на контрольном примере: 7,9 должно дать 7 при Цел() и 8 при Окр().
  5. 5
    Если обработка идёт в запросе, используйте ВЫРАЗИТЬ(Поле КАК ЧИСЛО(N, 0)).

Типичные ошибки и ограничения

Самая частая ошибка — ожидание округления от Цел(). Разработчик пишет Цел(Сумма) и получает заниженный результат, потому что 99,9 превращается в 99. Вторая распространённая проблема — забыть про отрицательные числа: Цел(-3,2) = -3, что контринтуитивно для тех, кто ждёт -4.

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

Типичные ошибки
01
Использовать Цел() там, где нужно округление — итоговые суммы систематически занижаются.
02
Не учесть отрицательные числа: Цел(-3,2) даёт -3, а не -4.
03
Преобразовывать строку функцией Число() без очистки от пробелов и символов валюты — обработка падает с ошибкой.
04
Округлять на каждом шаге расчёта вместо одного округления в конце — накапливается погрешность.
05
Ожидать от ВЫРАЗИТЬ в запросе поведения Цел(), хотя оно округляет.
Контрольные точки

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

Цел(7,9) и Цел(-7,9)
Норма

7 и -7 — дробная часть отброшена к нулю

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

8 или -8 — использована не та функция

Окр(7,5, 0)
Норма

8 — арифметическое округление вверх

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

7 — вероятно, применён Цел()

Число("1 200")
Норма

Ошибка обработана через Попытка/Исключение

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

Необработанное прерывание выполнения

Перед тем как внедрять преобразование в рабочую базу, прогоните код на граничных значениях: ноль, отрицательные дроби, значения ровно посередине (0,5), очень большие числа. Это занимает несколько минут и избавляет от расхождений в отчётности.

Итог

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

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

Частые вопросы

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

Цел() просто отбрасывает дробную часть по направлению к нулю: Цел(9,99) = 9. Окр(х, 0) округляет по арифметическим правилам: Окр(9,5, 0) = 10. Для подсчёта полных единиц берут Цел(), для сумм и ближайших значений — Окр().

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

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

Что вернёт Цел() для отрицательного числа?

Цел(-5,7) вернёт -5: функция отбрасывает дробную часть по направлению к нулю. Если требуется округление вниз (до -6), результат нужно скорректировать вручную, например через проверку знака и остатка.

Как проверить, что число целое?

Сравните значение с его целой частью: условие Число = Цел(Число) истинно только для целых. Альтернатива — проверка остатка от деления: Число % 1 = 0.

Как строку «1 200,50» превратить в целое число?

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

Можно ли сделать реквизит всегда целым без кода?

Да. В свойствах реквизита укажите тип Число с точностью 0 — платформа будет автоматически отбрасывать дробную часть при записи значения. Это надёжнее, чем контролировать округление в каждом месте, где реквизит заполняется.