Разработка и Конфигурация · 11 мин
Как в 1С выразить значение как число 15,2
Как использовать ВЫРАЗИТЬ(... КАК ЧИСЛО(15,2)) в запросах 1С: синтаксис, приведение строк к числу, округление, работа с составными типами и типичные ошибки.
В языке запросов 1С оператор ВЫРАЗИТЬ(... КАК ЧИСЛО(15,2)) приводит значение поля к числовому типу с заданной точностью: 15 разрядов всего, из них 2 — в дробной части. Это одна из самых востребованных конструкций при работе с составными типами, строковыми представлениями чисел и при подготовке данных для соединений таблиц.
Конструкция особенно полезна в трёх ситуациях: когда реквизит имеет составной тип и его нужно «сузить» до числа; когда число хранится в строковом поле и требуется выполнить сортировку или агрегацию; когда нужно убрать лишние знаки после запятой, чтобы корректно сработало соединение или группировка. Без явного приведения типов запрос может вернуть NULL, ошибку или неожиданный порядок сортировки.
Важно понимать: ВЫРАЗИТЬ не преобразует данные физически — оно работает только в рамках конкретного запроса и не меняет тип реквизита в конфигурации. Если требуется хранить значение как число постоянно, менять нужно метаданные, а не запрос.
Синтаксис оператора ВЫРАЗИТЬ для числового типа
Общая форма записи выглядит так: ВЫРАЗИТЬ(Выражение КАК ЧИСЛО(Длина, Точность)). Первый параметр типа — общее количество разрядов (включая разряды дробной части), второй — количество разрядов после запятой. Для ЧИСЛО(15,2) это означает максимум 13 разрядов в целой части и 2 в дробной.
Пример простого запроса:
ВЫБРАТЬ
ВЫРАЗИТЬ(Товары.КоличествоСтрокой КАК ЧИСЛО(15, 2)) КАК Количество
ИЗ
Документ.ПоступлениеТоваров.Товары КАК Товары
Длина и точность должны быть положительными числами, причём длина не может быть меньше точности. Если указать ЧИСЛО(2,5), запрос не выполнится — конструктор запроса и синтакс-помощник отследят такую ошибку ещё на этапе написания. Максимально допустимая длина числа в запросах ограничена возможностями платформы, поэтому для большинства учётных задач разумно использовать значения в диапазоне 10–15 разрядов.
Приведение строки к числу
Типовой сценарий — число хранится в строковом реквизите. Например, артикул, код или количество загружены из внешнего файла в поле типа Строка. Чтобы выполнить сортировку по числовому значению или посчитать сумму, строку нужно выразить как число:
ВЫБРАТЬ
ВЫРАЗИТЬ(Данные.ЗначениеСтрокой КАК ЧИСЛО(15, 2)) КАК Сумма
ИЗ
РегистрСведений.ЗагруженныеДанные КАК Данные
УПОРЯДОЧИТЬ ПО
Сумма УБЫВ
Здесь кроется главный подводный камень: если строка содержит нечисловые символы (буквы, пробелы в неожиданных местах, неразрывные пробелы из Excel, символ валюты), результатом приведения будет NULL, а не ошибка. Запрос выполнится «успешно», но часть данных молча потеряется из выборки или агрегатов. Поэтому перед массовым приведением стоит проверить исходные строки на «мусор».
Разделитель дробной части в строке должен соответствовать ожиданиям платформы — точка. Строка «123,45» с запятой в ряде случаев не будет корректно распознана. Если данные приходят с запятой, надёжнее предварительно обработать их встроенными функциями строк или на этапе загрузки, а не надеяться на автоматическое преобразование.
Работа с составными типами реквизитов
Когда реквизит объявлен составным, например «Число или Строка», запрос не всегда может корректно выполнять над ним арифметику, соединения и сравнения. Приведение к конкретному типу решает эту задачу и, что немаловажно, может ускорить выполнение запроса: СУБД получает однозначный тип вместо проверки всех вариантов составного типа.
Практическое правило: значения, не подходящие под целевой тип, при приведении составного поля отбрасываются в NULL. Если реквизит составного типа «СправочникСсылка.Номенклатура или Число» и вы приводите его к ЧИСЛО(15,2), все ссылочные значения станут NULL. Это нужно учитывать при построении условий ГДЕ — отбор по приведённому полю автоматически отфильтрует записи других типов.
Округление и отсечение дробной части
При приведении числа с большей точностью к ЧИСЛО(15,2) дробная часть округляется до двух знаков по правилам округления платформы. Значение 10,456 станет 10,46, а 10,454 — 10,45. Это удобно для подготовки сумм к отображению, но опасно для промежуточных расчётов: округление на каждом шаге накапливает погрешность.
Если задача — сравнить суммы, рассчитанные разными способами, приведение обеих к ЧИСЛО(15,2) перед сравнением устраняет расхождения в «хвостах» за пределами копеек. Это рабочий приём при сверке данных между регистрами, где итоги могут отличаться на тысячные доли из-за порядка вычислений.
Для целых чисел используйте ЧИСЛО(15,0) — это явно показывает намерение убрать дробную часть и делает запрос читабельнее. Не злоупотребляйте завышенной длиной «про запас»: чрезмерная разрядность увеличивает объём обрабатываемых данных и не даёт практического выигрыша.
Сравнение вариантов
Подходит для денежных сумм и количеств с двумя знаками после запятой. Стандартный выбор для учётных задач.
Для целых величин: штуки, коды, счётчики. Дробная часть отбрасывается округлением.
Для веса, объёма и других величин, где нужны три знака. Ограниченная целая часть — следите за переполнением.
Использование в соединениях и группировках
Одна из частых причин «не сходящихся» соединений — разные типы или разная точность полей в соединяемых таблицах. Если в одной таблице количество хранится как ЧИСЛО(15,3), а в другой как ЧИСЛО(15,2), соединение по равенству может не находить совпадения из-за третьего знака. Приведение обеих сторон к одному типу решает проблему:
ВЫБРАТЬ
Продажи.Номенклатура,
СУММА(ВЫРАЗИТЬ(Продажи.Количество КАК ЧИСЛО(15, 2))) КАК Количество
ИЗ
РегистрНакопления.Продажи.Обороты КАК Продажи
СГРУППИРОВАТЬ ПО
Продажи.Номенклатура
При группировке по приведённому выражению помните: группировка выполняется по уже округлённому значению. Два исходных значения 5,001 и 5,004 после приведения к ЧИСЛО(15,2) попадут в одну группу 5,00. Если такая детализация критична, группируйте по исходному полю, а приведение применяйте к агрегату.
- 1Определите исходный тип поля: число, строка или составной тип — от этого зависит поведение приведения
- 2Проверьте строковые данные на нечисловые символы, пробелы и запятые вместо точек
- 3Напишите выражение ВЫРАЗИТЬ(Поле КАК ЧИСЛО(15, 2)) в секции ВЫБРАТЬ
- 4Выполните запрос и сравните количество NULL-значений с ожиданием
- 5Проверьте округление на контрольном примере с тремя и более знаками после запятой
Типичные ошибки и их последствия
Самая распространённая ошибка — ожидание ошибки там, где платформа возвращает NULL. Разработчик приводит строку к числу, запрос выполняется без сообщений об ошибках, а отчёт показывает заниженные итоги, потому что часть значений не преобразовалась. Всегда проверяйте результат на NULL после приведения нечисловых данных.
Вторая ошибка — потеря точности при промежуточных вычислениях. Если в формуле расчёта цены или себестоимости каждый шаг приводится к ЧИСЛО(15,2), накопленная погрешность округления может дать расхождение в итоговой сумме документа. Правильный подход: считать с максимальной точностью, а приводить к двум знакам только финальный результат.
Третья группа ошибок связана с переполнением: приведение большого числа к типу с недостаточной целой частью. Если значение не помещается в заданную разрядность, поведение зависит от СУБД — возможна ошибка выполнения запроса. Для крупных сумм убедитесь, что 13 разрядов целой части достаточно с учётом валюты и масштаба учёта.
Проверка результата приведения
После написания запроса полезно выполнить контрольную проверку: вывести рядом исходное значение и приведённое, а также признак успешности преобразования. Это быстро покажет, какие записи «выпали» в NULL и почему.
ВЫБРАТЬ
Данные.ЗначениеСтрокой КАК Исходное,
ВЫРАЗИТЬ(Данные.ЗначениеСтрокой КАК ЧИСЛО(15, 2)) КАК Приведенное,
ВЫБОР
КОГДА ВЫРАЗИТЬ(Данные.ЗначениеСтрокой КАК ЧИСЛО(15, 2)) ЕСТЬ NULL
ТОГДА "Не преобразовано"
ИНАЧЕ "Ок"
КОНЕЦ КАК Статус
ИЗ
РегистрСведений.ЗагруженныеДанные КАК Данные
Для числовых полей проверка сводится к контролю округления: возьмите несколько значений с тремя-четырьмя знаками после запятой и убедитесь, что результат соответствует ожидаемому округлению до двух знаков. Это особенно важно, если запрос используется в регламентных расчётах или обменах данными.
Как проверить результат
NULL только там, где исходное значение пустое или заведомо нечисловое
NULL появляются у строк, которые выглядят как числа — ищите пробелы, запятые, лишние символы
Третий знак 5 и выше округляет второй знак вверх
Результат отличается от ожидаемого — проверьте, не применяется ли двойное приведение
Сумма по приведённым значениям совпадает с контрольным расчётом в пределах копеек
Расхождение растёт с объёмом данных — округление применяется на промежуточных шагах
Что важно запомнить
ВЫРАЗИТЬ(Поле КАК ЧИСЛО(15,2)) приводит значение к числу с двумя знаками после запятой только в рамках запроса. Нечисловые строки превращаются в NULL без ошибки, дробная часть округляется, а приведение в условиях отбора может замедлить запрос. Проверяйте результат на NULL и округляйте только финальные значения.
Частые вопросы
Чем отличается ВЫРАЗИТЬ от изменения типа реквизита в конфигураторе?
ВЫРАЗИТЬ работает только внутри конкретного запроса и не меняет хранимые данные: после выполнения запроса реквизит остаётся прежнего типа. Изменение типа в конфигураторе меняет структуру базы данных и влияет на все механизмы работы с реквизитом, но требует обновления конфигурации и может затронуть существующие данные.
Что будет, если строка содержит запятую вместо точки?
Строка вида «123,45» может не преобразоваться корректно, и результатом станет NULL. Надёжнее заменить запятую на точку до приведения — например, при загрузке данных или функцией СтрЗаменить в коде перед помещением значения в запрос.
Можно ли использовать ВЫРАЗИТЬ в конструкторе запросов без ручного ввода?
Да. В конструкторе запросов в поле выражения можно написать ВЫРАЗИТЬ(Поле КАК ЧИСЛО(15,2)) вручную через кнопку редактирования произвольного выражения. Конструктор корректно распознаёт такую конструкцию и позволяет дальше работать с полем визуально.
Почему после приведения к ЧИСЛО(15,2) соединение таблиц всё равно не находит совпадения?
Приведение нужно применить к обеим сторонам соединения, а не к одной. Также проверьте, не отличаются ли сами значения: например, в одной таблице хранится код с ведущими нулями в строке, а в другой — число. В таком случае приводить нужно обе стороны к одному логическому представлению, а не только к одному типу.
Влияет ли приведение типа на скорость запроса?
В секции ВЫБРАТЬ влияние обычно незначительно. Заметное замедление возникает, когда приведение используется в условиях ГДЕ или соединениях на больших таблицах: СУБД не может применить индекс по исходному полю и вынуждена вычислять выражение для каждой строки.
Как привести число к строке или дате через ВЫРАЗИТЬ?
Аналогично: ВЫРАЗИТЬ(Поле КАК СТРОКА(50)) или ВЫРАЗИТЬ(Поле КАК ДАТА). Обратное преобразование числа в строку в языке запросов имеет ограничения — для сложного форматирования надёжнее использовать функции встроенного языка после получения результата запроса.