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

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

Как добавить вычисляемое поле в СКД 1С

Как добавить вычисляемое поле в СКД 1С: вкладка «Вычисляемые поля», выражения, функции общих модулей, использование в отборе и ресурсах, типичные ошибки и проверка результата.

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

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

Ниже разобран полный цикл работы: где находится нужная закладка, как написать выражение, как задействовать функции общих модулей, как вывести поле в настройки отчёта и как проверить, что расчёт работает корректно. Отдельно рассмотрены ограничения механизма и типичные ошибки, из-за которых поле не вычисляется или отчёт падает с ошибкой.

Где в СКД находится настройка вычисляемых полей

Откройте схему компоновки данных отчёта. В конфигураторе это делается через кнопку «Открыть схему компоновки данных» в свойствах отчёта или через основную схему внешнего отчёта. В конструкторе СКД перейдите на закладку «Вычисляемые поля» — она расположена рядом с закладками «Наборы данных», «Связи наборов данных» и «Ресурсы».

На закладке отображается таблица уже добавленных вычисляемых полей. Для каждого поля задаются: путь к данным (имя, по которому к полю обращаются в настройках), заголовок (отображаемое имя), выражение (формула расчёта), тип значения, доступность и оформление. Кнопка «Добавить» создаёт новую строку, в которой и заполняются эти свойства.

В типовых конфигурациях многие отчёты построены на СКД, и схему можно открыть также в режиме предприятия: «Ещё — Изменить вариант» (или «Расширенная настройка» в зависимости от конфигурации) позволяет добраться до структуры настроек. Однако добавление новых вычисляемых полей в пользовательском режиме обычно недоступно — для этого нужен конфигуратор или расширение.

Пошаговое добавление простого вычисляемого поля

Рассмотрим базовый сценарий: в отчёте по продажам есть поля «Сумма» и «Себестоимость», нужно вывести колонку «Прибыль» как разницу между ними. Вся работа выполняется в конструкторе СКД без изменения запроса набора данных.

Порядок действий
  1. 1
    Откройте схему компоновки данных отчёта в конфигураторе
  2. 2
    Перейдите на закладку «Вычисляемые поля» и нажмите «Добавить»
  3. 3
    Задайте путь к данным, например: Прибыль
  4. 4
    Укажите заголовок: Прибыль
  5. 5
    В поле «Выражение» введите формулу: Сумма - Себестоимость
  6. 6
    При необходимости задайте тип значения — Число
  7. 7
    Перейдите на закладку «Настройки» и добавьте поле «Прибыль» в выбранные поля
  8. 8
    Сохраните схему и сформируйте отчёт для проверки

В колонке «Путь к данным» указывается имя, по которому поле будет видно в настройках и доступно в других выражениях. Имя не должно совпадать с именами полей наборов данных — иначе возникнет конфликт и ошибка компоновки. Заголовок пользователь увидит в шапке колонки отчёта.

В колонке «Выражение» записывается формула на языке выражений СКД. Он похож на встроенный язык 1С, но имеет ограниченный набор операций: арифметика, строковые функции, функции работы с датами, условный оператор Выбор и агрегатные функции в ресурсах. Обращение к полям набора данных происходит просто по имени.

// Выражение для поля «Прибыль»

Сумма - Себестоимость

// Выражение для поля «ПроцентПрибыли» с защитой от деления на ноль

Выбор

Когда Себестоимость = 0

Тогда 0

Иначе (Сумма - Себестоимость) / Себестоимость * 100

Конец

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

Какие выражения можно использовать

Язык выражений СКД поддерживает арифметические операции, сравнение, логические операции И/ИЛИ/НЕ, конкатенацию строк и ряд встроенных функций. Наиболее востребованные: Сумма, Минимум, Максимум, Количество, РазностьДат, НачалоПериода, КонецПериода, Подстрока, Строка, ЕстьNull. Полный список доступен в синтакс-помощнике в разделе, посвящённом языку выражений системы компоновки данных.

Конструкция «Выбор ... Когда ... Тогда ... Иначе ... Конец» — аналог условного оператора — позволяет строить развилки прямо в формуле. С её помощью реализуют признаки («Просрочен»/«В срок»), категории по диапазонам значений, защиту от деления на ноль и замену пустых значений.

// Признак просрочки оплаты

Выбор

Когда ДатаОплаты < &ТекущаяДата

Тогда "Просрочен"

Иначе "В срок"

Конец

// Замена NULL значением по умолчанию

ЕстьNull(Скидка, 0)

Обратите внимание на функцию ЕстьNull: если в соединении наборов данных часть строк не имеет пары, поля будут содержать NULL, и арифметика с NULL даст NULL, а не число. Оборачивание полей в ЕстьNull — стандартная защита от «пропадающих» значений в вычисляемых колонках.

Вызов функций общих модулей в выражениях

Когда встроенных функций не хватает, в выражении можно вызвать экспортную функцию общего модуля. Для этого у схемы компоновки данных должно быть заполнено свойство, разрешающее использование внешних функций, а сама функция вызывается с указанием имени общего модуля.

// В выражении вычисляемого поля

МойОбщийМодуль.РассчитатьКоэффициент(Количество, ЕдиницаИзмерения)

Требования к такой функции: она должна быть экспортной, размещаться в общем модуле с установленным признаком «Сервер» (и «Вызов сервера», если отчёт работает в управляемом приложении), принимать простые типы параметров и возвращать значение простого типа. Сложные объекты — таблицы значений, ссылки с обращением к реквизитам через точку — внутрь выражения передать нельзя.

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

Вычисляемые поля в ресурсах, отборах и группировках

Добавленное поле ведёт себя как обычное поле схемы: его можно выводить в таблицу, использовать в отборах, сортировках, условном оформлении и группировках. Например, поле «ПризнакПросрочки» можно не выводить в отчёт, а использовать только для отбора строк или для раскраски ячеек через условное оформление.

Если вычисляемое поле должно суммироваться по группировкам (как «Прибыль» в итогах по менеджеру), его нужно добавить на закладку «Ресурсы». В ресурсах укажите выражение агрегирования — обычно Сумма(Прибыль). Без этого в итоговых строках поле останется пустым или покажет некорректное значение.

Для полей, рассчитываемых от уже сгруппированных итогов (например, процент прибыли от суммарной прибыли и суммарной себестоимости), выражение в ресурсах пишется иначе: агрегатные функции применяются к исходным полям, а не к вычисляемому. Это тонкое место: Сумма(ПроцентПрибыли) даст бессмысленный итог, правильно — Сумма(Сумма - Себестоимость) / Сумма(Себестоимость) * 100.

Где считать значение

В запросе набора данных

Подходит для расчётов, требующих соединений и агрегации на стороне СУБД. Быстро, но требует правки запроса.

В вычисляемом поле СКД

Подходит для простых формул, условий и форматирования. Не требует изменения запроса, легко правится.

Во внешней функции общего модуля

Подходит для сложной логики, недоступной в языке выражений. Медленно на больших выборках, использовать с осторожностью.

Проверка результата и типичные ошибки

После добавления поля сформируйте отчёт и сверьте несколько строк с ручным расчётом. Проверьте граничные случаи: строки с нулевыми значениями, строки с NULL после соединения наборов, итоги по группировкам и общий итог. Если поле используется в отборе, убедитесь, что отбор действительно отсекает лишние строки.

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

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

Поле видно в отчёте
Норма

Колонка выводится с заголовком и значениями

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

Поле есть в схеме, но не добавлено в выбранные поля настройки

Значения в детальных строках
Норма

Совпадают с ручным расчётом по формуле

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

Пустые значения или NULL — проверьте ЕстьNull и имена полей

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

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

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

Итог пустой — поле не добавлено в ресурсы

Отбор по вычисляемому полю
Норма

Лишние строки отсекаются

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

Ошибка компоновки — поле недоступно на уровне, где задан отбор

Типичные ошибки
01
Поле добавлено в схему, но не включено в выбранные поля настройки — колонка не появляется в отчёте
02
Имя вычисляемого поля совпадает с полем набора данных — ошибка компоновки при формировании
03
Арифметика с NULL без ЕстьNull — пустые значения вместо ожидаемых чисел
04
Сумма(Процент) в ресурсах вместо пересчёта от итогов — неверные итоговые проценты
05
Запрос к базе внутри функции общего модуля — резкое замедление формирования отчёта
06
Отбор по вычисляемому полю на уровне группировки, где поле недоступно — ошибка или пустой результат

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

Итог

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

Вычисляемое поле создаётся на закладке «Вычисляемые поля» схемы компоновки: путь к данным, заголовок, выражение. Далее поле включается в выбранные поля настройки, при необходимости добавляется в ресурсы. Защищайтесь от NULL функцией ЕстьNull, итоговые проценты считайте от агрегатов, а тяжёлую логику выносите в запрос, а не в функции общих модулей.

Частые вопросы

Можно ли добавить вычисляемое поле в режиме предприятия без конфигуратора?

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

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

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

Как в выражении обратиться к параметру отчёта?

Параметры в выражениях указываются через амперсанд, например: &ТекущаяДата или &Организация. Параметр должен быть объявлен на закладке «Параметры» схемы компоновки, иначе компоновщик выдаст ошибку о неизвестном параметре.

Можно ли использовать вычисляемое поле внутри другого вычисляемого поля?

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

Почему в итогах по группировке вычисляемое поле пустое?

Итоги рассчитываются только для полей, добавленных на закладку «Ресурсы». Добавьте поле в ресурсы и укажите корректное выражение агрегирования — например, Сумма(Прибыль). Для процентов и коэффициентов пишите выражение от агрегатов исходных полей, а не от самого вычисляемого поля.

Что быстрее: вычисляемое поле или расчёт в запросе?

Для простых формул разница незаметна. Для расчётов, требующих соединений, агрегации или обращения к данным других таблиц, запрос быстрее, так как обрабатывается на стороне СУБД. Вычисляемые поля оптимальны для форматирования, условий и простой арифметики над уже полученными полями.