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