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

Отчеты и Аналитика · 10 мин

Вычисляемые поля в СКД 1С: как выразить значение как число

Как в СКД 1С создать вычисляемое поле и привести значение к числу через Выразить: синтаксис, примеры, типичные ошибки и проверка результата в отчёте.

Вычисляемые поля в системе компоновки данных (СКД) позволяют добавить в отчёт колонки, которых нет в исходном запросе: суммы с НДС, проценты, разницы показателей, округлённые значения. При этом одна из самых частых проблем — тип результата. Если в выражении участвуют строки, NULL или поля составного типа, итоговое значение может не сортироваться, не суммироваться в итогах или вовсе выводиться пустым.

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

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

Где в СКД создаются вычисляемые поля

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

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

После создания поле нужно добавить в выбранные поля настроек отчёта (закладка «Настройки»), иначе оно не появится в результате, даже если выражение написано верно.

Как добавить вычисляемое поле с приведением к числу
  1. 1
    Откройте схему компоновки данных и перейдите на закладку «Вычисляемые поля»
  2. 2
    Добавьте строку: укажите путь к данным, например СуммаЧислом
  3. 3
    В колонке «Выражение» введите Выразить(ИсходноеПоле, "Число(15,2)")
  4. 4
    Установите тип значения Число с той же длиной и точностью
  5. 5
    Добавьте поле в выбранные поля на закладке «Настройки» и сформируйте отчёт

Синтаксис функции Выразить для числа

В языке выражений СКД функция имеет вид:

Выразить(<Выражение>, "<Строка описания типа>")

Для приведения к числу второй параметр — строка с описанием типа, например:

Выразить(КоличествоСтрокой, "Число(10,2)")

Выразить(Сумма, "Число(15,2)")

Выразить(Выбор Когда Ставка = NULL Тогда 0 Иначе Ставка Конец, "Число(5,2)")

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

Когда приведение к числу действительно необходимо

Не каждое вычисляемое поле требует Выразить. Если в выражении участвуют только числовые поля одного типа, результат и так будет числом. Приведение становится обязательным в типичных ситуациях:

  • в выражении используется строковое поле, содержащее цифры (например, код или артикул, по которому нужен расчёт);
  • поле имеет составной тип (число и строка, число и NULL), и СКД не может определить единый тип результата;
  • в результате возможны значения NULL, которые ломают агрегацию в группировках и итогах;
  • нужно гарантировать точность и разрядность для корректного округления и форматирования.

Отдельный случай — работа с NULL. Арифметика с NULL в СКД даёт NULL, поэтому перед приведением значение обычно подменяют конструкцией Выбор или функцией ЕстьNULL(), если она доступна в используемой версии платформы:

Выразить(Выбор Когда Скидка = NULL Тогда 0 Иначе Скидка Конец, "Число(15,2)")
Маршрут решения

Как выбрать действие

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

Выразить в запросе или в вычисляемом поле: что выбрать

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

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

Вычисляемое поле уместно, когда исходное значение нужно в отчёте в исходном виде, а числовое представление — дополнительно; когда тип зависит от условий, удобных для записи на языке выражений СКД; или когда запрос менять нельзя (например, типовой отчёт, доработанный через расширение только на уровне настроек).

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

ВЫРАЗИТЬ в запросе

Быстрее, работает в соединениях и условиях; требует права редактировать запрос

Выразить в вычисляемом поле

Гибче для отчётной логики, не трогает запрос; считается на клиенте компоновки, медленнее на больших объёмах

Формат поля без приведения

Меняет только отображение, тип остаётся прежним — итоги и сортировка не исправятся

Типичные ошибки и их последствия

Большинство проблем с вычисляемыми полями возникает не из-за самой функции, а из-за несогласованности типов и разрядности. Разберём самые частые.

Первая ошибка — разрядность в функции и в свойстве «Тип значения» поля не совпадает. Например, в выражении указано Число(10,2), а в свойствах поля — Число(15,4). В результате округление происходит дважды и по-разному, итоги «не сходятся» с детальными записями.

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

Третья ошибка — забытый NULL. Если хотя бы одно слагаемое равно NULL, всё выражение даёт NULL, итог по группе занижается, а причина не видна на поверхности.

Типичные ошибки
01
Тип в Выразить и в свойстве «Тип значения» различаются — двойное округление и расхождение итогов
02
Приведение строки с нечисловыми символами — значения превращаются в нули без предупреждения
03
NULL в выражении не подменён — итоги по группам занижены, детальные строки пустые
04
Слишком маленькая длина числа — переполнение и потеря значащих цифр
05
Поле создано, но не добавлено в выбранные поля настроек — в отчёте его просто нет

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

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

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

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

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

Сортировка по колонке
Норма

Значения упорядочиваются по величине: 2, 10, 100

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

Порядок строковый: 10, 100, 2 — тип не числовой

Итог по группировке
Норма

Итог равен сумме детальных строк

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

Итог пустой или меньше суммы строк — вероятны NULL

Записи с пустым исходным полем
Норма

Показывают 0 или осмысленное значение

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

Пусто или 0 там, где должно быть число

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

Количество знаков соответствует заданной точности

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

Лишние или обрезанные знаки — разрядности не совпадают

Ограничения и границы применения

Функция Выразить в вычисляемых полях СКД поддерживает приведение к примитивным типам (число, строка, дата, булево) и к ссылочным типам. Но она не выполняет преобразование данных как таковое: строка «12,5» с запятой в зависимости от региональных настроек может не распознаться как число, а строка «двенадцать» — тем более. Функция приводит тип, а не парсит содержимое.

Ещё одно ограничение — производительность. Вычисляемые поля рассчитываются для каждой строки результата на этапе компоновки. На больших выборках (сотни тысяч записей) сложные выражения с условиями и приведениями заметно замедляют формирование отчёта. В таких случаях расчёт правильнее перенести в запрос или во временную таблицу.

Наконец, помните, что вычисляемые поля не участвуют в отборах на уровне запроса: отбор по ним применяется уже после получения всех данных, что тоже влияет на скорость.

FAQ

Можно ли использовать ВЫРАЗИТЬ (кириллицей, как в запросе) в вычисляемом поле СКД?

Нет. В языке выражений СКД используется функция Выразить(Выражение, "Тип") со строковым описанием типа. Оператор ВЫРАЗИТЬ ... КАК ... относится к языку запросов и в поле выражения вычисляемого поля вызовет ошибку.

Почему после приведения к числу отображаются нули вместо значений?

Чаще всего исходное строковое поле содержит нечисловые символы: пробелы, неразрывные пробелы, буквы или разделители. Проверьте содержимое исходного поля в детальных записях и очистите его в запросе до приведения.

Какая разрядность Число(длина, точность) считается безопасной?

Универсальной нормы нет: ориентируйтесь на максимально возможное значение в данных с запасом. Для денежных сумм типичен вариант Число(15,2), для курсов и коэффициентов — большая точность, например Число(15,4). Главное — чтобы разрядность в Выразить и в свойстве «Тип значения» поля совпадала.

Работает ли сортировка и итоги по вычисляемому полю?

Да, если тип поля определён корректно. Числовое вычисляемое поле сортируется как число и суммируется в группировках и общих итогах. Если сортировка ведёт себя как строковая — проверьте свойство «Тип значения» поля.

Что делать, если в выражении встречается NULL?

Подмените NULL до приведения: конструкцией Выбор Когда Поле = NULL Тогда 0 Иначе Поле Конец или функцией ЕстьNULL, если она доступна в вашей версии платформы. Иначе всё арифметическое выражение вернёт NULL.

Итог

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

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