Разработка и Конфигурация · 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.
Арифметическое округление до целого. Подходит для сумм и количеств, где важен ближайший результат: Окр(9,5, 0) = 10.
Приведение типа в запросе с округлением. Используется, когда целое нужно получить прямо в выборке, а не в коде.
При выборе между Цел() и Окр() ориентируйтесь на смысл показателя. Денежные суммы к оплате обычно округляют, количество полностью укомплектованных наборов — отсекают. Неверный выбор заметен сразу: на больших объёмах расхождение накапливается и всплывает при сверке отчётов.
Преобразование строки и других типов в число
Часто «выразить как целое число» означает «получить число из строки». Для этого служит функция Число(): она преобразует строковое представление в числовое значение. Строка должна содержать корректное число — цифры, возможно знак минус, разделитель дробной части (точка или запятая в зависимости от региональных настроек кода).
СтрокаИзФайла = "1024";
Значение = Число(СтрокаИзФайла); // 1024
ЦелоеЗначение = Цел(Значение);
Если строка содержит недопустимые символы — буквы, пробелы внутри числа, лишние разделители — платформа выдаст ошибку преобразования и прервёт выполнение. Поэтому данные из внешних источников (файлов, HTTP-ответов, ввода пользователя) стоит предварительно очищать или оборачивать в Попытка/Исключение.
Булево значение тоже преобразуется: Число(Истина) даст 1, Число(Ложь) — 0. Даты напрямую в число не преобразуются — для них используют функции День(), Месяц(), Год() или разность дат в секундах.
Целые числа в запросах: ВЫРАЗИТЬ и ВЫБОР
В языке запросов нет функции Цел(), но есть оператор ВЫРАЗИТЬ, который приводит значение к указанному типу. Конструкция ВЫРАЗИТЬ(Поле КАК ЧИСЛО(15, 0)) вернёт число с нулевой точностью — дробная часть будет округлена по правилам СУБД, что для большинства практических задач эквивалентно округлению.
ВЫБРАТЬ
ВЫРАЗИТЬ(Продажи.Количество КАК ЧИСЛО(10, 0)) КАК КоличествоЦелое
ИЗ
РегистрНакопления.Продажи КАК Продажи
Дополнительная выгода ВЫРАЗИТЬ — избавление от избыточной точности. Если реквизит описан как Число(31, 6), а в отчёте нужны целые, приведение типа прямо в запросе упрощает дальнейшую обработку и группировку. Группировка по округлённому значению выполняется корректно, тогда как группировка по исходному дробному может раздробить итоги.
Проверка, является ли число целым
Для проверки целочисленности используется сравнение исходного значения с его целой частью. Если Число = Цел(Число), дробной части нет. Альтернатива — остаток от деления на 1: выражение Число % 1 равно нулю только для целых значений.
Такая проверка полезна при валидации ввода: например, если пользователь ввёл количество 2,5 там, где допустимы только целые единицы, программа должна сообщить об ошибке до записи документа, а не молча обрезать значение.
- 1Определите смысл операции: отсечь дробную часть (Цел) или округлить (Окр).
- 2Если исходное значение — строка, сначала преобразуйте её функцией Число() с обработкой ошибок.
- 3Примените выбранную функцию и сохраните результат в переменную.
- 4Проверьте результат на контрольном примере: 7,9 должно дать 7 при Цел() и 8 при Окр().
- 5Если обработка идёт в запросе, используйте ВЫРАЗИТЬ(Поле КАК ЧИСЛО(N, 0)).
Типичные ошибки и ограничения
Самая частая ошибка — ожидание округления от Цел(). Разработчик пишет Цел(Сумма) и получает заниженный результат, потому что 99,9 превращается в 99. Вторая распространённая проблема — забыть про отрицательные числа: Цел(-3,2) = -3, что контринтуитивно для тех, кто ждёт -4.
Ещё один источник сбоев — потеря точности при промежуточных делениях. Если сначала разделить, потом округлить, а затем снова умножить, итог может не сойтись с исходной суммой. В денежных расчётах порядок операций округления должен быть закреплён в логике конфигурации, а не выбираться стихийно в каждом модуле.
Как проверить результат
7 и -7 — дробная часть отброшена к нулю
8 или -8 — использована не та функция
8 — арифметическое округление вверх
7 — вероятно, применён Цел()
Ошибка обработана через Попытка/Исключение
Необработанное прерывание выполнения
Перед тем как внедрять преобразование в рабочую базу, прогоните код на граничных значениях: ноль, отрицательные дроби, значения ровно посередине (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 — платформа будет автоматически отбрасывать дробную часть при записи значения. Это надёжнее, чем контролировать округление в каждом месте, где реквизит заполняется.