При доработке форм справочников в конфигурации «1С:Управление торговлей 11» разработчики часто реализуют двухпанельный интерфейс: слева находится дерево групп номенклатуры, а справа — динамический список позиций. Нередко возникает ситуация, когда при переходе по папкам список товаров остается пустым либо в нем отображаются далеко не все вложенные элементы. Проанализируем причины такого поведения платформы, разберем типовые ошибки в программном коде и рассмотрим правильные варианты реализации отбора.
Посмотрим на исходный пример, в котором разработчик пытается наложить отбор на динамический список. В представленном фрагменте допущено сразу несколько критических ошибок, блокирующих нормальную работу формы:
ПриОткрытии выполняется ровно один раз в момент инициализации формы на клиенте. Когда пользователь в дальнейшем кликает мышью по узлам дерева ИерархияНоменклатуры, этот код больше не срабатывает. Интерактивную фильтрацию необходимо привязывать к событию активизации строки дерева.Ссылка с видом сравнения ВИерархии не было установлено свойство Использование = Истина;. Без явного включения платформа не применяет созданное условие.ПриОткрытии таблица на клиенте еще не успевает спозиционироваться на первой строке. Вызов Элементы.ИерархияНоменклатуры.ТекущиеДанные возвращает Неопределено, в результате чего блок условия Если полностью пропускается.СписокНоменклатура.Отбор.Элементы.Очистить() удаляет абсолютно все предустановленные фильтры динамического списка, включая системные отборы конфигурации (например, скрытие помеченных на удаление или недействующих позиций).Главная архитектурная причина, из-за которой список не показывает товары при наложении отбора, заключается в механизме работы динамических списков платформы «1С:Предприятие». Выясним причину этой коллизии подробнее.
Когда таблица формы отображает динамический список в режиме «Иерархический список» или «Дерево», платформа на внутреннем уровне неявно фильтрует данные по текущему родителю (свойство ТекущийРодитель). Если на такой список дополнительно наложить отбор вида Ссылка В Иерархии [ТекущаяГруппа], возникает логический конфликт:
ЭтоГруппа = Ложь, платформа исключает сами папки из вывода. В иерархическом режиме это приводит к тому, что подпапки скрываются, а вместе с ними исчезает доступ и ко всем товарам, лежащим глубже первого уровня.Для того чтобы условие ВИерархии показало все вложенные товары выбранной ветки, необходимо отключить иерархический просмотр динамического списка. Список должен отображаться в плоском виде — как простой перечень элементов без папок.
Разберем по шагам, как правильно настроить форму для синхронизации дерева групп и списка номенклатуры.
Шаг 1. Переключение режима просмотра динамического списка
В свойствах таблицы динамического списка (в палитре свойств или программно) переключим режим отображения с иерархического списка на обычный список. В коде это выглядит следующим образом:
Элементы.СписокНоменклатура.Отображение = ОтображениеТаблицы.Список;
Пользователь также может сделать это интерактивно через меню «Еще — Режим просмотра — Список».
Шаг 2. Перенос логики в событие активизации строки дерева
Создадим для таблицы формы ИерархияНоменклатуры обработчик события ПриАктивизацииСтроки. Именно здесь мы будем отслеживать смену выбранной папки и применять фильтр к правому списку.
Шаг 3. Корректная установка отбора
В конфигурациях на базе БСП (включая «1С:Управление торговлей 11») для управления элементами компоновщика динамического списка рекомендуется использовать стандартные процедуры БСП, чтобы не затирать пользовательские настройки. Рассмотрим пример правильного кода:
&НаКлиенте
Процедура ИерархияНоменклатурыПриАктивизацииСтроки(Элемент)
ТекущиеДанныеДерева = Элемент.ТекущиеДанные;
Если ТекущиеДанныеДерева = Неопределено Тогда
Возврат;
КонецЕсли;
УстановитьОтборПоПапке(ТекущиеДанныеДерева.Ссылка);
КонецПроцедуры
&НаКлиенте
Процедура УстановитьОтборПоПапке(ВыбраннаяГруппа)
// Используем типовую функцию БСП для безопасной модификации отбора
ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(
СписокНоменклатура,
"Ссылка",
ВыбраннаяГруппа,
ВидСравненияКомпоновкиДанных.ВИерархии,
,
ЗначениеЗаполнено(ВыбраннаяГруппа)
);
// Скрываем сами группы, чтобы в списке были видны только товары
ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(
СписокНоменклатура,
"ЭтоГруппа",
Ложь,
ВидСравненияКомпоновкиДанных.Равно,
,
Истина
);
КонецПроцедуры
Проанализируем также типовой функционал конфигурации «Управление торговлей 11», так как самостоятельное переопределение отборов в коде может вступить в конфликт с базовой логикой конфигурации: