Система компоновки данных (СКД) в 1С:Предприятие — мощный инструмент для создания гибких отчетов, но работа с типами данных в ней требует особого внимания. Одна из частых задач — преобразование строк, дат или логических значений в числовой формат. Например, когда данные поступают из внешних источников в текстовом виде, а для расчетов нужны именно числа. Или когда требуется привести результат выражения к типу Число для корректной сортировки или агрегации.
В этой статье разберем все способы преобразования в число в СКД: от стандартной функции ЧИСЛО() до универсального оператора ВЫРАЗИТЬ(), а также нюансы работы с типами Число(10,2), Число(15,0) и другими. Особое внимание уделим типичным ошибкам, которые приводят к пустым результатам или неверным расчетам. Материал будет полезен как начинающим разработчикам, так и опытным специалистам, столкнувшимся с неочевидными случаями приведения типов.
Базовые функции для преобразования в число
В СКД есть две ключевые функции для работы с числовыми преобразованиями:
- 📌
ЧИСЛО(Значение)— преобразует строку или выражение в число с плавающей точкой (аналог Float в других языках). Автоматически игнорирует пробелы и разделители тысяч, но чувствительна к десятичному разделителю (по умолчанию — точка). - 📌
ВЫРАЗИТЬ(Значение КАК Число(Точность, Масштаб))— универсальный оператор приведения типов, позволяющий явно указать формат числа (например,Число(10,2)для валютных значений).
Пример использования ЧИСЛО() в вычисляемом поле отчета:
ЧИСЛО(СтрокаТаблицы.СуммаПродаж) * 1.2
А это пример с ВЫРАЗИТЬ(), где явно задается формат числа с двумя знаками после запятой:
ВЫРАЗИТЬ(СтрокаТаблицы.Цена КАК Число(10,2)) + НДС
Если в строке содержатся посторонние символы (например, "1 234,56 руб."), предварительно очистите её функцией СОКРЛП() или регулярным выражением в поле ресурса отчета.
Преобразование строк в число: нюансы и ловушки
Самая распространенная ошибка при преобразовании строк — несоответствие десятичного разделителя. По умолчанию 1С ожидает точку ("123.45"), но в российской локализации часто используют запятую ("123,45"). Если не учесть это, функция ЧИСЛО() вернет NULL.
Решения:
- 🔄 Замените разделитель перед преобразованием:
ЧИСЛО(СТРЗАМЕНИТ(Строка; ","; ".")) - 🌍 Настройте локаль отчета в параметрах СКД (вкладка "Дополнительно") или используйте функцию
УСТАНОВИТЬЛОКАЛЬ(). - 📏 Для валютных значений с фиксированным форматом используйте
ВЫРАЗИТЬ(... КАК Число(10,2))— это гарантирует корректное округление.
Другой подводный камень — пустые строки или нечисловые значения (например, "N/A"). В этом случае функции преобразования вернут NULL, что может исказить итоги отчета. Чтобы избежать этого, добавьте проверку:
ЕСЛИ НЕ ЗначениеПустое(СтрокаТаблицы.Поле) ТОГДА
ЧИСЛО(СтрокаТаблицы.Поле)
ИНАЧЕ
0
КОНЕЦЕСЛИ
Что делать если строка содержит текст и цифры?
Если в строке смешаны буквы и цифры (например, "Артикул 12345"), используйте регулярные выражения для извлечения числовой части:
ЧИСЛО(РЕГВЫРАЗ(Строка; "\d+"))
или для чисел с десятичным разделителем:
ЧИСЛО(РЕГВЫРАЗ(Строка; "\d+[.,]?\d*"))
Работа с датами и логическими значениями
Иногда требуется преобразовать дату или булево значение (Истина/Ложь) в число. Например, для расчета количества дней между датами или для использования логического флага в арифметических выражениях.
| Исходный тип | Функция преобразования | Пример результата |
|---|---|---|
| Дата | ЧИСЛО(Дата) или ДатаКАКЧислоСекунд() | 44562 (количество дней с 01.01.1900) |
| Булево | ЕСЛИ Значение ТОГДА 1 ИНАЧЕ 0 | 1 для Истина, 0 для Ложь |
| NULL | ЕСЛИ ЗначениеПустое(Значение) ТОГДА 0 | 0 |
Для работы с датами полезны также функции:
- 📅
ДЕНЬ(Дата),МЕСЯЦ(Дата),ГОД(Дата)— извлекают компоненты даты как числа. - ⏳
РАЗНОСТЬДАТ(Дата1, Дата2, "ДЕНЬ")— возвращает разницу в днях (число).
Типы чисел в СКД: точность и масштаб
В 1С числовые типы определяются двумя параметрами: точностью (общее количество знаков) и масштабом (количество знаков после запятой). Например:
Число(10,2)— числа от -99999999.99 до 99999999.99 (типично для валют).Число(15,0)— целые числа до 999 триллионов (для счетчиков или идентификаторов).Число(5,3)— числа до 99.999 (например, проценты с тремя знаками).
При преобразовании через ВЫРАЗИТЬ() обязательно указывайте корректные параметры, иначе возможны ошибки округления или переполнения. Например:
ВЫРАЗИТЬ(1234.567 КАК Число(10,2)) // Результат: 1234.57 (округление!)
Если не указать масштаб явно, СКД использует тип Число(15,3) по умолчанию, что может привести к неожиданным округлениям в финансовых расчетах.
Для работы с большими числами (например, в научных расчетах) используйте тип Число(30,10), но помните, что это может замедлить выполнение отчета при больших объемах данных.
Практические примеры для отчетов
Рассмотрим типовые задачи, где требуется преобразование в число:
- Расчет скидки в процентах:
ВЫРАЗИТЬ(СтрокаТаблицы.СуммаСкидки / СтрокаТаблицы.СуммаДокумента * 100 КАК Число(5,2))Здесь важно привести результат к типу с двумя знаками после запятой, чтобы избежать отображения лишних нулей (например,
15.0000вместо15.00). - Преобразование строкового кода в числовой идентификатор:
ЧИСЛО(ЛЕВ(СтрокаТаблицы.Артикул, 6))Полезно, если коды начинаются с цифр, но содержат буквенные суффиксы (например, "
123456-A"). - Агрегация текстовых полей:
СУММА(ЧИСЛО(СтрокаТаблицы.ТекстовоеПоле))Если поле хранится как строка, но содержит числа, без преобразования
СУММА()не сработает.
Убедитесь что строка не пустая|Проверьте десятичный разделитель|Учтите возможные нечисловые символы|Определите требуемую точность и масштаб-->
Типичные ошибки и их решения
Даже опытные разработчики сталкиваются с неочевидными проблемами при преобразовании типов. Вот наиболее частые:
⚠️ Внимание: Если в строке содержатся невидимые символы (например, неразрывный пробел), функцияЧИСЛО()вернетNULL. ИспользуйтеСОКРЛП()для очистки:ЧИСЛО(СОКРЛП(СтрокаТаблицы.Поле))Другая распространенная ошибка — попытка преобразовать значение, уже являющееся числом, но с другим масштабом. Например:
ЧИСЛО(ВЫРАЗИТЬ(123.456 КАК Число(10,2))) // Результат: 123.45, но тип остается Число(10,2)Здесь
ЧИСЛО()не меняет масштаб — для этого нужно явно указать новый тип:ВЫРАЗИТЬ(123.456 КАК Число(10,3))Еще один подводный камень — локальные настройки пользователя. Если в настройках 1С установлен немецкий язык, где разделителем является запятая, а в данных используется точка, преобразование завершится ошибкой. Решение:
- 🔧 Явно замените разделитель перед преобразованием.
- 🌐 Используйте
УСТАНОВИТЬЛОКАЛЬ("ru_RU")в начале выражения.Оптимизация производительности
Преобразование типов в больших отчетах может замедлить выполнение. Следующие рекомендации помогут оптимизировать работу:
- ⚡ Избегайте повторных преобразований: если поле используется в нескольких выражениях, преобразуйте его один раз в ресурсе отчета.
- 📊 Используйте индексированные поля: если преобразование применяется к полю базы данных, добавьте его в индексы запроса.
- 🔄 Кэшируйте результаты: для сложных выражений используйте временные таблицы или параметры отчета.
Пример оптимизированного запроса в СКД:
ВЫБРАТЬЧИСЛО(Товары.Цена) КАК ЦенаЧисло, // Преобразуем один раз
Товары.Наименование
ИЗ
Документ.ПоступлениеТоваров КАК Товары
Если отчет выполняется слишком долго, проверьте план выполнения запроса в Консоли запросов — возможно, преобразование типов происходит на этапе выборки данных, а не в СКД.
Для отчетов с миллионами строк избегайте преобразований в вычисляемых полях — перенесите их в запрос или используйте материализованные представления.
FAQ: Частые вопросы по преобразованию в число
Как преобразовать строку с валютой (например, "$1 234.56") в число?
Используйте комбинацию функций для очистки и замены символов:
ЧИСЛО(СТРЗАМЕНИТ(СТРЗАМЕНИТ(СОКРЛП(Строка); "$"; ""); " "; ""))Для евро или других валют замените "
$" на нужный символ.Почему функция ЧИСЛО() возвращает NULL для строки "1,234.56"?
Скорее всего, проблема в несоответствии разделителей тысяч и десятичного разделителя. Удалите разделители тысяч и унифицируйте десятичный разделитель:
ЧИСЛО(СТРЗАМЕНИТ(СТРЗАМЕНИТ(Строка; " "; ""); ","; "."))Можно ли преобразовать массив или таблицу значений в числа?
Нет, функции
ЧИСЛО()иВЫРАЗИТЬ()работают только со скалярными значениями. Для обработки массивов используйте цикл в модуле отчета или функциюЗНАЧЕНИЕВМАССИВ()с последующим преобразованием каждого элемента.Как привести число к строке с фиксированным количеством знаков?
Используйте функцию
ФОРМАТ():ФОРМАТ(Число; "ЧДЦ=2; ЧРД=; ЧГ=0") // Формат: две цифры после запятой, без разделителей тысячЧем отличается ЧИСЛО() от ВЫРАЗИТЬ(... КАК Число)?
ЧИСЛО()всегда возвращает число с плавающей точкой без явного контроля точности и масштаба.ВЫРАЗИТЬ()позволяет задать конкретный тип (например,Число(10,2)), что важно для финансовых расчетов или работы с целыми числами.