Как правильно установить отбор и режим иерархии при программном открытии формы списка

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

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

Разбор ситуации: использование события НачалоВыбора

Для управления процессом подбора в 1С наиболее подходящим местом является событие НачалоВыбора, которое вызывается у элемента формы (поля ввода). Рассмотрим основные шаги, которые необходимо выполнить в этом обработчике:

  1. Отключение стандартной обработки. Если мы хотим открыть форму программно со своими параметрами, нам нужно установить СтандартнаяОбработка = Ложь. Это предотвратит открытие формы платформой по умолчанию.
  2. Подготовка параметров. Мы создаем структуру ПараметрыВыбора, в которую помещаем все необходимые настройки.
  3. Вызов функции открытия. Используем метод ОткрытьФорму, передавая в него путь к форме и подготовленные параметры.

Установка отбора и текущего значения

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

Рассмотрим пример кода, в котором мы открываем форму выбора справочника "Основные средства", устанавливаем отбор по конкретному родителю (группе) и позиционируем курсор на уже выбранном ранее элементе:


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

    // Открываем форму выбора, передавая Элемент в качестве владельца
    // Это позволит системе автоматически вернуть результат в поле ввода
    ОткрытьФорму("Справочник.ОсновныеСредства.ФормаВыбора", ПараметрыОткрытия, Элемент);
    
КонецПроцедуры

Решение проблемы Поле объекта не обнаружено (Список)

Частой ошибкой, как показано в обсуждении, является попытка напрямую обратиться к элементам формы после вызова ПолучитьФорму. Ошибка "Поле объекта не обнаружено (Список)" возникает из-за того, что имя основной таблицы на форме может отличаться от стандартного или форма еще не полностью инициализирована на клиенте.

Выясним причину: в управляемом приложении правильнее настраивать отображение формы не "снаружи", а через параметры или внутри самой открываемой формы в процедуре ПриСозданииНаСервере. Однако, если вам нужно принудительно установить иерархический вид программно при вызове, рекомендуется использовать механизм ФиксированныхНастроек. Для комплексной модификации структуры и колонок списка можно изучить практические методы доработки динамических списков.

Рассмотрим более продвинутый вариант настройки динамического списка:


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

Альтернативный метод: Связи параметров выбора

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

Пошаговая настройка в конфигураторе:

  1. Откройте свойства реквизита, для которого настраивается выбор.
  2. Найдите поле Связи параметров выбора.
  3. Нажмите на многоточие и добавьте новую связь.
  4. В поле "Параметр выбора" выберите Отбор.Родитель (или другой нужный реквизит).
  5. В поле "Реквизит формы" выберите тот элемент, от которого будет зависеть фильтр.

Этот метод работает автоматически: платформа сама будет подставлять нужный отбор при открытии формы без единой строчки кода в НачалоВыбора.

Важные нюансы работы с параметрами

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

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

← На главную