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