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

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

ВЫРАЗИТЬ КАК ЧИСЛО в запросе 1С 8: синтаксис и практические приёмы

Как использовать ВЫРАЗИТЬ КАК ЧИСЛО в запросе 1С 8.3: синтаксис, длина и точность, приведение строк к числу, типичные ошибки и примеры кода.

Функция ВЫРАЗИТЬ в языке запросов 1С 8 применяется для приведения значения поля к нужному типу данных. Чаще всего её используют в двух ситуациях: когда строковое или составное поле нужно превратить в число для расчётов и сравнений, и когда требуется усечь лишнюю разрядность числа, чтобы корректно работали соединения и группировки.

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

Ниже разобран синтаксис функции, правила выбора длины и точности, поведение при приведении строк и составных типов, а также типичные ошибки, из-за которых запрос возвращает неожиданные результаты.

Синтаксис функции ВЫРАЗИТЬ КАК ЧИСЛО

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

Точность указывать не обязательно: запись ЧИСЛО(10) эквивалентна целому числу длиной 10 разрядов. Если опустить и длину — ЧИСЛО без параметров — платформа применит значения по умолчанию, но явное указание разрядности считается хорошей практикой, так как делает поведение запроса предсказуемым.

Пример простого запроса:

ВЫБРАТЬ

ВЫРАЗИТЬ(Таблица.КоличествоСтрокой КАК ЧИСЛО(15, 3)) КАК Количество

ИЗ

РегистрСведений.ДанныеОбмена КАК Таблица

Как выбрать длину и точность числа

Длину нужно выбирать с запасом относительно максимально возможного значения. Если в поле хранятся суммы документов, разумно закладывать 15–17 разрядов с точностью 2. Для количества товаров обычно достаточно 15 разрядов с точностью 3. Для процентов и коэффициентов часто хватает меньшей длины, но большей относительной точности — например, ЧИСЛО(10, 4).

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

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

Приведение строки к числу

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

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

Чтобы защититься, комбинируйте приведение с ЕСТЬNULL и при необходимости с ВЫБОР:

ВЫБОР

КОГДА ВЫРАЗИТЬ(Данные.Значение КАК ЧИСЛО(15, 2)) ЕСТЬ NULL

ТОГДА 0

ИНАЧЕ ВЫРАЗИТЬ(Данные.Значение КАК ЧИСЛО(15, 2))

КОНЕЦ КАК Сумма

Если в источнике возможны строки с запятой вместо точки или с пробелами, приведение в запросе не поможет — такие данные нужно предварительно очищать при загрузке средствами встроенного языка (СтрЗаменить, СокрЛП) и только потом записывать в базу.

Типичные ошибки
01
Приведение строки с буквами или пробелами: результат NULL, итоги отчёта занижены без какой-либо ошибки
02
Заниженная длина числа: ошибка выполнения запроса или усечение целой части на больших значениях
03
Сравнение полей с разной точностью без приведения к единому типу: соединение не находит совпадений
04
Использование ВЫРАЗИТЬ вместо обработки NULL: функция меняет тип, но не подставляет значение по умолчанию

Приведение составных типов и ссылок

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

Булево значение при приведении к числу даёт 1 для Истина и 0 для Ложь — это иногда используют для подсчёта флагов через СУММА. Дата к числу напрямую не приводится: для вычислений с датами применяйте функции РАЗНОСТЬДАТ, ДОБАВИТЬКДАТЕ или извлечение частей даты.

Ссылочные значения к числу не приводятся — результат всегда NULL. Если нужно сравнить числовой код объекта, используйте соответствующий реквизит (Код, Номер), предварительно приведя его к нужному типу, поскольку код справочника часто строковый.

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

ВЫРАЗИТЬ КАК ЧИСЛО в запросе

Быстро, работает на стороне СУБД, подходит для выборок любого объёма. Ограничение: некорректные строки дают NULL без сообщения

Преобразование в коде после выборки

Гибче: можно обработать запятую, пробелы, нестандартные форматы. Минус — медленнее и требует обхода результата запроса

Очистка данных при записи

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

Использование в итогах, соединениях и условиях

Приведённое к числу поле можно использовать в агрегатных функциях СУММА, СРЕДНЕЕ, МАКСИМУМ, в условиях ГДЕ и ИМЕЮЩИЕ, а также в условиях соединения. Помните, что агрегатные функции игнорируют NULL, поэтому «потерянные» при приведении значения не попадут в СУММУ — проверяйте КОЛИЧЕСТВО строк до и после приведения, если итог вызывает сомнения.

В условии отбора приведение работает так: ГДЕ ВЫРАЗИТЬ(Поле КАК ЧИСЛО(15, 2)) > 1000. Учтите, что применение функции к полю в условии может отключить использование индекса по этому полю, что замедлит запрос на больших таблицах. Если отбор по числовому условию критичен по производительности, лучше хранить данные сразу в числовом реквизите.

При соединении по приведённым полям убедитесь, что обе стороны приведены к идентичному типу с одинаковыми длиной и точностью. Даже корректные числа не совпадут, если одна сторона ЧИСЛО(15,2), а другая ЧИСЛО(15,3).

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

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

Быстрый способ убедиться, что приведение не «съело» данные, — сравнить количество строк, где исходное поле заполнено, с количеством строк, где приведённое значение не NULL. Конструкция вида СУММА(ВЫБОР КОГДА ВЫРАЗИТЬ(Поле КАК ЧИСЛО(15,2)) ЕСТЬ NULL ТОГДА 1 ИНАЧЕ 0 КОНЕЦ) покажет число непреобразованных значений.

Если запрос падает с ошибкой о переполнении числового типа, увеличьте длину. Если итоги не сходятся с ожидаемыми, ищите NULL: выведите проблемные строки отдельным запросом с отбором ГДЕ ВЫРАЗИТЬ(...) ЕСТЬ NULL И Поле <> "", чтобы увидеть, что именно не преобразовалось.

Для отладки удобна консоль запросов: она показывает тип и значение каждого поля результата, что позволяет сразу увидеть и NULL, и неожиданное округление дробной части.

Контрольные точки

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

Количество строк результата
Норма

Совпадает с количеством строк источника

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

Строк потеряно — проверяйте условия соединений, а не только приведение

Значения после приведения
Норма

Числа соответствуют исходным, NULL только у пустых значений

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

NULL у заполненных строк — в данных есть буквы, пробелы или запятые

Итоги по СУММА
Норма

Сходятся с контрольными значениями

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

Итог занижен — часть значений превратилась в NULL и не попала в сумму

Итог

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

ВЫРАЗИТЬ(Поле КАК ЧИСЛО(Длина, Точность)) приводит значение к числу на стороне СУБД. Выбирайте длину с запасом, приводите обе стороны соединений к одинаковому типу и всегда обрабатывайте NULL — именно он чаще всего искажает результаты при работе со строковыми источниками.

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

Чем ВЫРАЗИТЬ отличается от ЕСТЬNULL?

ВЫРАЗИТЬ меняет тип значения (например, строку на число), а ЕСТЬNULL подставляет указанное значение вместо NULL, не меняя тип. Эти функции дополняют друг друга: типичная связка — ВЫРАЗИТЬ для приведения типа и ЕСТЬNULL для замены результата, если приведение не удалось.

Почему ВЫРАЗИТЬ КАК ЧИСЛО возвращает NULL, хотя в поле видно цифры?

Строка может содержать неразрывные пробелы, разделители разрядов, запятую вместо точки или невидимые символы из внешних выгрузок. Визуально это число, но для преобразования оно некорректно. Такие данные нужно очищать средствами встроенного языка до записи или при загрузке.

Можно ли привести число к строке в запросе?

Да, используется ВЫРАЗИТЬ(Поле КАК СТРОКА(Длина)). Но для строк результат зависит от СУБД и может содержать нежелательное форматирование. Если нужен строго контролируемый вид числа, форматируйте его уже в коде функцией Формат.

Влияет ли ВЫРАЗИТЬ на производительность запроса?

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

Что произойдёт, если дробная часть не помещается в указанную точность?

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

Можно ли привести к числу значение перечисления или ссылки?

Нет, ссылочные типы и перечисления к числу не приводятся — результат будет NULL. Если нужен числовой эквивалент, используйте числовые реквизиты объекта (например, Код, если он числовой) или храните нужное значение в отдельном числовом поле.