Как правильно указать в запросе СКД в отчет, что нужны элементы из конкретной папки

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

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

Разберем основную проблему: В ИЕРАРХИИ или РАВНО?

Проанализируем стандартную ситуацию. Допустим, у нас есть справочник Контрагенты, и нам нужно вывести только тех, кто находится в папке "Поставщики". Первое, что приходит в голову — написать условие равенства. Однако здесь кроется главная ошибка.

Если мы напишем в запросе ГДЕ Контрагенты.Родитель = &Поставщики, система найдет только те элементы, которые лежат непосредственно в этой папке. Если внутри "Поставщиков" есть подпапки (например, "Оптовые" и "Розничные"), то элементы из этих подпапок в отчет не попадут. Более того, если папка была выбрана неверно или параметр не заполнен, отчет будет пустым.

Правильным подходом является использование оператора В ИЕРАРХИИ. Рассмотрим пример правильного текста запроса:


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

Рассмотрим подробнее, что дает нам это условие. Оператор В ИЕРАРХИИ заставляет систему рекурсивно просмотреть саму выбранную папку и все её дочерние элементы на любом уровне вложенности. Условие ЭтоГруппа = ЛОЖЬ мы добавляем для того, чтобы в самом отчете не выводились названия самих папок, а только конечные карточки контрагентов.

Настройка параметров в Системе компоновки данных

Даже если запрос написан верно, отчет может оставаться пустым, если параметр &Поставщики не определен. Разберем по шагам, как правильно настроить этот параметр в конструкторе СКД:

  1. Перейдем на вкладку Параметры.
  2. Найдем наш параметр Поставщики. Проверим, чтобы тип данных соответствовал СправочникСсылка.Контрагенты.
  3. Обратим внимание на колонку Ограничение доступности. Если мы хотим, чтобы пользователь сам выбирал папку в режиме "1С:Предприятие", галочка здесь стоять не должна.
  4. Чтобы отчет не выдавал ошибку "Не задано значение параметра", можно либо установить значение по умолчанию, либо в настройках отчета на вкладке "Параметры" включить его в Быстрый доступ.

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

Как избежать поиска по наименованию

Часто в обсуждениях предлагают использовать конструкцию ГДЕ Контрагенты.Родитель.Наименование = "Поставщики". Проанализируем, почему это плохое решение:

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

Метод 1: Использование предопределенных элементов

Если папка "Поставщики" является ключевой для логики программы, правильнее всего создать её в конфигураторе как предопределенный элемент. Тогда в запросе или в выражении параметра мы сможем обратиться к ней напрямую:

ЗНАЧЕНИЕ(Справочник.Контрагенты.Поставщики)

Это самый надежный способ, так как ссылка на этот элемент никогда не изменится, как бы пользователь его ни называл.

Метод 2: Поиск по коду или UUID в выражении параметра

Если папка создана пользователем в режиме предприятия, мы можем "привязаться" к её коду или уникальному идентификатору (UUID). В СКД на вкладке Параметры в поле Выражение можно написать код, который выполнится при инициализации отчета:

Справочники.Контрагенты.НайтиПоКоду("00-000001")

Или, что еще более профессионально, использовать поиск по Уникальному Идентификатору, если мы точно знаем его значение:


Справочники.Контрагенты.ПолучитьСсылку(Новый УникальныйИдентификатор("550e8400-e29b-41d4-a716-446655440000"))

Ограничение выбора для пользователя

Чтобы пользователь не мог случайно выбрать в качестве параметра обычного контрагента вместо папки, проделаем следующую настройку в СКД:

В колонке Параметры выбора для нашего параметра добавим условие: Отбор.ЭтоГруппа(Равно, Истина). Теперь при попытке выбрать значение система покажет пользователю только структуру папок, что исключит вероятность ошибки.

Работа с функциональными опциями и константами

Проанализируем еще один продвинутый сценарий. Представим, что для разных филиалов "папка поставщиков" разная. В этом случае жестко прописывать код или наименование нельзя. Рассмотрим решение через Константы:

  1. Создаем константу ОсновнаяГруппаПоставщиков с типом СправочникСсылка.Контрагенты.
  2. В СКД в поле Выражение параметра пишем: Константы.ОсновнаяГруппаПоставщиков.Получить().

Теперь администратор системы может один раз выбрать нужную папку в настройках программы, и отчет будет подхватывать её автоматически без изменения кода конфигурации.

Производительность запросов с иерархией

Важно помнить, что условие В ИЕРАРХИИ создает дополнительную нагрузку на СУБД, так как требует выполнения рекурсивного обхода дерева. Если ваш справочник Контрагенты содержит сотни тысяч записей, такие запросы могут выполняться долго. В таких случаях убедитесь, что:

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

← На главную