Как ограничить выбор номенклатуры во второй табличной части на основе данных первой табличной части?

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

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

Почему не подходят стандартные связи параметров выбора?

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

Решение через событие «НачалоВыбора»

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

Давайте разберем пошагово, как реализовать этот подход:

  1. Отключим стандартную обработку выбора, чтобы система не открывала весь справочник номенклатуры.
  2. Сформируем СписокЗначений, содержащий номенклатуру из первой табличной части.
  3. Передадим этот список в параметр ДанныеВыбора события.

Пример программной реализации

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


&НаКлиенте
Процедура Таблица2НоменклатураНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    
    // Отключаем стандартную обработку открытия формы
    СтандартнаяОбработка = Ложь;
    
    // Создаем список значений для фильтрации
    СписокНоменклатуры = Новый СписокЗначений;
    
    // Обходим первую табличную часть объекта
    Для каждого СтрокаТЧ Из Объект.Таблица1 Цикл
        // Добавляем только заполненные значения
        Если ЗначениеЗаполнено(СтрокаТЧ.Номенклатура) Тогда
            СписокНоменклатуры.Добавить(СтрокаТЧ.Номенклатура);
        КонецЕсли;
    КонецЦикла;
    
    // Присваиваем сформированный список параметру ДанныеВыбора
    ДанныеВыбора = СписокНоменклатуры;
    
КонецПроцедуры

Важные нюансы реализации

При использовании данного метода обратите внимание на следующие аспекты:

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

← На главную