Отчеты и Аналитика · 12 мин
Функция «Выразить» в СКД 1С: приведение типов данных в отчетах
Как использовать функцию Выразить в СКД 1С: синтаксис, приведение строк и чисел, работа с составными типами, типичные ошибки и проверка результата в отчетах.
Функция Выразить в системе компоновки данных (СКД) 1С применяется для явного приведения значения к нужному типу данных. Она доступна в языке выражений компоновки и используется в вычисляемых полях, ресурсах, отборах и параметрах макетов. Типичная ситуация: поле имеет составной тип (например, строка неограниченной длины или ссылка на несколько видов документов), и для корректного сравнения, группировки или соединения его нужно привести к конкретному типу.
Без явного приведения типов СКД может работать непредсказуемо: отбор по строке неограниченной длины не срабатывает, соединение наборов данных «теряет» записи, а итоги по ресурсу считаются неверно. Причина почти всегда одна — платформа не может сопоставить значения разных типов или типов с разной длиной и точностью.
Функция записывается в формате Выразить(Выражение, "Тип"), где второй параметр — строковое описание типа, например "Строка(100)", "Число(15,2)" или "Справочник.Номенклатура". Ниже разобраны синтаксис, практические сценарии, ограничения и способы проверки результата.
Синтаксис функции Выразить и допустимые типы
Общий вид вызова: Выразить(Значение, "ОписаниеТипа"). Первый аргумент — поле набора данных, параметр или другое выражение. Второй аргумент — строка с описанием типа в том же формате, что используется в запросах 1С: Строка(длина), Число(длина, точность), Дата, Булево, а также ссылочные типы вида Справочник.Контрагенты или Документ.РеализацияТоваровУслуг.
Для строк указывается фиксированная длина — именно она определяет, как значение будет обрезано. Для чисел задаются общая длина и число знаков после запятой. Если значение не помещается в заданную разрядность, происходит округление или обрезание по правилам платформы, поэтому разрядность нужно выбирать с запасом относительно реальных данных.
При приведении ссылочных типов важно помнить: если значение физически относится к другому виду объекта, результатом будет NULL, а не ошибка. Это удобно для фильтрации составных полей, но требует аккуратности — «потерянные» значения молча превращаются в пустые.
Обрезка строк неограниченной длины
Самый частый сценарий использования Выразить — работа со строками неограниченной длины. Такие поля (например, «Комментарий» или «Описание» в справочниках) нельзя напрямую использовать в отборах, группировках и соединениях наборов данных: платформа либо выдаст ошибку, либо проигнорирует условие.
Решение — привести поле к строке фиксированной длины: Выразить(Комментарий, "Строка(200)"). Длину выбирают исходя из содержимого: если в поле пишут короткие пометки, достаточно 100–150 символов; если там хранятся развернутые тексты, обрезка до короткой строки приведет к совпадению разных значений в группировке.
Важно понимать последствие обрезки: два разных комментария, совпадающие в первых 50 символах, после приведения к Строка(50) станут неразличимы. Для группировки это иногда приемлемо, для отбора по точному значению — почти всегда ошибка. В таких случаях лучше искать по подстроке через ПОДОБНО в запросе набора данных.
Приведение чисел и управление точностью
В ресурсах и вычисляемых полях СКД числа с разной разрядностью могут давать неожиданные итоги. Например, если в выражении ресурса перемножаются количество и цена из разных наборов, итоговый тип определяется платформой автоматически и может оказаться с избыточной точностью или, наоборот, с обрезанием копеек.
Явное приведение решает обе проблемы: Выразить(Количество * Цена, "Число(15,2)") гарантирует, что результат будет денежным значением с двумя знаками. Это особенно важно при последующем сравнении итогов с данными учета — расхождения в копейках часто вызваны именно разной точностью промежуточных вычислений.
Обратная ситуация — приведение к целому: Выразить(Остаток, "Число(10,0)"). Платформа округляет по арифметическим правилам, а не отбрасывает дробную часть. Если нужно именно отсечение, используйте дополнительные вычисления, а не полагайтесь на приведение типа.
Работа с составными ссылочными типами
Поля типа «Регистратор», «ДокументОснование» или «Сделка» обычно имеют составной ссылочный тип. Когда нужно вывести в отчет реквизит конкретного документа, сначала приводят ссылку к нужному виду: Выразить(Регистратор, "Документ.РеализацияТоваровУслуг").Склад. Без приведения обращение к реквизиту через точку невозможно — СКД не знает, к какому виду объекта относится значение.
Тот же прием используют для фильтрации: условие Выразить(Регистратор, "Документ.ПоступлениеТоваровУслуг") ЕСТЬ НЕ NULL оставит в отчете только строки по документам поступления. Это лаконичная альтернатива перечислению типов через ТипЗначения в отборе.
При соединении наборов данных по составному полю приводите обе стороны связи к одному типу. Иначе соединение может не сработать даже при совпадающих ссылках, если платформа трактует типы полей по-разному.
- 1Откройте схему компоновки и определите проблемное поле: проверьте его тип в запросе набора данных
- 2Решите, к какому типу приводить: для строк подберите достаточную длину, для чисел — разрядность с запасом
- 3Добавьте вычисляемое поле с выражением Выразить(Поле, "Тип") или вставьте приведение прямо в текст запроса
- 4Используйте новое поле в отборе, группировке или ресурсе вместо исходного
- 5Сформируйте отчет и сверьте итоги с данными без приведения на контрольном примере
Где именно применять Выразить: запрос, вычисляемые поля, ресурсы
Приведение типа можно выполнить на трех уровнях, и выбор влияет на гибкость отчета. В тексте запроса набора данных оператор ВЫРАЗИТЬ работает на уровне СУБД — это самый производительный вариант, и приведенное поле доступно везде в схеме. Минус: при смене состава типов в конфигурации запрос нужно править вручную.
В вычисляемых полях СКД функция Выразить выполняется уже после получения данных. Такой вариант удобен, когда исходное поле нужно сохранить в первоначальном виде, а приведенная копия используется только для отбора или группировки. Однако отбор по вычисляемому полю выполняется в памяти, что замедляет отчет на больших объемах.
В выражениях ресурсов приведение применяют для контроля точности агрегатов. Здесь важно обернуть в Выразить всю агрегатную функцию или её аргумент осознанно: Сумма(Выразить(СуммаДокумента, "Число(15,2)")) и Выразить(Сумма(СуммаДокумента), "Число(15,2)") могут дать разный результат при большом числе строк.
Сравнение вариантов размещения приведения
Быстро работает, отбор уходит на СУБД. Ограничение: жестко фиксирует тип, требует правки запроса при изменениях конфигурации
Гибко, исходное поле сохраняется. Ограничение: отборы и группировки по такому полю выполняются в памяти и медленнее
Контролирует точность итогов. Ограничение: влияет только на агрегат, не помогает для отборов и соединений
Типичные ошибки и ограничения
Одна из распространенных ошибок — попытка привести значение к несовместимому типу, например строку с текстом к числу. В запросе это вызовет ошибку исполнения, а в выражении СКД может молча дать NULL или ноль. Перед приведением убедитесь, что данные реально конвертируемы: для строк с нечисловым содержимым сначала применяйте проверки или подзапросы.
Вторая ошибка — несовпадение длины строк в соединении: одна сторона приведена к Строка(100), другая к Строка(150). Формально типы различаются, и связь может не сработать. Правило простое: в соединениях и сравнениях всегда используйте одинаковое описание типа с обеих сторон.
Наконец, не стоит применять Выразить «на всякий случай» ко всем полям подряд. Каждое приведение — дополнительная операция при выполнении отчета, а на уровне запроса оно может отключить использование индексов по полю, что критично для больших таблиц.
Как проверить результат приведения
Надежный способ проверки — сравнительный прогон. Сформируйте отчет в исходном виде и с добавленным приведением на одном и том же периоде и сравните итоги по ключевым ресурсам. Совпадение итогов при корректной детализации означает, что приведение не потеряло данных.
Для строк проверьте максимальную реальную длину значений до выбора параметра: выполните в консоли запрос с Максимум(ДлинаСтроки(Поле)) по таблице. Если максимум близок к выбранной длине приведения, увеличьте запас — данные со временем растут.
Для составных ссылок добавьте в отчет контрольное поле Выразить(Ссылка, "НужныйТип") ЕСТЬ NULL и посчитайте долю пустых значений. Если пустых больше, чем ожидалось, значит, в данных встречаются виды документов, которые вы не учли, и фильтрация отсекает лишнее.
Как проверить результат
Итоги совпадают или расходятся только на ожидаемое округление
Итоги уменьшились без причины — значения теряются при приведении
Выбранная длина больше максимальной реальной длины данных с запасом
Данные упираются в границу длины — возможна склейка разных значений
Пустые значения соответствуют ожидаемым видам документов
Много неожиданных NULL — в данных есть виды объектов, не учтенные в схеме
Если отчет работает медленно после добавления отбора по приведенному полю, перенесите Выразить из вычисляемого поля в текст запроса набора данных — отбор уйдет на уровень СУБД и выполнится заметно быстрее.
Ответы на частые вопросы
Чем Выразить в СКД отличается от ВЫРАЗИТЬ в запросе?
По сути это одна операция на разных уровнях. ВЫРАЗИТЬ в тексте запроса выполняется СУБД при выборке данных, а функция Выразить в выражениях компоновки — платформой уже после получения результата. Для отборов и соединений предпочтительнее вариант в запросе: он быстрее и позволяет использовать индексы в простых случаях.
Можно ли привести значение к перечислению через Выразить?
Да, ссылочные типы перечислений указываются так же, как справочники и документы: Выразить(Поле, "Перечисление.СтавкиНДС"). Если исходное значение относится к другому типу, результатом будет NULL, поэтому такой прием одновременно работает как фильтр по виду значения.
Почему после Выразить к Строка(100) отбор по точному значению не находит данные?
Чаще всего причина в том, что искомая строка длиннее 100 символов и обрезается, либо в исходных данных есть концевые пробелы или непечатаемые символы. Проверьте фактическую длину значений и попробуйте отбор по подстроке через ПОДОБНО в запросе набора данных.
Что произойдет, если привести число к меньшей разрядности?
Значения, не помещающиеся в заданную разрядность, будут обработаны по правилам платформы: дробная часть округляется арифметически, а при переполнении целой части возможна ошибка исполнения запроса. Всегда задавайте разрядность с запасом относительно максимальных значений в данных.
Нужно ли приводить оба поля в соединении наборов данных?
Да, если типы полей различаются по виду, длине или точности. Приведите обе стороны связи к одному и тому же описанию типа — иначе соединение может не сработать даже при фактически совпадающих значениях, и записи из одного набора будут потеряны без сообщения об ошибке.
Можно ли использовать Выразить в параметрах и отборах на закладке настроек?
В выражениях отборов схемы компоновки функция доступна, но отбор по выражению с приведением выполняется в памяти после выборки данных. Для больших таблиц эффективнее выполнить приведение в запросе набора и отбирать уже по готовому полю.
Что важно запомнить
Выразить приводит значение к нужному типу по схеме Выразить(Поле, "Тип"). Применяйте её для обрезки строк неограниченной длины, приведения составных ссылок и контроля точности чисел, выбирайте разрядность с запасом и проверяйте итоги до и после изменения схемы.