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