Приветствуем вас! Настройка отчетов в Системе компоновки данных (СКД) в режиме «1С:Предприятие» — задача чрезвычайно распространенная, но она часто вызывает вопросы даже у опытных разработчиков и аналитиков. Сегодня мы разберем классическую проблему: почему не работает условие в пользовательском поле-выражении при попытке сравнить реквизит с текстовой строкой, и как правильно решить эту задачу с использованием встроенных механизмов платформы 1С.
Представим стандартную ситуацию. Мы создаем новое пользовательское поле-выражение в СКД. Наша цель — вывести единицу (1), если зафиксирован факт определенного события (например, произошло осеменение животного), и ноль (0) во всех остальных случаях. На первый взгляд логично написать простое и понятное условие:
Выбор
Когда ЭтапЦиклаВоспроизводства = "Осеменение"
Тогда 1
Иначе 0
Конец
Однако при формировании отчета мы замечаем, что колонка либо остается абсолютно пустой, либо заполняется нулями. Давайте проанализируем, почему так происходит. Дело в типе данных. Поле ЭтапЦиклаВоспроизводства в нашей информационной базе имеет тип не «Строка», а является ссылкой на объект метаданных — Перечисление. Платформа 1С строго типизирована: сравнение ссылки (даже если на экране мы видим ее текстовое представление) со строковым литералом "Осеменение" всегда будет возвращать значение Ложь. Соответственно, условие Когда никогда не выполняется.
Для правильного сравнения нам необходимо обратиться к конкретному значению перечисления так, как его «понимает» сама база данных. В выражениях СКД, так же как и в классическом языке запросов 1С, для этого используется специальная функция ЗНАЧЕНИЕ(). Давайте посмотрим, как будет выглядеть корректная формула для нашего пользовательского поля:
Выбор
Когда ЭтапЦиклаВоспроизводства = ЗНАЧЕНИЕ(Перечисление.ЭтапыЦикловВоспроизводства.Осеменение)
Тогда 1
Иначе 0
Конец
Рассмотрим подробнее синтаксис внутри функции ЗНАЧЕНИЕ(). Мы пишем ключевое слово в единственном числе — Перечисление, далее через точку указываем имя перечисления так, как оно задано в конфигураторе (например, ЭтапыЦикловВоспроизводства), а затем через точку указываем конкретное имя его значения (например, Осеменение). Обратите внимание: имя перечисления и его значение пишутся без пробелов и без кавычек.
Функция ЗНАЧЕНИЕ() очень полезна и универсальна. С её помощью в выражениях СКД можно обращаться не только к перечислениям, но и к другим предопределенным объектам конфигурации. Давайте разберем несколько практических примеров:
ЗНАЧЕНИЕ(Справочник.Валюты.Рубль).ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Материалы).ЭтапЦиклаВоспроизводства = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка).ЗНАЧЕНИЕ(Перечисление.ВидыДоговоровКонтрагентов.Покупатель).При настройке пользовательского поля-выражения платформа 1С предлагает нам заполнить две ключевые формулы: Выражение детальных записей и Выражение итоговых записей. Если упустить этот момент, отчет может рассчитывать данные некорректно на уровнях группировок.
Давайте разберем разницу между ними:
Выбор Когда... идеально подходит для этого поля.Чтобы в группировках выводилось суммарное количество осеменений, в Выражении итоговых записей нам необходимо обязательно агрегировать эти данные, обернув аналогичную формулу в функцию СУММА():
СУММА(Выбор Когда ЭтапЦиклаВоспроизводства = ЗНАЧЕНИЕ(Перечисление.ЭтапыЦикловВоспроизводства.Осеменение) Тогда 1 Иначе 0 Конец)
Такая настройка гарантирует, что на уровне детальных строк у вас будет выводиться 1 или 0, а на уровне итогов — точная сумма всех произошедших событий.
Для пользователей, которые не хотят вручную писать код, разбираться в синтаксисе функции ЗНАЧЕНИЕ() и бояться опечаток в именах метаданных, в СКД предусмотрен отличный визуальный инструмент — Пользовательское поле-выбор. Давайте разберем по шагам, как его настроить:
ЭтапЦиклаВоспроизводства, а вид сравнения выберите «Равно».1.0.Этот способ полностью исключает возникновение синтаксических ошибок при составлении условий.
Часто разработчики путают *пользовательские поля* (создаваемые пользователем или аналитиком непосредственно в режиме «1С:Предприятие») и *вычисляемые поля* (создаваемые программистом в конфигураторе на этапе разработки схемы отчета). Проанализируем ключевые различия между ними:
Выбор, функции Представление(), Формат(), Окр() и другие.Посмотрим еще на одну частую техническую ошибку. Если в вашей схеме компоновки данных синоним поля содержит пробелы (например, поле называется Этап цикла воспроизводства), выражение СКД выдаст ошибку при анализе формулы. Чтобы этого избежать, имена таких полей обязательно должны быть обрамлены квадратными скобками:
Выбор
Когда [Этап цикла воспроизводства] = ЗНАЧЕНИЕ(Перечисление.ЭтапыЦикловВоспроизводства.Осеменение)
Тогда 1
Иначе 0
Конец
Если поле состоит из одного слова без пробелов (как в нашем первом примере), квадратные скобки ставить необязательно, но их наличие не будет считаться ошибкой.
Используя эти простые правила, вы сможете легко создавать гибкие, точные и информативные отчеты в СКД любой сложности!