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

В этой статье мы разберем 7 способов получения целого числа в запросах 1С 8.3, включая стандартные функции (ЦЕЛОЕ(), ОКРУГЛ()), приведение типов (ТИПЗНАЧЕНИЕ()), а также нюансы работы с отрицательными числами и нулевыми значениями. Особое внимание уделим типовым ошибкам, которые допускают даже опытные разработчики, и покажем, как их избежать на практике.

Материал будет полезен как начинающим программистам , так и специалистам с опытом, которые хотят систематизировать знания или найти оптимальное решение для конкретной задачи. Все примеры протестированы на актуальных версиях платформы (включая 1С:Предприятие 8.3.22).

1. Функция ЦЕЛОЕ(): отбрасывание дробной части

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

Примеры использования:

ВЫБРАТЬ

ЦЕЛОЕ(123.456) КАК Результат1, // Вернет 123

ЦЕЛОЕ(-123.456) КАК Результат2 // Вернет -124 (отбрасывает до меньшего числа!)

ИЗ

&Таблица КАК Т

  • ✅ Подходит для финансовых расчетов, где дробная часть не имеет смысла (например, количество штук товара).
  • ⚠️ Опасно для отрицательных чисел: ЦЕЛОЕ(-1.9) даст -2, а не -1.
  • 📌 Не округляет, а именно усекает дробную часть.
💡

Если вам нужно всегда округлять в меньшую сторону (включая отрицательные числа), используйте комбинацию ЦЕЛОЕ(Число + (Число < 0 ? -1 : 0)).

2. Округление с помощью ОКРУГЛ(): гибкость и точность

Функция ОКРУГЛ() предоставляет больше контроля над процессом преобразования. Она позволяет указать точность округления (количество знаков после запятой) и режим округления (в большую/меньшую сторону или по математическим правилам).

Синтаксис:

ОКРУГЛ(Число, Точность[, РежимОкругления])

Примеры:

ВЫБРАТЬ

ОКРУГЛ(123.456, 0) КАК Результат1, // 123 (округление до целых)

ОКРУГЛ(123.456, -1) КАК Результат2, // 120 (округление до десятков)

ОКРУГЛ(-123.456, 0, 1) КАК Результат3 // -123 (округление в меньшую сторону)

ИЗ

&Таблица КАК Т

Режим округления Значение параметра Пример ОКРУГЛ(123.456, 0, Режим) Пример ОКРУГЛ(-123.456, 0, Режим)
По умолчанию (математическое) 0 123 -123
В меньшую сторону 1 123 -124
В большую сторону 2 124 -123
📊 Какой режим округления вы используете чаще?
Математическое (по умолчанию)
В меньшую сторону
В большую сторону
Зависит от задачи

3. Приведение типов с ТИПЗНАЧЕНИЕ(): явное преобразование

Функция ТИПЗНАЧЕНИЕ() позволяет явно преобразовать значение к заданному типу, включая Число(10,0) для целых чисел. Этот метод полезен, когда нужно гарантировать тип результата, например, при работе с параметрами запроса или динамическими данными.

Пример:

ВЫБРАТЬ

ТИПЗНАЧЕНИЕ(123.456, "Число(10,0)") КАК ЦелоеЧисло

ИЗ

&Таблица КАК Т

Особенности метода:

  • 🔹 Гарантирует целочисленный тип результата, что важно для последующих операций (например, сравнения с другими целыми числами).
  • ⚠️ При преобразовании дробных чисел происходит округление по математическим правилам (в отличие от ЦЕЛОЕ(), которое усекает).
  • 📝 Полезно для динамических запросов, где тип параметра заранее неизвестен.
Что будет при преобразовании строки?

Если передать строку, например ТИПЗНАЧЕНИЕ("123.45", "Число(10,0)"), то произойдет автоматическое преобразование в число с последующим округлением до 123. Если строка не может быть преобразована (например, "abc"), запрос вернет ошибку.

4. Работа с отрицательными числами: ловушки и решения

Отрицательные числа — частая причина ошибок при преобразовании в целые. Например, ЦЕЛОЕ(-1.9) вернет -2, что может быть неожиданным. Чтобы избежать таких ситуаций, используйте комбинации функций или явное управление округлением.

Типовые сценарии и решения:

  • 🔸 Всегда в меньшую сторону (включая отрицательные): ЦЕЛОЕ(Число - (Число > 0 ? 0 : 1))
  • 🔸 Всегда в большую сторону: ОКРУГЛ(Число, 0, 2)
  • 🔸 Математическое округление: ОКРУГЛ(Число, 0) или ТИПЗНАЧЕНИЕ(Число, "Число(10,0)")

Пример запроса с учетом знака:

ВЫБРАТЬ

ЦЕЛОЕ(Количество + (Количество < 0 ? -1 : 0)) КАК ЦелоеКоличество

ИЗ

Документ.ПоступлениеТоваров КАК Поступление

💡

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

5. Обработка NULL и пустых значений

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

Примеры:

ВЫБРАТЬ

ЦЕЛОЕ(ВЫРАЗИТЬ(ЕСЛИ ЗНАЧЕНИЕЗАПОЛНЕНО(Сумма) ТОГДА Сумма ИНАЧЕ 0 КОНЕЦ) КАК ЧИСЛО(15,2))) КАК ЦелаяСумма

ИЗ

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

Типовые ошибки:

  • ❌ Прямое применение ЦЕЛОЕ(Поле) к полю, которое может быть NULL → ошибка выполнения.
  • ✅ Решение: всегда проверяйте заполненность или используйте ВЫРАЗИТЬ() с приведением к числу.

Значение не NULL|Тип данных совместим с числом|Учет знака числа (если отрицательное)|Проверка на переполнение (для больших чисел)-->

6. Альтернативные методы: ВЫРАЗИТЬ и CAST

Для сложных сценариев, где нужно сочетать преобразование типов с другими операциями, можно использовать ВЫРАЗИТЬ() (аналог SQL CAST). Этот метод позволяет явным образом указать целевой тип данных.

Примеры:

ВЫБРАТЬ

ВЫРАЗИТЬ(123.456 КАК ЧИСЛО(10,0)) КАК Метод1, // Округление

ВЫРАЗИТЬ(ЦЕЛОЕ(123.456) КАК ЧИСЛО(10,0)) КАК Метод2 // Усечение

ИЗ

&Таблица КАК Т

Преимущества ВЫРАЗИТЬ():

  • 🔧 Гибкость: можно комбинировать с другими функциями.
  • 📊 Поддержка сложных типов (например, ЧИСЛО(15,2)).
  • ⚡ Более высокая производительность в некоторых сценариях (по сравнению с вложенными функциями).
💡

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

7. Типовые ошибки и как их избежать

Даже опытные разработчики иногда допускают ошибки при работе с целыми числами в запросах. Вот самые распространенные из них и способы их предотвращения:

⚠️ Внимание: Поведение функций ЦЕЛОЕ() и ОКРУГЛ() может отличаться в разных версиях платформы 1С:Предприятие. Например, в версиях ниже 8.3.10 функция ОКРУГЛ() не поддерживала параметр РежимОкругления. Всегда проверяйте документацию для вашей версии.
Ошибка Причина Решение
Ошибка при преобразовании NULL Прямое применение ЦЕЛОЕ() к пустому полю Использовать ВЫРАЗИТЬ(ЕСЛИ ЗНАЧЕНИЕЗАПОЛНЕНО(Поле) ТОГДА Поле ИНАЧЕ 0 КОНЕЦ КАК ЧИСЛО(15,2))
Неожиданный результат для отрицательных чисел ЦЕЛОЕ(-1.9) возвращает -2, а не -1 Явно управлять округлением через ОКРУГЛ() с параметром РежимОкругления
Потеря точности при каскадных преобразованиях Многократное применение ОКРУГЛ() или ЦЕЛОЕ() к одному значению Выполнять преобразование в одном шаге: ВЫРАЗИТЬ(Выражение КАК ЧИСЛО(10,0))

Дополнительные рекомендации:

  • 🔍 Всегда тестируйте запросы на крайних значениях: очень большие числа, отрицательные, NULL.
  • 📈 Для финансовых расчетов используйте ОКРУГЛ() с явным указанием режима, чтобы избежать расхождений в копейках.
  • 🛠 При отладке сложных запросов разбивайте их на части и проверяйте промежуточные результаты.

FAQ: Частые вопросы по работе с целыми числами в 1С

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

Используйте комбинацию ВЫРАЗИТЬ() и ЧИСЛО():

ВЫБРАТЬ

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

ИЗ

&Таблица КАК Т

Если строка может содержать нечисловые символы, предварительно проверьте её с помощью ЗНАЧЕНИЕЗАПОЛНЕНО() и ПОДСТРОКА().

Почему ЦЕЛОЕ(1.999) возвращает 1, а не 2?

Функция ЦЕЛОЕ() не округляет, а отбрасывает дробную часть. Для округления используйте ОКРУГЛ(1.999, 0) — это вернет 2.

Как получить целое число из даты (например, год или день)?

Используйте функции работы с датами:

ВЫБРАТЬ

ГОД(ДатаДокумента) КАК Год,

ДЕНЬ(ДатаДокумента) КАК ДеньМесяца

ИЗ

Документ.ЗаказКлиента КАК Заказ

Эти функции всегда возвращают целые числа.

Можно ли использовать ЦЕЛОЕ() для округления валютных сумм?

Нет, для валютных сумм лучше использовать ОКРУГЛ() с указанием точности (например, ОКРУГЛ(Сумма, 2) для копеек). Функция ЦЕЛОЕ() отбросит дробную часть, что приведет к потере точности.

Для округления до целых рублей с учетом копеек используйте:

ОКРУГЛ(СуммаВРублях, 0, 1)  // Округление в меньшую сторону

ОКРУГЛ(СуммаВРублях, 0, 2) // Округление в большую сторону

Как преобразовать булево значение в целое (0 или 1)?

Используйте конструкцию ВЫБОР:

ВЫБРАТЬ

ВЫБОР

КОГДА ЛогическоеПоле ТОГДА 1

ИНАЧЕ 0

КОНЕЦ КАК ЦелоеЗначение

ИЗ

&Таблица КАК Т

Или краткую запись:

ВЫБРАТЬ

(ЛогическоеПоле = ИСТИНА) КАК ЦелоеЗначение // Вернет 1 или 0

ИЗ

&Таблица КАК Т