Как скрыть неиспользуемые позиции и группы в форме подбора номенклатуры 1С?

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

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

Анализ проблемы: почему изменения в запросе динамического списка не работают?

Часто разработчики пытаются решить задачу жестким редактированием текста запроса динамического списка в конфигураторе (например, добавляя условия вида ГДЕ СправочникНоменклатура.Артикул <> "0"). Однако при запуске подбора в пользовательском режиме эти правки не дают результата, и позиции с артикулом 0 всё равно отображаются в списке.

Проанализируем основные причины, почему так происходит:

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

Способ 1. Программная установка отбора динамического списка (Рекомендуемый)

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

Для программной установки отбора используется общая процедура библиотеки стандартных подсистем (БСП) ОтборыСписковКлиентСервер.УстановитьЭлементОтбораСписка. Рассмотрим работу этой функции подробнее:

В форме подбора номенклатуры (обработка ПодборНоменклатуры) найдём процедуру, ответственную за обновление или установку отбора по иерархии номенклатуры. Обычно это процедура УстановитьОтборПоИерархииНоменклатуры или процедура НастроитьСписок.

Добавим в конец процедуры код установки отборов:


// Установка отбора по строковому артикулу
ОтборыСписковКлиентСервер.УстановитьЭлементОтбораСписка(
	СписокНоменклатуры,
	"Артикул",
	"0",
	ВидСравненияКомпоновкиДанных.НеРавно
);

// Если требуется исключить еще и пустые артикулы
ОтборыСписковКлиентСервер.УстановитьЭлементОтбораСписка(
	СписокНоменклатуры,
	"Артикул",
	"",
	ВидСравненияКомпоновкиДанных.Заполнено
);

Разберем параметры используемого метода:

  1. СписокНоменклатуры — имя динамического списка на форме.
  2. "Артикул" — имя поля компоновки данных, по которому строится условие.
  3. "0" — проверяемое значение реквизита.
  4. ВидСравненияКомпоновкиДанных.НеРавно — оператор сравнения системы компоновки данных (СКД).

Как исключить группу «Архив» из списка подбора?

Чтобы позиции из группы «Архив» (а также сама эта группа) не отображались при подборе, отбор необходимо устанавливать по полю Ссылка с видом сравнения НеВИерархии.

Рассмотрим пример кода для скрытия конкретной папки с помощью её ссылки:


// Получаем ссылку на группу "Архив"
ГруппаАрхив = Справочники.Номенклатура.НайтиПоНаименованию("Архив", Истина);

Если ЗначениеЗаполнено(ГруппаАрхив) Тогда
	ОтборыСписковКлиентСервер.УстановитьЭлементОтбораСписка(
		СписокНоменклатуры,
		"Ссылка",
		ГруппаАрхив,
		ВидСравненияКомпоновкиДанных.НеВИерархии
	);
КонецЕсли;

Способ 2. Реализация через Расширение конфигурации (.cfe)

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

  1. Создадим новое Расширение и добавим в него форму подбора номенклатуры (из обработки ПодборНоменклатуры).
  2. В модуле формы подбора перехватим процедуру НастроитьСписок или ПриСозданииНаСервере с помощью аннотации &После.
  3. Пропишем программную установку отборов.

Пример кода в модуле формы расширения:


&После("НастроитьСписок")
Процедура Расш_НастроитьСписок(ПервичнаяНастройка)

	// Исключаем позиции с артикулом "0"
	ОтборыСписковКлиентСервер.УстановитьЭлементОтбораСписка(
		СписокНоменклатуры,
		"Артикул",
		"0",
		ВидСравненияКомпоновкиДанных.НеРавно
	);

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

КонецПроцедуры

Способ 3. Использование типового реквизита «Скрывать в списках»

В современных релизах 1С:Бухгалтерии 3.0 и других типовых решениях на базе БСП предусмотрен штатный функционал для архивации элементов номенклатуры без необходимости программирования:

  1. В карточке номенклатуры или через групповую обработку реквизитов установите флаг «Недействителен» или «Скрывать в списках».
  2. После этого элемент автоматически перестает отображаться в формах подбора и списках выбора документов.
  3. В случае необходимости в самой форме подбора пользователь может нажать кнопку Ещё — Показывать скрытые товары, чтобы временно увидеть архивные позиций.

Подведем итоги

Мы проанализировали причины, по которым ручное изменение текста запроса в динамических списках подбора номенклатуры не дает нужного результата. Оптимальным решением является использование процедуры ОтборыСписковКлиентСервер.УстановитьЭлементОтбораСписка с видом сравнения ВидСравненияКомпоновкиДанных.НеРавно или оформление доработки в виде отдельного Расширения конфигурации. Это позволяет корректно отфильтровать позиции с артикулом «0» и исключить архивные папки, сохраняя стандартную логику работы системы.

← На главную