При разработке отчетов на Системе компоновки данных (СКД) начинающие программисты часто сталкиваются с ситуацией, когда попытка отобрать элементы из определенной папки (группы) справочника приводит к пустому результату. Это происходит из-за непонимания механики работы иерархических запросов и способов передачи параметров. В этой статье мы подробно разберем, как правильно настроить отбор по папке, чтобы отчет работал корректно и был устойчив к изменениям в данных.
Проанализируем стандартную ситуацию. Допустим, у нас есть справочник Контрагенты, и нам нужно вывести только тех, кто находится в папке "Поставщики". Первое, что приходит в голову — написать условие равенства. Однако здесь кроется главная ошибка.
Если мы напишем в запросе ГДЕ Контрагенты.Родитель = &Поставщики, система найдет только те элементы, которые лежат непосредственно в этой папке. Если внутри "Поставщиков" есть подпапки (например, "Оптовые" и "Розничные"), то элементы из этих подпапок в отчет не попадут. Более того, если папка была выбрана неверно или параметр не заполнен, отчет будет пустым.
Правильным подходом является использование оператора В ИЕРАРХИИ. Рассмотрим пример правильного текста запроса:
ВЫБРАТЬ
Контрагенты.Ссылка КАК Ссылка,
Контрагенты.Наименование КАК Наименование,
Контрагенты.ИНН КАК ИНН
ИЗ
Справочник.Контрагенты КАК Контрагенты
ГДЕ
Контрагенты.Ссылка В ИЕРАРХИИ(&Поставщики)
И Контрагенты.ЭтоГруппа = ЛОЖЬ
Рассмотрим подробнее, что дает нам это условие. Оператор В ИЕРАРХИИ заставляет систему рекурсивно просмотреть саму выбранную папку и все её дочерние элементы на любом уровне вложенности. Условие ЭтоГруппа = ЛОЖЬ мы добавляем для того, чтобы в самом отчете не выводились названия самих папок, а только конечные карточки контрагентов.
Даже если запрос написан верно, отчет может оставаться пустым, если параметр &Поставщики не определен. Разберем по шагам, как правильно настроить этот параметр в конструкторе СКД:
Поставщики. Проверим, чтобы тип данных соответствовал СправочникСсылка.Контрагенты.Посмотрим на ситуацию, когда параметр может быть не выбран. Если мы хотим, чтобы при незаполненном параметре выводились вообще все контрагенты, нам поможет механизм Автозаполнения СКД. В этом случае СКД сама модифицирует запрос, убирая условие ГДЕ, если галочка напротив параметра в настройках отчета снята.
Часто в обсуждениях предлагают использовать конструкцию ГДЕ Контрагенты.Родитель.Наименование = "Поставщики". Проанализируем, почему это плохое решение:
Вместо этого лучше использовать более надежные методы идентификации папки. Выясним, какие варианты у нас есть.
Если папка "Поставщики" является ключевой для логики программы, правильнее всего создать её в конфигураторе как предопределенный элемент. Тогда в запросе или в выражении параметра мы сможем обратиться к ней напрямую:
ЗНАЧЕНИЕ(Справочник.Контрагенты.Поставщики)
Это самый надежный способ, так как ссылка на этот элемент никогда не изменится, как бы пользователь его ни называл.
Если папка создана пользователем в режиме предприятия, мы можем "привязаться" к её коду или уникальному идентификатору (UUID). В СКД на вкладке Параметры в поле Выражение можно написать код, который выполнится при инициализации отчета:
Справочники.Контрагенты.НайтиПоКоду("00-000001")
Или, что еще более профессионально, использовать поиск по Уникальному Идентификатору, если мы точно знаем его значение:
Справочники.Контрагенты.ПолучитьСсылку(Новый УникальныйИдентификатор("550e8400-e29b-41d4-a716-446655440000"))
Чтобы пользователь не мог случайно выбрать в качестве параметра обычного контрагента вместо папки, проделаем следующую настройку в СКД:
В колонке Параметры выбора для нашего параметра добавим условие: Отбор.ЭтоГруппа(Равно, Истина). Теперь при попытке выбрать значение система покажет пользователю только структуру папок, что исключит вероятность ошибки.
Проанализируем еще один продвинутый сценарий. Представим, что для разных филиалов "папка поставщиков" разная. В этом случае жестко прописывать код или наименование нельзя. Рассмотрим решение через Константы:
ОсновнаяГруппаПоставщиков с типом СправочникСсылка.Контрагенты.Константы.ОсновнаяГруппаПоставщиков.Получить().Теперь администратор системы может один раз выбрать нужную папку в настройках программы, и отчет будет подхватывать её автоматически без изменения кода конфигурации.
Важно помнить, что условие В ИЕРАРХИИ создает дополнительную нагрузку на СУБД, так как требует выполнения рекурсивного обхода дерева. Если ваш справочник Контрагенты содержит сотни тысяч записей, такие запросы могут выполняться долго. В таких случаях убедитесь, что:
Родитель проиндексировано (в стандартных справочниках 1С это так по умолчанию).Организации или Периоду, чтобы уменьшить объем обрабатываемых данных.Подведем итог: для корректного отбора элементов из конкретной папки в СКД всегда используйте оператор В ИЕРАРХИИ, избегайте поиска по наименованию и не забывайте проверять заполнение параметров в настройках отчета в режиме пользователя.