Почему в динамическом списке не отображаются товары при выборе папок и как это исправить?

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

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

Ошибки в логике работы обработчиков формы

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

  1. Неверно выбранное событие: Процедура ПриОткрытии выполняется ровно один раз в момент инициализации формы на клиенте. Когда пользователь в дальнейшем кликает мышью по узлам дерева ИерархияНоменклатуры, этот код больше не срабатывает. Интерактивную фильтрацию необходимо привязывать к событию активизации строки дерева.
  2. Отсутствие активации отбора: При добавлении первого элемента отбора по полю Ссылка с видом сравнения ВИерархии не было установлено свойство Использование = Истина;. Без явного включения платформа не применяет созданное условие.
  3. Неопределенное значение текущей строки: В момент вызова события ПриОткрытии таблица на клиенте еще не успевает спозиционироваться на первой строке. Вызов Элементы.ИерархияНоменклатуры.ТекущиеДанные возвращает Неопределено, в результате чего блок условия Если полностью пропускается.
  4. Сброс типовых настроек: Вызов метода СписокНоменклатура.Отбор.Элементы.Очистить() удаляет абсолютно все предустановленные фильтры динамического списка, включая системные отборы конфигурации (например, скрытие помеченных на удаление или недействующих позиций).

Конфликт режима иерархического просмотра и отбора по иерархии

Главная архитектурная причина, из-за которой список не показывает товары при наложении отбора, заключается в механизме работы динамических списков платформы «1С:Предприятие». Выясним причину этой коллизии подробнее.

Когда таблица формы отображает динамический список в режиме «Иерархический список» или «Дерево», платформа на внутреннем уровне неявно фильтрует данные по текущему родителю (свойство ТекущийРодитель). Если на такой список дополнительно наложить отбор вида Ссылка В Иерархии [ТекущаяГруппа], возникает логический конфликт:

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

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

Пошаговое решение проблемы

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

Шаг 1. Переключение режима просмотра динамического списка

В свойствах таблицы динамического списка (в палитре свойств или программно) переключим режим отображения с иерархического списка на обычный список. В коде это выглядит следующим образом:

Элементы.СписокНоменклатура.Отображение = ОтображениеТаблицы.Список;

Пользователь также может сделать это интерактивно через меню «Еще — Режим просмотра — Список».

Шаг 2. Перенос логики в событие активизации строки дерева

Создадим для таблицы формы ИерархияНоменклатуры обработчик события ПриАктивизацииСтроки. Именно здесь мы будем отслеживать смену выбранной папки и применять фильтр к правому списку.

Шаг 3. Корректная установка отбора

В конфигурациях на базе БСП (включая «1С:Управление торговлей 11») для управления элементами компоновщика динамического списка рекомендуется использовать стандартные процедуры БСП, чтобы не затирать пользовательские настройки. Рассмотрим пример правильного кода:


&НаКлиенте
Процедура ИерархияНоменклатурыПриАктивизацииСтроки(Элемент)
	
	ТекущиеДанныеДерева = Элемент.ТекущиеДанные;
	Если ТекущиеДанныеДерева = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	УстановитьОтборПоПапке(ТекущиеДанныеДерева.Ссылка);
	
КонецПроцедуры

&НаКлиенте
Процедура УстановитьОтборПоПапке(ВыбраннаяГруппа)
	
	// Используем типовую функцию БСП для безопасной модификации отбора
	ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(
		СписокНоменклатура,
		"Ссылка",
		ВыбраннаяГруппа,
		ВидСравненияКомпоновкиДанных.ВИерархии,
		,
		ЗначениеЗаполнено(ВыбраннаяГруппа)
	);
	
	// Скрываем сами группы, чтобы в списке были видны только товары
	ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(
		СписокНоменклатура,
		"ЭтоГруппа",
		Ложь,
		ВидСравненияКомпоновкиДанных.Равно,
		,
		Истина
	);
	
КонецПроцедуры

Особенности типовых механизмов навигации в УТ 11

Проанализируем также типовой функционал конфигурации «Управление торговлей 11», так как самостоятельное переопределение отборов в коде может вступить в конфликт с базовой логикой конфигурации:

  1. Режим навигации формы: Типовая форма списка номенклатуры содержит встроенный переключатель между вариантами «Навигация по видам и свойствам» и «Навигация по иерархии». Если навигация переключена на виды и свойства, стандартные папки каталога не влияют на список. Проверьте режим отображения командной панели перед изменением логики.
  2. Связь через параметры динамического списка: В типовых формах связь дерева и списка обычно реализована не через произвольные элементы СКД, а через параметры запроса динамического списка. Переопределение отбора вручную может сбивать штатный механизм обновления при смене страниц навигации.
  3. Ограничения доступа (RLS): Если в информационной базе включено ограничение прав на уровне записей по группам доступа номенклатуры, товары из определенных категорий могут не выводиться пользователю независимо от настроек отбора и режима иерархии.
← На главную