Система компоновки данных (СКД) в 1С:Предприятие — мощный инструмент для создания гибких отчетов, но работа с типами данных в ней требует особого внимания. Одна из частых задач — преобразование строк, дат или логических значений в числовой формат. Например, когда данные поступают из внешних источников в текстовом виде, а для расчетов нужны именно числа. Или когда требуется привести результат выражения к типу Число для корректной сортировки или агрегации.

В этой статье разберем все способы преобразования в число в СКД: от стандартной функции ЧИСЛО() до универсального оператора ВЫРАЗИТЬ(), а также нюансы работы с типами Число(10,2), Число(15,0) и другими. Особое внимание уделим типичным ошибкам, которые приводят к пустым результатам или неверным расчетам. Материал будет полезен как начинающим разработчикам, так и опытным специалистам, столкнувшимся с неочевидными случаями приведения типов.

Базовые функции для преобразования в число

В СКД есть две ключевые функции для работы с числовыми преобразованиями:

  • 📌 ЧИСЛО(Значение) — преобразует строку или выражение в число с плавающей точкой (аналог Float в других языках). Автоматически игнорирует пробелы и разделители тысяч, но чувствительна к десятичному разделителю (по умолчанию — точка).
  • 📌 ВЫРАЗИТЬ(Значение КАК Число(Точность, Масштаб)) — универсальный оператор приведения типов, позволяющий явно указать формат числа (например, Число(10,2) для валютных значений).

Пример использования ЧИСЛО() в вычисляемом поле отчета:

ЧИСЛО(СтрокаТаблицы.СуммаПродаж) * 1.2

А это пример с ВЫРАЗИТЬ(), где явно задается формат числа с двумя знаками после запятой:

ВЫРАЗИТЬ(СтрокаТаблицы.Цена КАК Число(10,2)) + НДС
💡

Если в строке содержатся посторонние символы (например, "1 234,56 руб."), предварительно очистите её функцией СОКРЛП() или регулярным выражением в поле ресурса отчета.

Преобразование строк в число: нюансы и ловушки

Самая распространенная ошибка при преобразовании строк — несоответствие десятичного разделителя. По умолчанию ожидает точку ("123.45"), но в российской локализации часто используют запятую ("123,45"). Если не учесть это, функция ЧИСЛО() вернет NULL.

Решения:

  • 🔄 Замените разделитель перед преобразованием: ЧИСЛО(СТРЗАМЕНИТ(Строка; ","; "."))
  • 🌍 Настройте локаль отчета в параметрах СКД (вкладка "Дополнительно") или используйте функцию УСТАНОВИТЬЛОКАЛЬ().
  • 📏 Для валютных значений с фиксированным форматом используйте ВЫРАЗИТЬ(... КАК Число(10,2)) — это гарантирует корректное округление.

Другой подводный камень — пустые строки или нечисловые значения (например, "N/A"). В этом случае функции преобразования вернут NULL, что может исказить итоги отчета. Чтобы избежать этого, добавьте проверку:

ЕСЛИ НЕ ЗначениеПустое(СтрокаТаблицы.Поле) ТОГДА

ЧИСЛО(СтрокаТаблицы.Поле)

ИНАЧЕ

0

КОНЕЦЕСЛИ

Что делать если строка содержит текст и цифры?

Если в строке смешаны буквы и цифры (например, "Артикул 12345"), используйте регулярные выражения для извлечения числовой части:

ЧИСЛО(РЕГВЫРАЗ(Строка; "\d+"))

или для чисел с десятичным разделителем:

ЧИСЛО(РЕГВЫРАЗ(Строка; "\d+[.,]?\d*"))

Работа с датами и логическими значениями

Иногда требуется преобразовать дату или булево значение (Истина/Ложь) в число. Например, для расчета количества дней между датами или для использования логического флага в арифметических выражениях.

Исходный типФункция преобразованияПример результата
ДатаЧИСЛО(Дата) или ДатаКАКЧислоСекунд()44562 (количество дней с 01.01.1900)
БулевоЕСЛИ Значение ТОГДА 1 ИНАЧЕ 01 для Истина, 0 для Ложь
NULLЕСЛИ ЗначениеПустое(Значение) ТОГДА 00

Для работы с датами полезны также функции:

  • 📅 ДЕНЬ(Дата), МЕСЯЦ(Дата), ГОД(Дата) — извлекают компоненты даты как числа.
  • РАЗНОСТЬДАТ(Дата1, Дата2, "ДЕНЬ") — возвращает разницу в днях (число).
📊 Какой тип преобразований вам приходится использовать чаще?
Строки в числа
Даты в числа
Логические значения в числа
Другое

Типы чисел в СКД: точность и масштаб

В числовые типы определяются двумя параметрами: точностью (общее количество знаков) и масштабом (количество знаков после запятой). Например:

  • Число(10,2) — числа от -99999999.99 до 99999999.99 (типично для валют).
  • Число(15,0) — целые числа до 999 триллионов (для счетчиков или идентификаторов).
  • Число(5,3) — числа до 99.999 (например, проценты с тремя знаками).

При преобразовании через ВЫРАЗИТЬ() обязательно указывайте корректные параметры, иначе возможны ошибки округления или переполнения. Например:

ВЫРАЗИТЬ(1234.567 КАК Число(10,2))  // Результат: 1234.57 (округление!)
💡

Если не указать масштаб явно, СКД использует тип Число(15,3) по умолчанию, что может привести к неожиданным округлениям в финансовых расчетах.

Для работы с большими числами (например, в научных расчетах) используйте тип Число(30,10), но помните, что это может замедлить выполнение отчета при больших объемах данных.

Практические примеры для отчетов

Рассмотрим типовые задачи, где требуется преобразование в число:

  1. Расчет скидки в процентах:
    ВЫРАЗИТЬ(СтрокаТаблицы.СуммаСкидки / СтрокаТаблицы.СуммаДокумента * 100 КАК Число(5,2))

    Здесь важно привести результат к типу с двумя знаками после запятой, чтобы избежать отображения лишних нулей (например, 15.0000 вместо 15.00).

  2. Преобразование строкового кода в числовой идентификатор:
    ЧИСЛО(ЛЕВ(СтрокаТаблицы.Артикул, 6))

    Полезно, если коды начинаются с цифр, но содержат буквенные суффиксы (например, "123456-A").

  3. Агрегация текстовых полей:
    СУММА(ЧИСЛО(СтрокаТаблицы.ТекстовоеПоле))

    Если поле хранится как строка, но содержит числа, без преобразования СУММА() не сработает.

Убедитесь что строка не пустая|Проверьте десятичный разделитель|Учтите возможные нечисловые символы|Определите требуемую точность и масштаб-->

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

Даже опытные разработчики сталкиваются с неочевидными проблемами при преобразовании типов. Вот наиболее частые:

⚠️ Внимание: Если в строке содержатся невидимые символы (например, неразрывный пробел  ), функция ЧИСЛО() вернет NULL. Используйте СОКРЛП() для очистки:

ЧИСЛО(СОКРЛП(СтрокаТаблицы.Поле))

Другая распространенная ошибка — попытка преобразовать значение, уже являющееся числом, но с другим масштабом. Например:

ЧИСЛО(ВЫРАЗИТЬ(123.456 КАК Число(10,2)))  // Результат: 123.45, но тип остается Число(10,2)

Здесь ЧИСЛО() не меняет масштаб — для этого нужно явно указать новый тип:

ВЫРАЗИТЬ(123.456 КАК Число(10,3))

Еще один подводный камень — локальные настройки пользователя. Если в настройках установлен немецкий язык, где разделителем является запятая, а в данных используется точка, преобразование завершится ошибкой. Решение:

  • 🔧 Явно замените разделитель перед преобразованием.
  • 🌐 Используйте УСТАНОВИТЬЛОКАЛЬ("ru_RU") в начале выражения.

Оптимизация производительности

Преобразование типов в больших отчетах может замедлить выполнение. Следующие рекомендации помогут оптимизировать работу:

  • Избегайте повторных преобразований: если поле используется в нескольких выражениях, преобразуйте его один раз в ресурсе отчета.
  • 📊 Используйте индексированные поля: если преобразование применяется к полю базы данных, добавьте его в индексы запроса.
  • 🔄 Кэшируйте результаты: для сложных выражений используйте временные таблицы или параметры отчета.

Пример оптимизированного запроса в СКД:

ВЫБРАТЬ

ЧИСЛО(Товары.Цена) КАК ЦенаЧисло, // Преобразуем один раз

Товары.Наименование

ИЗ

Документ.ПоступлениеТоваров КАК Товары

Если отчет выполняется слишком долго, проверьте план выполнения запроса в Консоли запросов — возможно, преобразование типов происходит на этапе выборки данных, а не в СКД.

💡

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

FAQ: Частые вопросы по преобразованию в число

Как преобразовать строку с валютой (например, "$1 234.56") в число?

Используйте комбинацию функций для очистки и замены символов:

ЧИСЛО(СТРЗАМЕНИТ(СТРЗАМЕНИТ(СОКРЛП(Строка); "$"; ""); " "; ""))

Для евро или других валют замените "$" на нужный символ.

Почему функция ЧИСЛО() возвращает NULL для строки "1,234.56"?

Скорее всего, проблема в несоответствии разделителей тысяч и десятичного разделителя. Удалите разделители тысяч и унифицируйте десятичный разделитель:

ЧИСЛО(СТРЗАМЕНИТ(СТРЗАМЕНИТ(Строка; " "; ""); ","; "."))
Можно ли преобразовать массив или таблицу значений в числа?

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

Как привести число к строке с фиксированным количеством знаков?

Используйте функцию ФОРМАТ():

ФОРМАТ(Число; "ЧДЦ=2; ЧРД=; ЧГ=0")  // Формат: две цифры после запятой, без разделителей тысяч
Чем отличается ЧИСЛО() от ВЫРАЗИТЬ(... КАК Число)?

ЧИСЛО() всегда возвращает число с плавающей точкой без явного контроля точности и масштаба. ВЫРАЗИТЬ() позволяет задать конкретный тип (например, Число(10,2)), что важно для финансовых расчетов или работы с целыми числами.