Как выбрать группу справочника в параметрах консоли запросов 1С?

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

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

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

Выясним причину: почему консоль «не видит» группы?

Для начала проанализируем ситуацию с точки зрения платформы 1С:Предприятие 8.3. Когда мы открываем стандартную консоль запросов, мы работаем с управляемым приложением. Поле выбора значения в таблице параметров — это обычный элемент формы типа ПолеВвода. У этого элемента есть специфическое свойство — ВыборГруппИЭлементов (ChoiceFoldersAndItems).

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

Рассмотрим типичный запрос, который вызывает затруднение:


ВЫБРАТЬ 
    СвободныеОстаткиОстатки.Номенклатура КАК Номенклатура,
    ЕСТЬNULL(СвободныеОстаткиОстатки.ВНаличииОстаток, 0) КАК ВНАЛИЧИИ
ИЗ
    РегистрНакопления.ТоварыНаСкладах.Остатки(, Склад В ИЕРАРХИИ (&ТоварныеСклады)) КАК СвободныеОстаткиОстатки
УПОРЯДОЧИТЬ ПО
    СвободныеОстаткиОстатки.Номенклатура.Наименование

Когда мы пытаемся заполнить параметр &ТоварныеСклады, консоль не позволяет нам выбрать папку, и мы заходим в тупик. Давайте разберем, как это исправить.

Решение 1: «Доработка напильником» — исправляем код консоли

Если у вас есть возможность открыть консоль запросов как внешнюю обработку в Конфигураторе, это самый правильный и надежный путь. Мы внесем изменения в логику работы формы параметров, чтобы она понимала, когда нам нужны группы.

Проанализируем шаги по исправлению:

  1. Откройте консоль запросов в Конфигураторе.
  2. Найдите основную форму (или форму редактирования параметров, если она вынесена отдельно).
  3. В дереве элементов формы найдите таблицу параметров. Обычно она связана с данными типа ТаблицаЗначений.
  4. Найдите колонку Значение. Это и есть то самое поле, которое не дает нам выбрать группу.
  5. В свойствах этого элемента (поля ввода) найдите параметр Выбор групп и элементов. Установите его в значение Группы и элементы.

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


// При создании или изменении состава параметров
НовыйЭлемент = Элементы.Добавить("ПолеЗначениеПараметра", Тип("ПолеФормы"), Элементы.ТаблицаПараметров);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ПутьКДанным = "Объект.Параметры.Значение";
// Вот ключевая строка:
НовыйЭлемент.ВыборГруппИЭлементов = ИспользованиеВыбораГруппИЭлементов.ГруппыИЭлементы;

После такого исправления любая папка справочника станет доступной для выбора, и ваш запрос отработает корректно.

Решение 2: Обходной путь через временную таблицу (без правки консоли)

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

Рассмотрим, как изменить текст запроса для этого метода:


ВЫБРАТЬ
    Склады.Ссылка КАК Ссылка
ПОМЕСТИТЬ ВТ_НужнаяГруппа
ИЗ
    Справочник.Склады КАК Склады
ГДЕ
    Склады.Код = &КодГруппы;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ 
    СвободныеОстаткиОстатки.Номенклатура КАК Номенклатура,
    СвободныеОстаткиОстатки.ВНаличииОстаток КАК ВНАЛИЧИИ
ИЗ
    РегистрНакопления.ТоварыНаСкладах.Остатки(, 
        Склад В ИЕРАРХИИ (ВЫБРАТЬ Ссылка ИЗ ВТ_НужнаяГруппа)
    ) КАК СвободныеОстаткиОстатки

В этом случае в параметрах консоли вы просто указываете тип Строка и вписываете код папки. Запрос сам найдет нужную ссылку и подставит её в условие В ИЕРАРХИИ. Это универсальный способ, работающий в любой консоли.

Решение 3: Использование предопределенных групп

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

Посмотрим на пример:


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

Этот метод самый быстрый, но он работает только с теми элементами, которые жестко заданы в структуре метаданных.

Анализ типичных ошибок: метод «Родитель»

Некоторые разработчики пытаются использовать конструкцию типа ВЫРАЗИТЬ(&Элемент КАК Справочник.Склады).Родитель. Проанализируем, почему это плохая идея. Во-первых, если вам нужна группа самого верхнего уровня, у неё нет родителя (значение NULL или пустая ссылка), и условие В ИЕРАРХИИ не сработает. Во-вторых, такой подход заставляет вас выбирать в интерфейсе «фиктивный» элемент только для того, чтобы получить его родителя, что крайне неудобно и неочевидно.

Также стоит помнить, что в регистрах остатков, таких как ТоварыНаСкладах, поле Склад обычно имеет тип СправочникСсылка.Склады. Условие В ИЕРАРХИИ эффективно обрабатывается платформой на уровне SQL-запроса, используя вложенные множества или рекурсивные вызовы, поэтому правильная передача папки крайне важна для производительности.

Рекомендация: используйте профессиональный инструмент

Если вы постоянно сталкиваетесь с ограничениями стандартной консоли ИТС, мы рекомендуем обратить внимание на профессиональные инструменты. Они не только решают описанную проблему, но и в целом упрощают быстрый анализ данных. К таким решениям относятся, например, Инструменты разработчика "Инструментики" (удобно через профессиональный набор инструментов разработчика 1С) или другие популярные разработки, такие как модифицированная консоль от Dr.Zombi и bm Консоль запросов. В них такие нюансы, как выбор групп, работа с временными таблицами и отображение типов, продуманы заранее.

Подведем итог: для решения проблемы выбора группы в консоли на управляемых формах лучше всего один раз исправить свойство ВыборГруппИЭлементов в форме обработки. Если же это невозможно — используйте поиск группы по коду внутри самого запроса через временную таблицу. Это сэкономит ваше время и избавит от необходимости совершать лишние действия в интерфейсе.

← На главную