Отчеты и Аналитика · 11 мин
Как добавить вычисляемое поле в СКД 1С
Как добавить вычисляемое поле в СКД 1С: вкладка «Вычисляемые поля», выражения, функции общих модулей, использование в отборе и ресурсах, типичные ошибки и проверка результата.
Вычисляемое поле в системе компоновки данных (СКД) — это колонка отчёта, значение которой не берётся напрямую из базы данных, а рассчитывается по формуле на основе других полей набора данных. Типичные примеры: сумма с НДС, разница между планом и фактом, отклонение в процентах, строковое представление периода, признак просрочки по дате оплаты.
Добавление вычисляемого поля не требует изменения запроса и доработки конфигурации в большинстве случаев: достаточно открыть схему компоновки данных отчёта и описать выражение на специальной закладке. Это делает механизм удобным инструментом как для разработчика, так и для продвинутого пользователя, настраивающего отчёт под свои задачи.
Ниже разобран полный цикл работы: где находится нужная закладка, как написать выражение, как задействовать функции общих модулей, как вывести поле в настройки отчёта и как проверить, что расчёт работает корректно. Отдельно рассмотрены ограничения механизма и типичные ошибки, из-за которых поле не вычисляется или отчёт падает с ошибкой.
Где в СКД находится настройка вычисляемых полей
Откройте схему компоновки данных отчёта. В конфигураторе это делается через кнопку «Открыть схему компоновки данных» в свойствах отчёта или через основную схему внешнего отчёта. В конструкторе СКД перейдите на закладку «Вычисляемые поля» — она расположена рядом с закладками «Наборы данных», «Связи наборов данных» и «Ресурсы».
На закладке отображается таблица уже добавленных вычисляемых полей. Для каждого поля задаются: путь к данным (имя, по которому к полю обращаются в настройках), заголовок (отображаемое имя), выражение (формула расчёта), тип значения, доступность и оформление. Кнопка «Добавить» создаёт новую строку, в которой и заполняются эти свойства.
В типовых конфигурациях многие отчёты построены на СКД, и схему можно открыть также в режиме предприятия: «Ещё — Изменить вариант» (или «Расширенная настройка» в зависимости от конфигурации) позволяет добраться до структуры настроек. Однако добавление новых вычисляемых полей в пользовательском режиме обычно недоступно — для этого нужен конфигуратор или расширение.
Пошаговое добавление простого вычисляемого поля
Рассмотрим базовый сценарий: в отчёте по продажам есть поля «Сумма» и «Себестоимость», нужно вывести колонку «Прибыль» как разницу между ними. Вся работа выполняется в конструкторе СКД без изменения запроса набора данных.
- 1Откройте схему компоновки данных отчёта в конфигураторе
- 2Перейдите на закладку «Вычисляемые поля» и нажмите «Добавить»
- 3Задайте путь к данным, например: Прибыль
- 4Укажите заголовок: Прибыль
- 5В поле «Выражение» введите формулу: Сумма - Себестоимость
- 6При необходимости задайте тип значения — Число
- 7Перейдите на закладку «Настройки» и добавьте поле «Прибыль» в выбранные поля
- 8Сохраните схему и сформируйте отчёт для проверки
В колонке «Путь к данным» указывается имя, по которому поле будет видно в настройках и доступно в других выражениях. Имя не должно совпадать с именами полей наборов данных — иначе возникнет конфликт и ошибка компоновки. Заголовок пользователь увидит в шапке колонки отчёта.
В колонке «Выражение» записывается формула на языке выражений СКД. Он похож на встроенный язык 1С, но имеет ограниченный набор операций: арифметика, строковые функции, функции работы с датами, условный оператор Выбор и агрегатные функции в ресурсах. Обращение к полям набора данных происходит просто по имени.
// Выражение для поля «Прибыль»
Сумма - Себестоимость
// Выражение для поля «ПроцентПрибыли» с защитой от деления на ноль
Выбор
Когда Себестоимость = 0
Тогда 0
Иначе (Сумма - Себестоимость) / Себестоимость * 100
Конец
После сохранения схемы обязательно проверьте настройки варианта отчёта: новое поле появится в списке доступных полей, но в выбранные его нужно перенести вручную. Если вариантов несколько, добавьте поле в каждый нужный вариант или в настройки по умолчанию.
Какие выражения можно использовать
Язык выражений СКД поддерживает арифметические операции, сравнение, логические операции И/ИЛИ/НЕ, конкатенацию строк и ряд встроенных функций. Наиболее востребованные: Сумма, Минимум, Максимум, Количество, РазностьДат, НачалоПериода, КонецПериода, Подстрока, Строка, ЕстьNull. Полный список доступен в синтакс-помощнике в разделе, посвящённом языку выражений системы компоновки данных.
Конструкция «Выбор ... Когда ... Тогда ... Иначе ... Конец» — аналог условного оператора — позволяет строить развилки прямо в формуле. С её помощью реализуют признаки («Просрочен»/«В срок»), категории по диапазонам значений, защиту от деления на ноль и замену пустых значений.
// Признак просрочки оплаты
Выбор
Когда ДатаОплаты < &ТекущаяДата
Тогда "Просрочен"
Иначе "В срок"
Конец
// Замена NULL значением по умолчанию
ЕстьNull(Скидка, 0)
Обратите внимание на функцию ЕстьNull: если в соединении наборов данных часть строк не имеет пары, поля будут содержать NULL, и арифметика с NULL даст NULL, а не число. Оборачивание полей в ЕстьNull — стандартная защита от «пропадающих» значений в вычисляемых колонках.
Вызов функций общих модулей в выражениях
Когда встроенных функций не хватает, в выражении можно вызвать экспортную функцию общего модуля. Для этого у схемы компоновки данных должно быть заполнено свойство, разрешающее использование внешних функций, а сама функция вызывается с указанием имени общего модуля.
// В выражении вычисляемого поля
МойОбщийМодуль.РассчитатьКоэффициент(Количество, ЕдиницаИзмерения)
Требования к такой функции: она должна быть экспортной, размещаться в общем модуле с установленным признаком «Сервер» (и «Вызов сервера», если отчёт работает в управляемом приложении), принимать простые типы параметров и возвращать значение простого типа. Сложные объекты — таблицы значений, ссылки с обращением к реквизитам через точку — внутрь выражения передать нельзя.
Производительность — главный аргумент против злоупотребления внешними функциями. Если расчёт можно выполнить в запросе набора данных (соединением с виртуальной таблицей, агрегацией), делайте это в запросе: СУБД обработает данные быстрее, чем построчный вызов функции на сервере приложений.
Вычисляемые поля в ресурсах, отборах и группировках
Добавленное поле ведёт себя как обычное поле схемы: его можно выводить в таблицу, использовать в отборах, сортировках, условном оформлении и группировках. Например, поле «ПризнакПросрочки» можно не выводить в отчёт, а использовать только для отбора строк или для раскраски ячеек через условное оформление.
Если вычисляемое поле должно суммироваться по группировкам (как «Прибыль» в итогах по менеджеру), его нужно добавить на закладку «Ресурсы». В ресурсах укажите выражение агрегирования — обычно Сумма(Прибыль). Без этого в итоговых строках поле останется пустым или покажет некорректное значение.
Для полей, рассчитываемых от уже сгруппированных итогов (например, процент прибыли от суммарной прибыли и суммарной себестоимости), выражение в ресурсах пишется иначе: агрегатные функции применяются к исходным полям, а не к вычисляемому. Это тонкое место: Сумма(ПроцентПрибыли) даст бессмысленный итог, правильно — Сумма(Сумма - Себестоимость) / Сумма(Себестоимость) * 100.
Где считать значение
Подходит для расчётов, требующих соединений и агрегации на стороне СУБД. Быстро, но требует правки запроса.
Подходит для простых формул, условий и форматирования. Не требует изменения запроса, легко правится.
Подходит для сложной логики, недоступной в языке выражений. Медленно на больших выборках, использовать с осторожностью.
Проверка результата и типичные ошибки
После добавления поля сформируйте отчёт и сверьте несколько строк с ручным расчётом. Проверьте граничные случаи: строки с нулевыми значениями, строки с NULL после соединения наборов, итоги по группировкам и общий итог. Если поле используется в отборе, убедитесь, что отбор действительно отсекает лишние строки.
Как проверить результат
Колонка выводится с заголовком и значениями
Поле есть в схеме, но не добавлено в выбранные поля настройки
Совпадают с ручным расчётом по формуле
Пустые значения или NULL — проверьте ЕстьNull и имена полей
Итог равен сумме детальных строк
Итог пустой — поле не добавлено в ресурсы
Лишние строки отсекаются
Ошибка компоновки — поле недоступно на уровне, где задан отбор
Ещё одна частая проблема — тип значения. Если не указать тип явно, СКД попытается определить его по выражению, и в смешанных случаях (число и строка в разных ветках «Выбор») результат может отображаться некорректно. Задавайте тип значения в свойствах вычисляемого поля явно.
Что важно запомнить
Вычисляемое поле создаётся на закладке «Вычисляемые поля» схемы компоновки: путь к данным, заголовок, выражение. Далее поле включается в выбранные поля настройки, при необходимости добавляется в ресурсы. Защищайтесь от NULL функцией ЕстьNull, итоговые проценты считайте от агрегатов, а тяжёлую логику выносите в запрос, а не в функции общих модулей.
Частые вопросы
Можно ли добавить вычисляемое поле в режиме предприятия без конфигуратора?
В стандартном пользовательском режиме настройки варианта отчёта добавление новых вычисляемых полей недоступно — можно лишь использовать уже существующие в схеме. Для добавления поля нужен конфигуратор, расширение конфигурации или программная доработка отчёта.
Почему вычисляемое поле не отображается в списке доступных полей настройки?
Проверьте, что поле добавлено именно в схему компоновки данных, а не только в настройки, и что у него заполнен путь к данным. Также убедитесь, что в свойствах поля не снят признак доступности и что поле не отфильтровано ограничениями на уровне набора данных или ролей.
Как в выражении обратиться к параметру отчёта?
Параметры в выражениях указываются через амперсанд, например: &ТекущаяДата или &Организация. Параметр должен быть объявлен на закладке «Параметры» схемы компоновки, иначе компоновщик выдаст ошибку о неизвестном параметре.
Можно ли использовать вычисляемое поле внутри другого вычисляемого поля?
Да, вычисляемые поля могут ссылаться друг на друга по пути к данным, если нет циклических зависимостей. Однако для читаемости схемы сложные многоуровневые зависимости лучше упрощать или выносить часть логики в запрос набора данных.
Почему в итогах по группировке вычисляемое поле пустое?
Итоги рассчитываются только для полей, добавленных на закладку «Ресурсы». Добавьте поле в ресурсы и укажите корректное выражение агрегирования — например, Сумма(Прибыль). Для процентов и коэффициентов пишите выражение от агрегатов исходных полей, а не от самого вычисляемого поля.
Что быстрее: вычисляемое поле или расчёт в запросе?
Для простых формул разница незаметна. Для расчётов, требующих соединений, агрегации или обращения к данным других таблиц, запрос быстрее, так как обрабатывается на стороне СУБД. Вычисляемые поля оптимальны для форматирования, условий и простой арифметики над уже полученными полями.