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

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

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

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

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

Без явного приведения запрос может вернуть неожиданный результат: строки «10» и «9» при сортировке сравниваются посимвольно, а не по величине, составное поле с разной точностью ломает итоги, а соединение таблиц по полям разных типов работает медленно или даёт пустой результат. ВЫРАЗИТЬ КАК ЧИСЛО решает эти задачи на уровне запроса, без обхода выборки в коде.

Ниже разобраны синтаксис функции, правила выбора длины и точности, типовые сценарии применения, ограничения платформы и ошибки, которые чаще всего допускают разработчики при работе с приведением типов в запросах 1С.

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

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

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

ВЫБРАТЬ

ВЫРАЗИТЬ(Товары.КодПоставщика КАК ЧИСЛО(10, 0)) КАК КодЧислом

ИЗ

Справочник.Товары КАК Товары

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

Когда приведение к числу действительно нужно

Первая типовая ситуация — строковые реквизиты, в которых хранятся числа. Такое встречается при обменах с внешними системами, загрузке из Excel или в унаследованных конфигурациях, где числовые данные исторически записаны в строковое поле. Сравнение и сортировка таких значений без приведения дают неверный результат: строка «100» окажется «меньше» строки «99».

Вторая ситуация — составные типы. Если реквизит объявлен как составной (например, строка и число одновременно), операции сравнения и арифметики с ним могут работать некорректно. Явное приведение ВЫРАЗИТЬ КАК ЧИСЛО «срезает» лишние типы и оставляет только числовую составляющую.

Третья ситуация — уточнение разрядности для соединений и группировок. Когда два поля объявлены с разной длиной и точностью (например, ЧИСЛО(15,2) и ЧИСЛО(10,3)), приведение обоих к единому формату упрощает оптимизатору работу и исключает расхождения при округлении промежуточных итогов.

Маршрут решения

Как выбрать действие

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

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

Длину выбирайте по максимально возможному значению с запасом. Если это количество товара, обычно достаточно ЧИСЛО(15, 3); для денежных сумм принято ЧИСЛО(15, 2). Заниженная длина опасна: значение, не помещающееся в заданную разрядность, может быть отсечено или привести к ошибке переполнения при выполнении запроса.

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

Практичный подход — ориентироваться на метаданные связанных полей. Если результат приведения будет сравниваться или соединяться с типовым реквизитом (например, «Количество» в табличной части документа), откройте конфигуратор и посмотрите его квалификаторы числа, затем используйте те же значения.

Приведение строки к числу: нюансы и подводные камни

При приведении строки к числу платформа пытается интерпретировать содержимое как числовое значение. Строки вида «123», «0,5» обычно преобразуются корректно. Однако поведение зависит от формата: пробелы внутри числа, буквы, символы валют и другие посторонние символы приводят к тому, что результат становится 0 или значением NULL — в зависимости от СУБД и контекста запроса.

Особую опасность представляют «молчаливые» нули. Если часть строк в реквизите содержит нечисловой мусор (например, «н/д», дефисы, пустые значения), запрос выполнится без ошибок, но эти записи попадут в итог как нули. Суммы и средние значения при этом будут искажены, и заметить это по внешнему виду отчёта сложно.

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

ВЫРАЗИТЬ в условиях, соединениях и группировках

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

В соединениях таблиц ВЫРАЗИТЬ помогает, когда типы полей связи различаются: например, в одной таблице код хранится строкой, в другой — числом. Приведение обеих сторон к одному типу делает соединение корректным, но снова ценой потери индексации. Для разовых отчётов это приемлемо, для регламентных операций — повод пересмотреть структуру данных.

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

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

Типичные ошибки и как их избежать

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

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

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

Типичные ошибки
01
Указание ЧИСЛО без длины и точности — запрос не выполнится из-за синтаксической ошибки
02
Заниженная длина — большие значения отсекаются или вызывают переполнение без явного предупреждения
03
Приведение в условии ГДЕ на большой таблице — потеря индекса и резкое падение скорости
04
Отсутствие ЕСТЬNULL — NULL в данных превращает вычисления в NULL
05
Попытка привести ссылку или дату к числу — ошибка исполнения запроса

Проверка результата и контроль качества данных

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

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

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

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

Количество строк в выборке до и после приведения
Норма

Количество не изменилось, значения соответствуют исходным

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

Часть строк дала 0 или NULL при заполненном исходном поле

Итоговые суммы по запросу
Норма

Сходятся с данными документов до копейки

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

Расхождения на округления или целые суммы

Скорость выполнения
Норма

Запрос отрабатывает за приемлемое время на рабочей базе

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

Резкое замедление из-за ВЫРАЗИТЬ в условии или соединении

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

Чем ВЫРАЗИТЬ КАК ЧИСЛО отличается от функции Число()?

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

Что будет, если строка содержит буквы, а не цифры?

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

Можно ли применять ВЫРАЗИТЬ КАК ЧИСЛО в запросах СКД?

Да, конструкция полностью поддерживается в наборе данных типа «Запрос» схемы компоновки данных. Ограничение то же, что и в обычных запросах: приведение в условиях и соединениях может замедлить отчёт на больших объёмах данных.

Почему после приведения итоги не сходятся на копейки?

Чаще всего причина в точности: вы указали меньше знаков после запятой, чем реально хранится в данных, и дробная часть округлилась. Сверьте точность с квалификаторами числовых реквизитов источника и увеличьте её до фактической разрядности данных.

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

Используйте функцию Число(Строка). Она вызовет исключение, если строка не является числом, поэтому безопаснее обернуть вызов в Попытка/Исключение или предварительно проверить содержимое строки.

Работает ли ВЫРАЗИТЬ КАК ЧИСЛО для полей составного типа?

Да, это один из основных сценариев. Приведение оставляет только числовую составляющую составного типа; значения других типов в том же поле дадут NULL. Для корректных вычислений дополнительно оберните выражение в ЕСТЬNULL.

Итог

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

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