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

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

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

Рассмотрим, как правильно обращаться к элементу формы табличной части, а также проанализируем наиболее эффективные и современные способы программного открытия форм выбора.

Причина проблемы и обращение к элементу формы

Разберем типичную ошибку: разработчики пытаются передать текущие данные строки (через Элементы.Таблица.ТекущиеДанные) или идентификатор строки. Однако функции открытия формы выбора (такие как ПолучитьФорму или ОткрытьФорму) в качестве параметра владельца ждут именно элемент формы (тип ПолеФормы), а не данные или строку таблицы.

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

Для обращения к элементу колонки табличной части используется прямой путь через коллекцию элементов формы: Элементы.ИмяЭлементаКолонки.


&НаКлиенте
Процедура ВыбратьНоменклатуруПоНаличию(ЭлементВладелец)
    
    Форма = ПолучитьФорму("Справочник.Номенклатура.ФормаВыбора", , ЭлементВладелец);
    
    ЭлементОтбора = Форма.Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Ссылка");
    ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
    ЭлементОтбора.Использование = Истина;
    ЭлементОтбора.ПравоеЗначение = ПолучитьСписокНоменклатурыВНаличии();
    ЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
    
    Форма.Элементы.Список.Отображение = ОтображениеТаблицы.Список;
    Форма.Открыть();
    
КонецПроцедуры

&НаКлиенте
Процедура ОсновнаяПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр)
    
    // Передаем элемент формы конкретной колонки табличной части
    ВыбратьНоменклатуруПоНаличию(Элементы.ОсновнаяНоменклатура);
    
КонецПроцедуры

Оптимизация открытия формы выбора через «ОткрытьФорму»

Проанализируем используемый подход. Вызов ПолучитьФорму на клиенте с последующей модификацией отбора создает лишние серверные вызовы и считается устаревшей практикой для управляемого приложения и веб-клиента. Более эффективным является использование функции ОткрытьФорму с передачей параметров отбора сразу при открытии.

В этом случае платформа накладывает отбор на сервере еще до передачи формы на клиент:


&НаКлиенте
Процедура ОсновнаяНоменклатураНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    
    МассивНоменклатуры = ПолучитьСписокНоменклатурыВНаличии();
    
    СтруктураОтбора = Новый Структура;
    СтруктураОтбора.Вставить("Ссылка", МассивНоменклатуры);
    
    ПараметрыФормы = Новый Структура;
    ПараметрыФормы.Вставить("Отбор", СтруктураОтбора);
    
    // Третьим параметром передаем элемент формы (владелец)
    ОткрытьФорму("Справочник.Номенклатура.ФормаВыбора", ПараметрыФормы, Элемент);
    
КонецПроцедуры

Альтернативный вариант: Использование свойства «ПараметрыВыбора»

Если отбор должен действовать постоянно при выборе в данной колонке, можно избежать переопределения событий НачалоВыбора или ПередНачаломДобавления. Достаточно сформировать массив параметров выбора и установить его в свойство элемента формы.

Рассмотрим пример установки отбора для колонки формы:


&НаСервере
Процедура УстановитьОтборДляКолонкиНаСервере()
    
    МассивНоменклатуры = ПолучитьСписокНоменклатурыВНаличииНаСервере();
    
    МассивПараметров = Новый Массив;
    МассивПараметров.Добавить(Новый ПараметрВыбора("Отбор.Ссылка", МассивНоменклатуры));
    
    Элементы.ОсновнаяНоменклатура.ПараметрыВыбора = Новый ФиксированныйМассив(МассивПараметров);
    
КонецПроцедуры

Преимущество этого метода заключается в том, что стандартная обработка выбора остается включенной, а установленный отбор автоматически применяется как при клике на кнопку выбора, так и при вводе номенклатуры по строке (автоподборе).

← На главную