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