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

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

Как в 1С выразить значение как число

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

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

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

Когда требуется приведение к числу

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

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

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

Функция Число() во встроенном языке

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

ЗначениеСтрокой = "1234,56";

Результат = Число(ЗначениеСтрокой); // 1234.56

ИзДаты = Число(Дата(2026, 1, 1)); // число секунд от начала эпохи

ИзБулево = Число(Истина); // 1

Если строка не может быть преобразована — содержит буквы, лишние пробелы внутри числа или посторонние символы — платформа вызывает ошибку «Преобразование значения к типу Число не может быть выполнено». Поэтому перед вызовом строку стоит очистить: убрать пробелы функцией СокрЛП(), заменить неразрывные пробелы (часто встречаются в данных из Excel и 1С-отчётов) через СтрЗаменить(Строка, Символ(160), "").

Безопасное преобразование с обработкой ошибок

Для массовой загрузки удобно обернуть преобразование в функцию с обработчиком исключений, возвращающую либо число, либо признак неудачи:

Функция СтрокаВЧисло(Строка)

Очищенная = СтрЗаменить(СокрЛП(Строка), Символ(160), "");

Попытка

Возврат Число(Очищенная);

Исключение

Возврат Неопределено;

КонецПопытки;

КонецФункции

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

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

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

ВЫБРАТЬ

ВЫРАЗИТЬ(ЗначенияСвойств.Значение КАК ЧИСЛО(15, 2)) КАК ЧисловоеЗначение

ИЗ

РегистрСведений.ЗначенияСвойств КАК ЗначенияСвойств

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

Приведение для сортировки и соединений

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

Работа с ОписаниеТипов и приведение значений реквизитов

Объект ОписаниеТипов применяется, когда нужно программно ограничить тип реквизита формы, колонки таблицы значений или параметра. Метод ПривестиЗначение(Значение) выполняет приведение по правилам описания:

ОписаниеЧисла = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2));

Результат = ОписаниеЧисла.ПривестиЗначение("123,456"); // 123.46 с округлением

В отличие от функции Число(), приведение через описание типов учитывает квалификаторы: лишние знаки дробной части округляются, а пустая строка превращается в 0, а не в ошибку. Это удобно при заполнении таблиц значений: колонка с числовым описанием типов сама приводит добавляемые значения.

Сравнение вариантов приведения

Число(Значение)

Код встроенного языка, разовое преобразование строки или даты. Некорректная строка вызывает ошибку — нужна обработка исключений.

ВЫРАЗИТЬ КАК ЧИСЛО

Язык запросов, сужение составного типа и приведение строк. Неприводимые значения дают NULL, что нужно учитывать в расчётах.

ОписаниеТипов.ПривестиЗначение()

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

Типичные ошибки и их признаки

Самая распространённая ошибка — сравнение строки с числом без приведения. Условие Если КодТовара = 5 Тогда, где КодТовара — строка "5", вернёт Ложь, потому что типы различаются. Подобные дефекты трудно отловить: код не падает, а просто молча не находит данные.

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

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

Типичные ошибки
01
Сравнение строки с числом без приведения — условие молча не срабатывает, данные теряются из выборки
02
Число() для строки с неразрывным пробелом из Excel — ошибка преобразования, прерывающая загрузку
03
ВЫРАЗИТЬ без ЕСТЬNULL в суммировании — NULL-значения искажают итоги или дают NULL в результате
04
Недостаточная точность в ЧИСЛО(15,2) для количеств — округление тысячных долей и расхождение остатков

Проверка результата преобразования

После приведения полезно убедиться, что тип и значение соответствуют ожиданиям. В коде тип проверяют функцией ТипЗнч(Значение) в сочетании с Тип("Число"). Для контроля массовых операций выборочно выводят несколько преобразованных значений в журнал или табличный документ.

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

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

Тип значения после преобразования
Норма

ТипЗнч возвращает Число

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

Осталась Строка или Неопределено

Дробная часть суммы
Норма

Копейки совпадают с исходными данными

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

Значение округлено или обрезано

Результат ВЫРАЗИТЬ в запросе
Норма

Числовые значения на месте, NULL только там, где исходно не число

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

NULL в строках, где должны быть суммы

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

Что вернёт Число("") — пустую строку?

Вызов Число("") вернёт 0, однако строка из одних пробелов или с нечисловыми символами вызовет ошибку преобразования. Поэтому перед преобразованием строку принято очищать функцией СокрЛП и проверять на пустоту.

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

Это разные операторы. ВЫРАЗИТЬ меняет тип поля (сужает составной тип или приводит строку к числу), а ЕСТЬNULL заменяет значение NULL указанным значением. На практике их комбинируют: сначала приводят тип, затем подставляют 0 вместо NULL.

Почему после ВЫРАЗИТЬ КАК ЧИСЛО в запросе появились NULL?

NULL означает, что исходное значение нельзя привести к числу: там строка с буквами, ссылка или другой тип из составного поля. Отфильтруйте такие записи условием ЕСТЬ НЕ NULL и проверьте, что реально хранится в поле.

Как преобразовать число обратно в строку без лишних символов?

Используйте функцию Формат(Число, "ЧГ=0") — параметр ЧГ=0 отключает разделение групп разрядов, иначе в строку попадут неразрывные пробелы. Для фиксированного числа знаков после запятой добавьте параметр ЧДЦ.

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

Да, Число(Дата) возвращает количество секунд, прошедших от начала эпохи. Это используют для вычисления разницы между датами в секундах или для компактного хранения меток времени при обмене с внешними системами.

Что делать, если в файле числа с точкой, а в 1С ожидается запятая?

Перед вызовом Число() замените разделитель: СтрЗаменить(Строка, ".", ","). Одновременно удалите разделители тысяч и неразрывные пробелы. Универсальная функция нормализации строки перед преобразованием избавляет от большинства ошибок загрузки.

Итог

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

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