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