Как в пользовательском поле СКД 1С сравнить значение с перечислением?

Программист 1С v8.3 (Управляемые формы) Управленческий учет Промышленность, строительство и АПК
← На главную

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

Выясним причину: почему сравнение со строкой не дает результата

Представим стандартную ситуацию. Мы создаем новое пользовательское поле-выражение в СКД. Наша цель — вывести единицу (1), если зафиксирован факт определенного события (например, произошло осеменение животного), и ноль (0) во всех остальных случаях. На первый взгляд логично написать простое и понятное условие:


Выбор
    Когда ЭтапЦиклаВоспроизводства = "Осеменение"
    Тогда 1
    Иначе 0
Конец

Однако при формировании отчета мы замечаем, что колонка либо остается абсолютно пустой, либо заполняется нулями. Давайте проанализируем, почему так происходит. Дело в типе данных. Поле ЭтапЦиклаВоспроизводства в нашей информационной базе имеет тип не «Строка», а является ссылкой на объект метаданных — Перечисление. Платформа 1С строго типизирована: сравнение ссылки (даже если на экране мы видим ее текстовое представление) со строковым литералом "Осеменение" всегда будет возвращать значение Ложь. Соответственно, условие Когда никогда не выполняется.

Решение проблемы: использование системной функции ЗНАЧЕНИЕ()

Для правильного сравнения нам необходимо обратиться к конкретному значению перечисления так, как его «понимает» сама база данных. В выражениях СКД, так же как и в классическом языке запросов 1С, для этого используется специальная функция ЗНАЧЕНИЕ(). Давайте посмотрим, как будет выглядеть корректная формула для нашего пользовательского поля:


Выбор
    Когда ЭтапЦиклаВоспроизводства = ЗНАЧЕНИЕ(Перечисление.ЭтапыЦикловВоспроизводства.Осеменение)
    Тогда 1
    Иначе 0
Конец

Рассмотрим подробнее синтаксис внутри функции ЗНАЧЕНИЕ(). Мы пишем ключевое слово в единственном числе — Перечисление, далее через точку указываем имя перечисления так, как оно задано в конфигураторе (например, ЭтапыЦикловВоспроизводства), а затем через точку указываем конкретное имя его значения (например, Осеменение). Обратите внимание: имя перечисления и его значение пишутся без пробелов и без кавычек.

Расширенные возможности функции ЗНАЧЕНИЕ() в СКД

Функция ЗНАЧЕНИЕ() очень полезна и универсальна. С её помощью в выражениях СКД можно обращаться не только к перечислениям, но и к другим предопределенным объектам конфигурации. Давайте разберем несколько практических примеров:

  1. Предопределенные элементы справочников: Если вам нужно сопоставить поле с конкретным элементом системного справочника, используйте конструкцию вида: ЗНАЧЕНИЕ(Справочник.Валюты.Рубль).
  2. Предопределенные счета из плана счетов: Для бухгалтерских отчетов незаменима проверка счетов: ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Материалы).
  3. Проверка на незаполненное значение (Пустая ссылка): Очень частая задача — проверить, заполнено ли поле ссылки. Сделать это можно так: ЭтапЦиклаВоспроизводства = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка).
  4. Имена системных перечислений платформы: Например, виды договоров контрагентов: ЗНАЧЕНИЕ(Перечисление.ВидыДоговоровКонтрагентов.Покупатель).

Важнейший нюанс: детальные и итоговые записи в пользовательском поле

При настройке пользовательского поля-выражения платформа 1С предлагает нам заполнить две ключевые формулы: Выражение детальных записей и Выражение итоговых записей. Если упустить этот момент, отчет может рассчитывать данные некорректно на уровнях группировок.

Давайте разберем разницу между ними:

Чтобы в группировках выводилось суммарное количество осеменений, в Выражении итоговых записей нам необходимо обязательно агрегировать эти данные, обернув аналогичную формулу в функцию СУММА():


СУММА(Выбор Когда ЭтапЦиклаВоспроизводства = ЗНАЧЕНИЕ(Перечисление.ЭтапыЦикловВоспроизводства.Осеменение) Тогда 1 Иначе 0 Конец)

Такая настройка гарантирует, что на уровне детальных строк у вас будет выводиться 1 или 0, а на уровне итогов — точная сумма всех произошедших событий.

Альтернативный способ без формул: «Пользовательское поле-выбор»

Для пользователей, которые не хотят вручную писать код, разбираться в синтаксисе функции ЗНАЧЕНИЕ() и бояться опечаток в именах метаданных, в СКД предусмотрен отличный визуальный инструмент — Пользовательское поле-выбор. Давайте разберем по шагам, как его настроить:

  1. При добавлении нового пользовательского поля выберите вариант «Новое поле выбор...» вместо поля-выражения.
  2. В открывшейся таблице вариантов добавьте новое условие.
  3. В качестве левого значения укажите поле ЭтапЦиклаВоспроизводства, а вид сравнения выберите «Равно».
  4. В качестве правого значения платформа сама интерактивно откроет список значений нужного перечисления. Вам останется просто кликнуть по значению «Осеменение» мышкой — никаких ручных вводов кода!
  5. В колонке «Значение» для этого варианта укажите 1.
  6. В ветке «Иначе» (для всех остальных случаев) укажите значение 0.

Этот способ полностью исключает возникновение синтаксических ошибок при составлении условий.

Ограничения пользовательских полей по сравнению с вычисляемыми

Часто разработчики путают *пользовательские поля* (создаваемые пользователем или аналитиком непосредственно в режиме «1С:Предприятие») и *вычисляемые поля* (создаваемые программистом в конфигураторе на этапе разработки схемы отчета). Проанализируем ключевые различия между ними:

Особенности синтаксиса имен полей со спецсимволами

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


Выбор
    Когда [Этап цикла воспроизводства] = ЗНАЧЕНИЕ(Перечисление.ЭтапыЦикловВоспроизводства.Осеменение)
    Тогда 1
    Иначе 0
Конец

Если поле состоит из одного слова без пробелов (как в нашем первом примере), квадратные скобки ставить необязательно, но их наличие не будет считаться ошибкой.

Используя эти простые правила, вы сможете легко создавать гибкие, точные и информативные отчеты в СКД любой сложности!

← На главную