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

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

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

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

В языке запросов 1С нет привычных функций Int() или Trunc(), но задача отбросить дробную часть числа решается штатными средствами. Основной инструмент — функция ЦЕЛ(), которая возвращает целую часть переданного числового выражения. Она работает и в консоли запросов, и в текстах запросов внутри модулей, и в схемах компоновки данных.

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

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

Синтаксис и поведение функции ЦЕЛ()

Функция записывается в секции ВЫБРАТЬ запроса и принимает один параметр — числовое выражение: поле таблицы, константу, параметр или результат вычисления. Общий вид: ЦЕЛ(ЧисловоеВыражение). Результат имеет числовой тип, дробная часть отбрасывается полностью.

Простейший пример в консоли запросов:

ВЫБРАТЬ

ЦЕЛ(123.75) КАК ЦелаяЧасть

Результат — 123. Аналогично ЦЕЛ(0.99) вернёт 0, а ЦЕЛ(10.0) вернёт 10. Функция не выполняет округления в большую сторону независимо от значения дробной части, и это её ключевое отличие от арифметического округления.

Функцию можно применять к выражениям любой сложности: к сумме полей, результату деления, произведению количества на цену. Например, ЦЕЛ(Продажи.Сумма / КурсВалюты) корректно отбросит дробную часть уже после выполнения деления.

Как применить ЦЕЛ() к полю таблицы

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

ВЫБРАТЬ

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

Реализация.Количество КАК Количество,

ЦЕЛ(Реализация.Количество) КАК ЦелоеКоличество

ИЗ

Документ.РеализацияТоваровУслуг.Товары КАК Реализация

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

Функцию можно вкладывать в агрегатные выражения и наоборот — применять к результату агрегации. Записи СУММА(ЦЕЛ(Количество)) и ЦЕЛ(СУММА(Количество)) дадут разные результаты: первая сначала отбросит дробные части у каждой строки, вторая — у итоговой суммы. Выбирайте порядок осознанно, исходя из прикладной задачи.

ЦЕЛ() и отрицательные числа: что проверить

Отдельного внимания заслуживают отрицательные значения. Для положительных чисел отсечение дробной части интуитивно понятно, но для отрицательных результат зависит от реализации платформы и СУБД, на которой выполняется запрос. В ряде случаев поведение может соответствовать отсечению в сторону нуля, в других — округлению в меньшую сторону.

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

ВЫБРАТЬ

ЦЕЛ(-2.7) КАК ЦелаяЧастьОтрицательного,

ЦЕЛ(2.7) КАК ЦелаяЧастьПоложительного

Если требуется строгое отсечение в сторону нуля или, наоборот, математическое поведение «вниз», а функция ведёт себя иначе, добавьте корректирующую логику через ВЫБОР: например, для отрицательных значений вычитать единицу при наличии дробной части.

Альтернативы: округление через ВЫРАЗИТЬ и Окр()

Отсечение дробной части — не единственная задача. Часто прикладная логика требует именно округления до целого по арифметическим правилам. В языке запросов это делается приведением типа:

ВЫБРАТЬ

ВЫРАЗИТЬ(Реализация.Сумма КАК ЧИСЛО(15, 0)) КАК ОкругленнаяСумма

ИЗ

Документ.РеализацияТоваровУслуг.Товары КАК Реализация

При приведении к ЧИСЛО(15, 0) значение округляется по правилам арифметики: 12,49 станет 12, а 12,5 станет 13. Это принципиально отличается от ЦЕЛ(), где 12,9 всё равно даст 12. Выбор между функциями определяется требованиями: для подсчёта полных упаковок обычно нужно отсечение, для денежных итогов — округление.

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

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

ЦЕЛ(Число) в запросе

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

ВЫРАЗИТЬ(Число КАК ЧИСЛО(15, 0))

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

Окр() / Цел() во встроенном языке

Обработка после выполнения запроса. Оправдана для единичных значений, но медленнее при массовой обработке строк.

Обработка NULL и нечисловых значений

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

Защитный приём — предварительно обернуть поле функцией ЕСТЬNULL:

ВЫБРАТЬ

Номенклатура.Ссылка КАК Товар,

ЦЕЛ(ЕСТЬNULL(Остатки.КоличествоОстаток, 0)) КАК ЦелыйОстаток

ИЗ

Справочник.Номенклатура КАК Номенклатура

ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки КАК Остатки

ПО Номенклатура.Ссылка = Остатки.Номенклатура

Такой запрос гарантированно вернёт число для каждой строки: при отсутствии остатка целая часть будет вычислена от нуля. Без ЕСТЬNULL в колонке появились бы пустые значения, и итоги по группировкам могли бы не сойтись с ожидаемыми.

Типичные ошибки
01
Путать ЦЕЛ() с округлением: ожидать, что ЦЕЛ(2,9) даст 3, и получать заниженные итоги в отчётах.
02
Применять ЦЕЛ() к NULL без ЕСТЬNULL и терять строки или получать пустые значения в вычислениях.
03
Использовать ЦЕЛ() для денежных сумм там, где по учётной политике требуется арифметическое округление.
04
Не проверять поведение функции на отрицательных значениях при наличии сторно и корректировок в данных.
05
Смешивать СУММА(ЦЕЛ(...)) и ЦЕЛ(СУММА(...)), не понимая, почему итоги двух отчётов расходятся.

Проверка результата и практический порядок действий

Надёжный способ убедиться, что функция работает как нужно, — собрать проверочный запрос с контрольными значениями и сравнить результат с ожиданиями. Включите в тест положительные дробные числа, отрицательные значения, ноль, числа с дробной частью 0,5 и NULL.

Признак корректной работы: для положительных чисел дробная часть отброшена, итоги группировок сходятся с ручным пересчётом на небольшой выборке, в колонках нет неожиданных NULL. Если результат отличается — проверьте порядок вложенности функций и наличие ЕСТЬNULL.

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

В отчётах на СКД вычисление целой части лучше размещать на уровне запроса набора данных, а не в вычисляемых полях: так результат доступен для группировок, отборов и итогов без дополнительных настроек. Если же целая часть нужна только для отображения, допустимо использовать вычисляемое поле компоновки с тем же выражением ЦЕЛ().

Итог

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

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

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

Чем ЦЕЛ() отличается от округления до целого?

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

Работает ли ЦЕЛ() в СКД и вычисляемых полях?

Да. Функция доступна в запросах наборов данных СКД и в выражениях вычисляемых полей. Для участия в группировках и итогах вычисление лучше размещать в запросе набора данных, а не в вычисляемом поле.

Что вернёт ЦЕЛ(), если в поле NULL?

Результатом будет NULL. Чтобы получить ноль вместо пустого значения, оберните поле в ЕСТЬNULL: ЦЕЛ(ЕСТЬNULL(Поле, 0)). Это особенно важно при левых соединениях с виртуальными таблицами регистров.

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

Штатной функции для дробной части нет, но её можно вычислить как разность: Выражение - ЦЕЛ(Выражение). Для положительных чисел это даст значение от 0 до 1. Для отрицательных результат зависит от поведения ЦЕЛ(), поэтому проверяйте на тестовых данных.

Можно ли применить ЦЕЛ() к результату агрегатной функции?

Да, запись ЦЕЛ(СУММА(Количество)) корректна и отбросит дробную часть итоговой суммы. Учтите, что это отличается от СУММА(ЦЕЛ(Количество)), где отсечение происходит построчно до суммирования, и итоги могут заметно различаться.

Есть ли ЦЕЛ() во встроенном языке 1С вне запросов?

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