Как получить список номенклатуры из группы и обойти ошибку «укажите элемент, а не группу» в консоли запросов?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Анализ исходной ситуации и причины ошибки

Рассмотрим типичный запрос, который часто приводится в обучающей литературе, например, в книгах Е. Хрусталевой:


ВЫБРАТЬ
    Номенклатура.Код КАК Код,
    Номенклатура.Наименование КАК Наименование,
    Номенклатура.ЗакупочнаяЦена КАК ЗакупочнаяЦена
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.Родитель = &Группа

С точки зрения синтаксиса языка запросов 1С, здесь нет ошибок. Однако при попытке выполнить этот код в консоли запросов и указать в параметре &Группа конкретную папку справочника, платформа блокирует выбор. Выясним причину этого поведения. Проблема кроется не в самом запросе, а в настройках интерфейса управляемой формы консоли.

В платформе 1С для каждого поля ввода существует свойство ВыборГруппИЭлементов. Проанализируем ситуацию: если в метаданных справочника или в программном коде консоли это свойство установлено в значение Элементы, то платформа просто не позволит вам интерактивно выбрать папку. В современных релизах платформы значение Авто часто интерпретируется именно как «Только элементы», если система не может однозначно определить контекст использования параметра. Таким образом, мы имеем дело с ограничением инструмента (консоли), а не с ошибкой в логике запроса.

Способ 1: Использование оператора В ИЕРАРХИИ

Проанализируем наиболее правильный с точки зрения платформы способ получения данных из групп. Если нам нужно получить не только элементы, находящиеся непосредственно в папке, но и все содержимое вложенных подпапок, следует использовать оператор В ИЕРАРХИИ. Рассмотрим пример:


ВЫБРАТЬ
    Номенклатура.Ссылка,
    Номенклатура.Наименование
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.Ссылка В ИЕРАРХИИ(&Группа)

Преимущество этого метода заключается в том, что многие консоли запросов, анализируя текст запроса и видя конструкцию В ИЕРАРХИИ, автоматически переключают режим выбора параметра в положение «Группы и элементы». Кроме того, это решение более универсально для иерархических справочников.

Способ 2: Обход ограничения через реквизиты (Поиск по коду)

Если консоль упорно не дает выбрать группу, мы можем применить «обходной маневр». Вместо того чтобы передавать в запрос ссылку на группу, мы можем передать ее уникальный идентификатор, код или наименование. Разберем, как это реализовать на практике:


ВЫБРАТЬ
    Номенклатура.Наименование
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.Родитель.Код = &КодГруппы

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

Способ 3: Фильтрация только элементов (Исключение папок из результата)

Часто при получении списка номенклатуры из группы нас интересуют только сами товары, а не вложенные папки. Для этого в условие ГДЕ необходимо добавить проверку на тип записи. Посмотрим на доработанный запрос:


ВЫБРАТЬ
    Номенклатура.Код,
    Номенклатура.Наименование
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.Родитель = &Группа
    И НЕ Номенклатура.ЭтоГруппа

Использование конструкции НЕ Номенклатура.ЭтоГруппа (или Номенклатура.ЭтоГруппа = ЛОЖЬ) является хорошим тоном в разработке на 1С, так как это гарантирует, что в ваш итоговый список (например, для печатной формы или отчета) не попадут служебные записи групп.

Способ 4: Использование предопределенных групп

Если ваша задача — получить данные из группы, которая создана в конфигураторе как предопределенная, вы можете вообще отказаться от использования параметров. Выясним, как обратиться к такой группе напрямую в тексте запроса, используя конструкцию ЗНАЧЕНИЕ:


ВЫБРАТЬ
    Товары.Наименование
ИЗ
    Справочник.Номенклатура КАК Товары
ГДЕ
    Товары.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ИмяВашейПредопределеннойГруппы)

Этот метод полностью снимает проблему выбора параметра в консоли, так как ссылка определяется системой на этапе компиляции запроса.

Технические рекомендации по работе с консолями

Рассмотрим ситуацию, когда вам принципиально нужно использовать именно ту консоль, которая выдает ошибку. Специалисты рекомендуют следующие шаги:

  1. Смена инструмента: Попробуйте использовать альтернативные решения, такие как Консоль запросов УФ 8.3.2.24.22 (мод от Dr.Zombi) или bm Консоль запросов для управляемых форм. Многие из них позволяют принудительно изменить тип параметра и режим выбора прямо в таблице параметров.
  2. Доработка консоли: Если у вас есть доступ к коду консоли, найдите форму, где редактируются параметры запроса. У реквизита, отвечающего за значение параметра, в свойствах или программно при создании (ПриСозданииНаСервере) нужно установить ВыборГруппИЭлементов.ГруппыИЭлементы.
  3. Использование расширенного поиска: В некоторых случаях удобно использовать инструменты разработчика "Инструментики" для тонкого клиента 1С, где механизмы работы с параметрами реализованы более гибко, что позволяет обходить ошибку, даже если вы выбираете группу напрямую.

Подведем итог: Ошибка «укажите элемент, а не группу» в 99% случаев является особенностью реализации интерфейса конкретной консоли запросов в условиях работы на управляемых формах 8.3. Для успешного решения задачи рекомендуется использовать оператор В ИЕРАРХИИ или передавать в запрос свойства родителя (код, артикул), а также всегда фильтровать результат по признаку ЭтоГруппа, если вам нужны только конечные элементы номенклатуры.

← На главную