Как исключить определенную номенклатуру из списка автоподбора при вводе в табличной части

Программист 1С v8.3 (Обычные формы) Управленческий учет Промышленность, строительство и АПК
← На главную

В конфигурации 1С:Управление производственным предприятием (УПП) 1.3 часто возникает ситуация, когда в справочнике Номенклатура хранятся позиции, предназначенные исключительно для обмена с сайтом или для технических нужд. Эти позиции не должны выбираться пользователями в первичных документах (Заказ покупателя, Реализация товаров и услуг и др.). Однако даже если вы настроили фильтр в форме выбора, при вводе названия товара текстом прямо в ячейку табличной части срабатывает стандартный механизм автоподбора, который все равно предлагает "запрещенные" элементы. Проанализируем, как полностью исключить такую номенклатуру из интерфейса ввода.

Разбор проблемы: почему обычные фильтры не работают

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

Способ №1. Использование события АвтоПодбор (наиболее гибкий метод)

Рассмотрим основной программный метод — использование события АвтоПодбор у элемента управления (поля ввода) в колонке табличной части. Это событие позволяет нам перехватить введенный текст, самостоятельно выполнить запрос к базе данных с нужными фильтрами и подсунуть системе свой список значений.

Алгоритм реализации:

  1. Найдем в форме документа нужную табличную часть и поле ввода Номенклатура.
  2. В свойствах поля ввода создадим обработчик события АвтоПодбор.
  3. Внутри обработчика установим СтандартнаяОбработка = Ложь, чтобы система не запускала свой поиск.
  4. Напишем запрос, который будет искать номенклатуру по строке, но с исключением нашего "Вида номенклатуры".

Пример кода для реализации фильтрации (в контексте обычных форм УПП):


Процедура ТоварыНоменклатураАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка)
    
    // Отключаем системный поиск
    СтандартнаяОбработка = Ложь;
    
    // Если текст слишком короткий, не нагружаем базу
    Если СтрДлина(Текст) < 3 Тогда
        Возврат;
    КонецЕсли;
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
    "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 50
    |	Номенклатура.Ссылка КАК Ссылка,
    |	Номенклатура.Представление КАК Представление
    |ИЗ
    |	Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    |	Номенклатура.Наименование ПОДОБНО &ТекстПоиска
    |	И Номенклатура.ВидНоменклатуры <> &ВидИсключение
    |	И НЕ Номенклатура.ПометкаУдаления";
    
    Запрос.УстановитьПараметр("ТекстПоиска", "%" + Текст + "%");
    Запрос.УстановитьПараметр("ВидИсключение", Справочники.ВидыНоменклатуры.НайтиПоНаименованию("Для сайта"));
    
    РезультатЗапроса = Запрос.Выполнить();
    Если НЕ РезультатЗапроса.Пустой() Тогда
        Список = Новый СписокЗначений;
        Выборка = РезультатЗапроса.Выбрать();
        Пока Выборка.Следующий() Цикл
            Список.Добавить(Выборка.Ссылка, Выборка.Представление);
        КонецЦикла;
        
        // Передаем сформированный список платформе для отображения
        ДанныеВыбора = Список;
    КонецЕсли;

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

Важный нюанс: В параметре ДанныеВыбора можно передавать не просто ссылки, а структуры. Это позволит добавить дополнительные подсказки пользователю (например, выводить артикул рядом с названием).

Способ №2. Проверка после выбора (событие ПриИзменении)

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

Разберем, как это реализовать в событии ПриИзменении:


Процедура ТоварыНоменклатураПриИзменении(Элемент)
    
    СтрокаТЧ = ЭлементыФормы.Товары.ТекущаяСтрока;
    
    Если ЗначениеЗаполнено(СтрокаТЧ.Номенклатура) Тогда
        // Проверяем вид номенклатуры
        Если СтрокаТЧ.Номенклатура.ВидНоменклатуры = Справочники.ВидыНоменклатуры.НайтиПоНаименованию("Для сайта") Тогда
            
            // Сообщаем пользователю об ошибке
            ОбщегоНазначения.СообщитьОбОшибке("Выбранная номенклатура предназначена только для сайта и недоступна для продажи!");
            
            // Очищаем значение
            СтрокаТЧ.Номенклатура = Справочники.Номенклатура.ПустаяСсылка();
            
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры

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

Способ №3. Использование параметров выбора в метаданных

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

  1. Откройте форму документа и выделите поле ввода Номенклатура в табличной части.
  2. Найдите свойство Параметры выбора.
  3. Нажмите на кнопку открытия и добавьте условие: Отбор.ВидНоменклатуры(Не в списке/Не равно).

Внимание: В обычных формах УПП 1.3 это свойство часто ограничено. Если оно не дает нужного эффекта при вводе текстом, используйте Связи параметров выбора. Это заставит систему всегда учитывать контекст при поиске по строке.

Способ №4. Визуальная изоляция (Префиксы)

Рассмотрим "быстрый" административный метод. Если программирование по каким-то причинам недоступно, можно изменить наименования "сайтовых" позиций, добавив в начало спецсимвол (например, _ или ~). Например: ~Подогреватель электрический.

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

Рекомендация по выбору решения

Для качественной настройки системы в УПП 1.3 мы рекомендуем комбинировать методы:

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

← На главную