Разработка и Конфигурация · 10 мин
1С: конструкция ВЫБОР КОГДА В ИЕРАРХИИ в запросах
Как использовать конструкцию ВЫБОР КОГДА с проверкой В ИЕРАРХИИ в запросах 1С: синтаксис, примеры кода, типичные ошибки и альтернативы для отборов по иерархии.
Конструкция «ВЫБОР КОГДА» в языке запросов 1С позволяет формировать вычисляемые поля по условию, а оператор «В ИЕРАРХИИ» проверяет принадлежность элемента группе справочника с учётом всех вложенных уровней. Их сочетание — типовой приём, когда нужно пометить строки результата по принадлежности к разным веткам иерархии: например, разделить номенклатуру на «товары» и «услуги» по родительским группам или раскрасить отчёт по категориям контрагентов.
Типичная задача выглядит так: есть справочник «Номенклатура» с многоуровневыми группами, и в отчёте нужно вывести колонку «Категория», значение которой зависит от того, в какой ветке находится элемент. Без «ВЫБОР КОГДА» пришлось бы делать несколько запросов или постобработку таблицы в коде, что медленнее и сложнее в сопровождении.
Ниже разобраны синтаксис обеих конструкций, готовые примеры запросов, ограничения оператора «В ИЕРАРХИИ», типичные ошибки и варианты проверки результата. Примеры применимы к управляемым и обычным формам, к консоли запросов и к СКД.
Как работает оператор В ИЕРАРХИИ в запросе 1С
Оператор «В ИЕРАРХИИ» проверяет, находится ли значение ссылочного типа внутри указанной группы на любом уровне вложенности. В отличие от простого сравнения «Родитель = &Группа», он учитывает не только прямых потомков, но и элементы вложенных подгрупп любой глубины.
Синтаксис: Ссылка В ИЕРАРХИИ (&Группа). В качестве параметра можно передать ссылку на группу справочника или список групп. Если передать пустую ссылку или значение неподходящего типа, запрос вернёт ошибку исполнения, поэтому параметр стоит контролировать до выполнения запроса.
Оператор применим только к иерархическим справочникам и планам видов характеристик с иерархией групп. Для плоских справочников или регистров использовать его нельзя — платформа выдаст ошибку ещё на этапе проверки текста запроса в консоли.
Синтаксис ВЫБОР КОГДА в сочетании с В ИЕРАРХИИ
Конструкция «ВЫБОР КОГДА» — аналог CASE в SQL. Внутри неё условие «В ИЕРАРХИИ» используется как обычное логическое выражение, которое можно комбинировать с другими условиями через И, ИЛИ, НЕ.
ВЫБОР
КОГДА Номенклатура В ИЕРАРХИИ (&ГруппаТовары)
ТОГДА "Товары"
КОГДА Номенклатура В ИЕРАРХИИ (&ГруппаУслуги)
ТОГДА "Услуги"
ИНАЧЕ "Прочее"
КОНЕЦ КАК Категория
Порядок веток КОГДА имеет значение: проверка идёт сверху вниз, и срабатывает первое истинное условие. Если группы пересекаются (одна вложена в другую), более специфичное условие следует ставить выше, иначе элемент попадёт в более общую категорию.
Ветка ИНАЧЕ не обязательна, но без неё для элементов вне всех перечисленных групп поле получит значение NULL. Это важно учитывать при последующей группировке или соединении по вычисляемому полю: NULL не объединяется в группу вместе с пустыми строками.
ВЫБРАТЬ
Номенклатура.Ссылка КАК Ссылка,
ВЫБОР
КОГДА Номенклатура.Ссылка В ИЕРАРХИИ (&Группа)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ КАК ВходитВГруппу
ИЗ
Справочник.Номенклатура КАК НоменклатураПрактический пример: категоризация номенклатуры
Рассмотрим законченный сценарий. В справочнике «Номенклатура» есть группы «Материалы», «Готовая продукция» и «Услуги» с вложенными подгруппами. Нужен запрос, который выводит остатки с признаком категории для последующего отбора в отчёте.
- 1Получите ссылки на группы-родители и передайте их в запрос параметрами &ГруппаМатериалы, &ГруппаУслуги
- 2Сформируйте текст запроса с ВЫБОР КОГДА по каждой группе, расположив условия от частного к общему
- 3Добавьте ветку ИНАЧЕ со значением по умолчанию, чтобы избежать NULL
- 4Выполните запрос в консоли и сверьте количество строк по категориям с данными справочника
- 5Перенесите проверенный текст в модуль или в набор данных СКД
ВЫБРАТЬ
Остатки.Номенклатура КАК Номенклатура,
Остатки.КоличествоОстаток КАК Остаток,
ВЫБОР
КОГДА Остатки.Номенклатура В ИЕРАРХИИ (&ГруппаМатериалы)
ТОГДА "Материалы"
КОГДА Остатки.Номенклатура В ИЕРАРХИИ (&ГруппаУслуги)
ТОГДА "Услуги"
ИНАЧЕ "Прочее"
КОНЕЦ КАК Категория
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки КАК Остатки
Обратите внимание: проверка «В ИЕРАРХИИ» выполняется по ссылке на элемент номенклатуры, а не по полю «Родитель». Платформа сама разворачивает иерархию, и вложенность любой глубины обрабатывается корректно.
Отбор по иерархии в условии ГДЕ и в параметрах СКД
Тот же оператор работает и в секции ГДЕ, если задача — не пометить строки, а отобрать их. Например: ГДЕ Номенклатура В ИЕРАРХИИ (&Группа). Это стандартный способ фильтрации по ветке справочника, и он обычно предпочтительнее вычисляемого поля, если категория в результате не нужна.
В СКД параметр с видом сравнения «В иерархии» настраивается на закладке «Настройки» без изменения текста запроса: достаточно вынести поле в отбор. Но если логика сложнее — например, разные группы должны давать разные вычисляемые колонки — конструкция «ВЫБОР КОГДА … В ИЕРАРХИИ» в тексте набора данных остаётся основным инструментом.
Сравнение вариантов
Подходит, когда нужна вычисляемая колонка с категорией. Ограничение: группы жёстко заданы параметрами, при появлении новых веток запрос придётся менять.
Подходит для простой фильтрации по одной ветке. Не даёт пометить строки, только отсекает лишние.
Подходит при большом числе категорий или когда соответствие задаёт пользователь. Требует отдельного регистра или временной таблицы.
Ограничения и производительность
Оператор «В ИЕРАРХИИ» при выполнении фактически превращается в проверку по набору значений родителей, и на больших справочниках с глубокой иерархией это может замедлять запрос. Если вычисляемое поле используется в соединениях или группировках, стоит проверить план запроса на реальных данных.
Есть несколько практических ограничений, о которых часто забывают:
- параметр должен быть ссылкой на группу того же справочника, что и проверяемое поле, иначе будет ошибка типов;
- для справочников с иерархией «элементов» (без групп) оператор работает иначе и применяется редко;
- проверка по списку групп в одном условии возможна, но читаемость запроса при этом падает — лучше несколько веток КОГДА;
- значение NULL в проверяемом поле всегда даёт ЛОЖЬ, что нужно учитывать для необязательных реквизитов.
Типичные ошибки и как их избежать
Большинство проблем с этой конструкцией связано не с синтаксисом, а с данными и порядком условий. Ниже — ошибки, которые встречаются чаще всего.
Отдельно стоит сказать про хранение ссылок на группы. Жёстко зашивать уникальные идентификаторы групп в код нельзя — при переносе данных между базами они изменятся. Надёжнее находить группу по предопределённому имени, по коду или хранить соответствие в настройках отчёта.
Проверка результата запроса
После написания запроса результат нужно сверить с фактической структурой справочника. Самый простой способ — выполнить запрос в консоли, сгруппировать итоги по вычисляемому полю «Категория» и сравнить количество элементов с ручной выборкой по группе в форме списка справочника.
Как проверить результат
Совпадает с числом элементов в группе и всех её подгруппах в форме списка
Меньше — вероятно, использовано сравнение с Родителем или неверный порядок КОГДА
NULL отсутствует, у всех строк заполненная категория
Есть NULL — не хватает ветки ИНАЧЕ или поле ссылки пустое
Попадает в категорию родительской группы верхнего уровня
Помечен как 'Прочее' — проверка идёт не по иерархии
Если отчёт строится на СКД, дополнительно проверьте, что вычисляемое поле не конфликтует с ресурсами и что отборы пользователя не обрезают данные до применения «ВЫБОР КОГДА». Порядок применения отборов и вычисляемых полей в СКД иногда даёт неочевидный результат, который проще всего отловить на небольшом тестовом наборе из пяти-шести элементов в разных ветках.
Что важно запомнить
ВЫБОР КОГДА с условием В ИЕРАРХИИ — стандартный способ пометить строки запроса по принадлежности к веткам иерархического справочника. Ключевые правила: передавать в параметр ссылку на группу, располагать условия от частного к общему, всегда добавлять ИНАЧЕ и проверять результат сверкой с формой списка справочника.
Частые вопросы
Можно ли передать в В ИЕРАРХИИ список групп?
Да, параметр может быть списком значений или массивом ссылок на группы — тогда условие истинно для элемента, входящего хотя бы в одну из них. Однако при большом числе групп читаемость и скорость падают, и лучше рассмотреть временную таблицу соответствий.
Почему В ИЕРАРХИИ не срабатывает, хотя группа указана верно?
Чаще всего причина в типе параметра: передана ссылка на элемент, а не на группу, либо ссылка другого справочника. Также проверьте, что проверяемое поле — именно ссылка на иерархический справочник, а не строковый код или наименование.
Чем В ИЕРАРХИИ отличается от проверки Родитель = &Группа?
Сравнение с родителем находит только элементы первого уровня вложенности. В ИЕРАРХИИ учитывает все уровни: подгруппы, подгруппы подгрупп и так далее без ограничения глубины.
Работает ли конструкция в динамических списках?
Да, и в тексте запроса динамического списка, и в его отборе можно использовать В ИЕРАРХИИ. Для отбора пользователем достаточно выбрать вид сравнения «В иерархии» в настройках списка без изменения запроса.
Как избежать изменения запроса при появлении новых групп?
Если состав категорий часто меняется, замените жёстко заданные параметры на соединение с регистром сведений или временной таблицей, где каждой группе сопоставлена категория. Тогда настройку сможет менять пользователь без доработки кода.
Влияет ли В ИЕРАРХИИ на скорость запроса?
На небольших справочниках влияние незаметно. На больших таблицах с глубокой иерархией и соединениями запрос может замедляться, поэтому тяжёлые отчёты стоит проверять на копии базы и при необходимости выносить проверку во временную таблицу с индексацией.