При активной работе с номенклатурным справочником в программе 1С со временем накапливаются архивные позиции, товары без артикулов или элементы, с которыми работа больше не ведется. Когда пользователь формирует документы (например, накладные, счета на оплату или реализацию) и открывает форму подбора, лишние позиции мешают быстрому поиску. В этой статье мы подробно разберем, как скрыть архивные папки и позиций с нулевым или отсутствующим артикулом при подборе номенклатуры.
Часто разработчики пытаются решить задачу жестким редактированием текста запроса динамического списка в конфигураторе (например, добавляя условия вида ГДЕ СправочникНоменклатура.Артикул <> "0"). Однако при запуске подбора в пользовательском режиме эти правки не дают результата, и позиции с артикулом 0 всё равно отображаются в списке.
Проанализируем основные причины, почему так происходит:
НастроитьСписок, ПодготовитьПараметрыСпискаНоменклатуры или УстановитьТекстыЗапросовСписковФормыПодбора). Изменения, внесенные ручным способом в свойства реквизита формы, просто затираются при выполнении кода программы.Артикул в справочнике СправочникСсылка.Номенклатура имеет тип Строка. Если позиция содержит значение "0 " или " 0" (значение с пробелами), жесткое сравнение Артикул = "0" или Артикул = "" вернет Ложь.НЕ ЭтоГруппа), дерево папок может работать некорректно, либо товары внутри существующих папок перестанут корректно отфильтровываться при переключении между группами.Наиболее правильный подход к управлению отображением элементов в динамических списках 1С — это программная установка компонентов отбора с помощью типового механизма компоновки данных. Рассмотрим, как установить отбор по артикулу и исключить группы архивной номенклатуры.
Для программной установки отбора используется общая процедура библиотеки стандартных подсистем (БСП) ОтборыСписковКлиентСервер.УстановитьЭлементОтбораСписка. Рассмотрим работу этой функции подробнее:
В форме подбора номенклатуры (обработка ПодборНоменклатуры) найдём процедуру, ответственную за обновление или установку отбора по иерархии номенклатуры. Обычно это процедура УстановитьОтборПоИерархииНоменклатуры или процедура НастроитьСписок.
Добавим в конец процедуры код установки отборов:
// Установка отбора по строковому артикулу
ОтборыСписковКлиентСервер.УстановитьЭлементОтбораСписка(
СписокНоменклатуры,
"Артикул",
"0",
ВидСравненияКомпоновкиДанных.НеРавно
);
// Если требуется исключить еще и пустые артикулы
ОтборыСписковКлиентСервер.УстановитьЭлементОтбораСписка(
СписокНоменклатуры,
"Артикул",
"",
ВидСравненияКомпоновкиДанных.Заполнено
);
Разберем параметры используемого метода:
СписокНоменклатуры — имя динамического списка на форме."Артикул" — имя поля компоновки данных, по которому строится условие."0" — проверяемое значение реквизита.ВидСравненияКомпоновкиДанных.НеРавно — оператор сравнения системы компоновки данных (СКД).Чтобы позиции из группы «Архив» (а также сама эта группа) не отображались при подборе, отбор необходимо устанавливать по полю Ссылка с видом сравнения НеВИерархии.
Рассмотрим пример кода для скрытия конкретной папки с помощью её ссылки:
// Получаем ссылку на группу "Архив"
ГруппаАрхив = Справочники.Номенклатура.НайтиПоНаименованию("Архив", Истина);
Если ЗначениеЗаполнено(ГруппаАрхив) Тогда
ОтборыСписковКлиентСервер.УстановитьЭлементОтбораСписка(
СписокНоменклатуры,
"Ссылка",
ГруппаАрхив,
ВидСравненияКомпоновкиДанных.НеВИерархии
);
КонецЕсли;
Чтобы сохранить типовую конфигурацию на поддержке и не вносить изменения в основной код программы, разберем реализацию этой доработки через расширение конфигурации.
ПодборНоменклатуры).НастроитьСписок или ПриСозданииНаСервере с помощью аннотации &После.Пример кода в модуле формы расширения:
&После("НастроитьСписок")
Процедура Расш_НастроитьСписок(ПервичнаяНастройка)
// Исключаем позиции с артикулом "0"
ОтборыСписковКлиентСервер.УстановитьЭлементОтбораСписка(
СписокНоменклатуры,
"Артикул",
"0",
ВидСравненияКомпоновкиДанных.НеРавно
);
// Исключаем архивные товары
СсылкаНаАрхив = Справочники.Номенклатура.НайтиПоНаименованию("Архив");
Если ЗначениеЗаполнено(СсылкаНаАрхив) Тогда
ОтборыСписковКлиентСервер.УстановитьЭлементОтбораСписка(
СписокНоменклатуры,
"Ссылка",
СсылкаНаАрхив,
ВидСравненияКомпоновкиДанных.НеВИерархии
);
КонецЕсли;
КонецПроцедуры
В современных релизах 1С:Бухгалтерии 3.0 и других типовых решениях на базе БСП предусмотрен штатный функционал для архивации элементов номенклатуры без необходимости программирования:
Мы проанализировали причины, по которым ручное изменение текста запроса в динамических списках подбора номенклатуры не дает нужного результата. Оптимальным решением является использование процедуры ОтборыСписковКлиентСервер.УстановитьЭлементОтбораСписка с видом сравнения ВидСравненияКомпоновкиДанных.НеРавно или оформление доработки в виде отдельного Расширения конфигурации. Это позволяет корректно отфильтровать позиции с артикулом «0» и исключить архивные папки, сохраняя стандартную логику работы системы.