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