При разработке и настройке отчетов в 1С (особенно в конфигурациях на обычных формах, таких как Управление Торговлей 10.3) разработчики часто сталкиваются с задачей реализации удобного отбора номенклатуры. Пользователям требуется отбирать данные не только по конкретным товарам или одной папке, но и указывать сразу несколько групп элементов одновременно. В этой статье мы подробно разберем, как правильно реализовать фильтрацию вида "В списке" и "В группе из списка" в запросах и отчетах 1С.
Прежде чем переходить к написанию кода и настройке запросов, проанализируем, чем отличаются основные виды сравнения при работе со справочниками, имеющими иерархическую структуру:
ВидСравнения.ВСписке) — проверяет точное совпадение элементов. Если добавить в такой список папку справочника, то в результат попадут только те записи, где явно указана сама эта папка, но не товары внутри нее.ВидСравнения.ВИерархии) — выбирает конкретную папку и все вложенные в нее подгруппы и товары (на всю глубину иерархии).ВидСравнения.ВГруппеИзСписка) — позволяет передать список, состоящий из нескольких групп и отдельных элементов. В итоговую выборку попадут все товары, входящие в любую из выбранных папок или подпапок, а также одиночные элементы из списка.Рассмотрим, как данная логика реализуется на уровне языка запросов 1С. В языке запросов нет отдельной конструкции "В ГРУППЕ ИЗ СПИСКА". Вместо этого используется универсальный оператор В ИЕРАРХИИ.
Синтаксис условия в секции ГДЕ выглядит следующим образом:
ГДЕ
ОстаткиТоваров.Номенклатура В ИЕРАРХИИ(&СписокНоменклатуры)
Разберем подробнее, как платформа 1С обрабатывает параметр &СписокНоменклатуры:
&СписокНоменклатуры передается объект типа СписокЗначений или Массив.СправочникСсылка.Номенклатура.Если отчет разрабатывается в конфигурации Управление Торговлей 10.3 с использованием построителя отчетов (объект ПостроительОтчета) или универсального отчета, необходимо правильно прописать секцию описания настроек построителя в тексте запроса.
Разберем пример запроса для построителя отчета:
ВЫБРАТЬ
ТоварыНаСкладах.Номенклатура КАК Номенклатура,
ТоварыНаСкладах.Склад КАК Склад,
ТоварыНаСкладах.КоличествоОстаток КАК КоличествоОстаток
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладах
{ГДЕ
ТоварыНаСкладах.Номенклатура.* КАК Номенклатура}
Обратите внимание на синтаксический элемент .* после имени поля: ТоварыНаСкладах.Номенклатура.*. Указание спецсимволов .* сообщают построителю отчета, что для данного поля доступна иерархия, а значит пользователь сможет применять виды сравнения В группе и В группе из списка в интерактивной настройке отбора.
Выясним еще одну важную деталь, с которой часто сталкиваются разработчики при выгрузке списка значений на форму. Если вы используете элемент формы (поле ввода) со типом СписокЗначений для выбора параметров отбора, необходимо разрешить пользователю выбирать не только элементы, но и группы справочника.
Для этого выполним следующие шаги:
ВыборГруппИЭлементов.Группы и элементы (по умолчанию часто установлено значение Элементы, что заблокирует возможность выборки папок пользователем).Также этот параметр можно задать программно при инициализации формы:
ЭлементыФормы.ПолеОтбораНоменклатура.ВыборГруппИЭлементов = ВыборГруппИЭлементов.ГруппыИЭлементы;
Если отчет разрабатывается с использованием Системы компоновки данных (СКД), настройка иерархического отбора упрощается:
Номенклатура.В группе из списка.Проанализируем практические особенности работы с иерархическими отборами, которые важно учитывать при эксплуатации системы:
В ИЕРАРХИИ (&ПустойСписок) пустой список значений, запрос вернет пустой результат (ни одной строки). При написании своего кода на языке запросов следует проверять заполненность списка перед выполнением запроса или формировать текст запроса динамически. СКД и Построитель отчета обрабатывают пустые отборы автоматически.В ИЕРАРХИИ создает дополнительную нагрузку на СУБД (MS SQL Server, PostgreSQL), так как платформе требуется строить разворот иерархии деревовидной структуры. Если в качестве отбора передается список из нескольких десятков крупных групп номенклатуры, это может приводить к замедлению работы отчета.