Выражения и макеты СКД в 1С: вычисляемые поля и условное оформление
Выражения превращают отчёт на СКД из простой выборки в готовый документ: статусы вместо чисел, доли от итога, подсветка отрицательных остатков, свои заголовки группировок. В статье разобраны вычисляемые поля и язык выражений СКД, выражения в ресурсах, пользовательские поля, условное оформление и макеты — и ошибки, из-за которых поле «пропадает» из настроек.
Задача: показывать в отчёте не сырые данные, а понятный результат
Отчёт по остаткам вернул числа, но пользователю нужны «Дефицит» и «В наличии», доля каждого товара в итоге, красные отрицательные значения и заголовок вида «Остатки на 31.10.2026». Всё это решается выражениями и оформлением, не затрагивая запрос. Выражения работают в нескольких местах схемы компоновки данных, и у каждого места свои правила.
Вычисляемые поля
Вычисляемое поле добавляют на закладке «Вычисляемые поля» схемы: указывают путь к данным (имя, по которому поле будет видно в настройках), выражение и заголовок. Выражение записывают на языке выражений СКД — он похож на язык запросов, а не на встроенный язык 1С.
// Путь к данным: Статус
Выбор
Когда КоличествоОстаток < 0 Тогда "Дефицит"
Когда КоличествоОстаток = 0 Тогда "Нет в наличии"
Иначе "В наличии"
Конец
То же поле можно создать программно, если схема формируется из кода. Кавычки внутри строки кода удваивают:
ВычисляемоеПоле = СхемаКомпоновкиДанных.ВычисляемыеПоля.Добавить(); ВычисляемоеПоле.ПутьКДанным = "Статус"; ВычисляемоеПоле.Заголовок = "Статус"; ВычисляемоеПоле.Выражение = "Выбор Когда КоличествоОстаток < 0 Тогда ""Дефицит"" Иначе ""В наличии"" Конец";
Важное свойство: вычисляемое поле считается для каждой записи набора данных, до группировки. Поэтому в нём удобно вычислять статус, склеивать строки, форматировать числа и даты, но не считать итоги по группе — для этого есть ресурсы. Если после изменения схемы из кода список полей в компоновщике не обновился, заново выполните Инициализировать() с источником доступных настроек, построенным по изменённой схеме.
Функции языка выражений СКД
Наиболее часто нужны следующие функции:
Выбор Когда … Тогда … Иначе … Конец— условие; вариантовКогдаможет быть несколько.ЕстьNULL(Поле, 0)— подстановка значения вместоNULLпосле левого соединения в запросе.Формат(Значение, "ЧДЦ=2; ЧГ=")иФормат(Дата, "ДФ='dd.MM.yyyy'")— форматная строка как в обычномФормат()встроенного языка.Представление(Поле)— строковое представление ссылки;ЗначениеЗаполнено(Поле)— проверка непустого значения.Подстрока(),СокрЛП(),ДлинаСтроки(),Год(),Месяц(),НачалоПериода(),КонецПериода(),ДобавитьКДате(),РазностьДат()— работа со строками и датами.ВычислитьВыражение()— вычисление выражения в другом контексте: по всему отчёту, по родителю, по предыдущей записи.
Пример форматирования для текстового поля: "Остаток: " + Формат(КоличествоОстаток, "ЧДЦ=0") + " шт.". Условный текст внутри строки собирается так же, как в запросе, с помощью Выбор. Обратите внимание на отличие от встроенного языка: оператор «неравно» записывается как <>, а логические операции — И, ИЛИ, НЕ; тернарный оператор ?() встроенного языка в выражениях СКД не используется — вместо него служит Выбор.
Выражения в ресурсах
В ресурсе выражение обязано содержать агрегатную функцию: Сумма, Количество, КоличествоРазличных, Максимум, Минимум, Среднее. Простое Сумма(Сумма) — самый частый случай. Для расчёта доли от общего итога используется ВычислитьВыражение:
// Ресурс ДоляПроцент
Выбор
Когда ВычислитьВыражение("Сумма(Сумма)", , "ОбщийИтог") = 0 Тогда 0
Иначе Сумма(Сумма) * 100 / ВычислитьВыражение("Сумма(Сумма)", , "ОбщийИтог")
Конец
Проверка деления на ноль нужна, иначе пустой отчёт покажет ошибку или пустое значение. Для одного ресурса можно задать разные выражения по разным группировкам: в строке ресурса указывают имя группировки в колонке «Рассчитывать по…» и своё выражение. Так делают средневзвешенную цену на верхних уровнях и простую сумму на нижних.
Пользовательские поля
Если схему менять нельзя, а поле нужно, пользователь создаёт его прямо в настройках варианта в режиме «1С:Предприятие». Доступны два вида: поле-выражение (выражение на языке СКД над доступными полями отчёта) и поле-выбор (список условий и значений без написания синтаксиса). Такие поля сохраняются в настройках варианта пользователя и не попадают в конфигурацию. Это удобный способ дать аналитику свой расчёт, не привлекая программиста.
Условное оформление
Условное оформление находится в настройках варианта. Элемент состоит из трёх частей: список полей, к которым применяется оформление, условие (отбор) и параметры оформления — цвет текста, цвет фона, шрифт, формат, текст. Через интерфейс его добавляют на закладке «Условное оформление». Программно:
ЭлементОформления = Компоновщик.Настройки.УсловноеОформление.Элементы.Добавить();
ЭлементОформления.Использование = Истина;
ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("КоличествоОстаток");
ПолеОформления.Использование = Истина;
ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("КоличествоОстаток");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Меньше;
ЭлементОтбора.ПравоеЗначение = 0;
ЭлементОтбора.Использование = Истина;
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветТекста", Новый Цвет(200, 0, 0));
Если список полей оставить пустым, оформление применяется ко всей строке. Условное оформление работает только при выводе в табличный документ; при выводе в таблицу значений оно не имеет смысла.
Макеты в СКД и вывод заголовков
Для тонкой настройки внешнего вида есть закладка «Макеты» схемы. Основные виды — макеты полей (как выводится значение или заголовок отдельного поля) и макеты группировок (заголовок и подвал группировки, в том числе общих итогов). Каждый макет — небольшая табличная область с ячейками. Текст ячейки может содержать параметр макета: ему на этой же закладке задают выражение, например "Склад: " + Склад для макета заголовка группировки по складу, и при выводе параметр подставится значением. Макеты применяют, когда стандартного вывода недостаточно: нужна «шапка» группировки с несколькими строками, дополнительные итоги в подвале или нестандартные рамки.
Заголовок отчёта и другие параметры вывода задают без макетов — через параметры вывода настроек:
ПараметрыВывода = Компоновщик.Настройки.ПараметрыВывода;
ПараметрыВывода.УстановитьЗначениеПараметра("Заголовок", "Остатки товаров на складе");
ПараметрыВывода.УстановитьЗначениеПараметра("ВыводитьОтбор", ТипВыводаТекстаКомпоновкиДанных.НеВыводить);
Выражения в параметрах схемы
Выражения можно задавать и параметрам на закладке «Параметры». Так получают вычисляемую дату сравнения, не заставляя пользователя вводить её вручную: значение параметра ДатаСравнения строится из другого параметра выражением ДобавитьКДате(&КонецПериода, "Месяц", -1). Параметр, который вычисляется по выражению, обычно скрывают от пользователя флажком «Ограничение доступности» — иначе при ручном вводе выражение будет перебито значением. Циклические ссылки параметров друг на друга недопустимы.
Типичные ошибки
- Ресурс без агрегатной функции. Выражение
Сумманужно писать явно:Сумма(Сумма), а не простоСумма. Без функции выражение не пройдёт проверку либо итоги окажутся пустыми. - Поле не доступно в настройках. Проверьте ограничения использования поля в наборе данных (поле, условие, группировка, порядок) и роль поля. Для вычисляемого поля — что оно есть на закладке «Вычисляемые поля» и его путь к данным уникален.
- Агрегатная функция в вычисляемом поле. Поле считается построчно; итоги по группе выносят в ресурс.
- Деление без проверки на ноль в выражениях долей и средних значений.
- Выражение встроенного языка вместо языка СКД:
?(), методы объектов и обращения к свойствам через точку не работают, условия записывают черезВыбор. - NULL в арифметике. После левого соединения в запросе поля могут быть
NULL; оберните их вЕстьNULL(). - Условное оформление не срабатывает, когда имя поля в элементе отбора не совпадает с именем в наборе или оформление задано для поля, которое не выводится.
Где какое выражение уместно
| Место | Когда считается | Агрегатные функции | Типичное применение |
|---|---|---|---|
| Вычисляемое поле | Для каждой записи набора | Не используются | Статусы, форматирование, склейка строк |
| Ресурс | После группировки | Обязательны | Итоги, доли, средние |
| Пользовательское поле | Для записей, как вычисляемое | Не используются | Расчёт, добавленный пользователем |
| Условное оформление | При выводе строки | Не используются | Подсветка значений |
| Параметр макета | При выводе макета | Допустимы для итогов | Заголовки и подвалы группировок |
Актуальность для новых версий
Язык выражений СКД и перечисленные функции доступны во всех версиях платформы 8.3. Пользовательские поля и расширенные настройки варианта в режиме «1С:Предприятие» появились раньше 8.3.10, но интерфейс окна настроек менялся от релиза к релизу, поэтому названия кнопок и закладок в вашей версии могут отличаться. Программный интерфейс условного оформления и параметров вывода остаётся прежним в версиях 8.3.2x. Макеты оформления отчётов в типовых конфигурациях могут быть заменены собственными макетами БСП.
Частые вопросы
Чем вычисляемое поле отличается от ресурса в СКД?
Вычисляемое поле считается для каждой записи набора данных до группировки, а ресурс — после группировки с помощью агрегатной функции, например Сумма(). Итоговые значения и доли от итога настраивают через ресурсы.
Как в СКД сделать условие, аналог Если Тогда?
Используйте конструкцию Выбор Когда Условие Тогда Значение Иначе Другое Конец. Выражение можно вложить в вычисляемое поле, ресурс или пользовательское поле-выражение.
Почему поле не появляется в настройках отчёта?
Чаще всего для поля в наборе данных запрещено использование в нужной части настроек или оно не входит в набор. Проверьте ограничения доступности поля, роль и то, что имя вычисляемого поля не совпадает с другим полем.
Как подсветить строки в отчёте СКД?
Добавьте элемент условного оформления в настройки варианта: укажите поля, условие отбора и параметр оформления — цвет текста или фона. Программно это делается через Настройки.УсловноеОформление.Элементы.Добавить().