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

Программист 1С v8.3 (Обычные формы) Управленческий учет Промышленность, строительство и АПК
← На главную

При разработке в конфигурациях на обычных формах, таких как «1С:Управление производственным предприятием 1.3» или «1С:Бухгалтерия предприятия 2.0», программисты часто сталкиваются с ситуацией, когда стандартная установка отборов через объект Отбор не приносит желаемого результата. Форма открывается либо пустой, либо игнорирует заданные условия, либо принудительно включает иерархический просмотр, несмотря на программные запреты.

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

Почему стандартный отбор не всегда работает?

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

Например, в форме выбора справочника ПодразделенияОрганизаций часто присутствует поле ввода «Организация». Если мы установили отбор в объекте Отбор, но не заполнили это поле на форме, внутренние механизмы конфигурации могут решить, что отбор по владельцу не задан, и очистить его.

Решение 1: Прямое заполнение реквизитов формы

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

Ниже представлен программный код, который позволяет корректно установить организацию-владельца и передать список разрешенных подразделений:


Процедура ПодразделениеОрганизацииНачалоВыбора(Элемент, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь; // Отключаем стандартное открытие
    
    СписокПодразделений = ПолучитьСписокПодразделений(); // Ваша функция получения списка
    ОрганизацияСсылка = Справочники.Организации.НайтиПоКоду("000000001");
    
    // Получаем форму выбора
    ФормаВыбора = Справочники.ПодразделенияОрганизаций.ПолучитьФорму("ФормаВыбора", Элемент);
    
    // Прямое заполнение поля Организация на форме — это ключевой момент для УПП
    ФормаВыбора.ЭлементыФормы.Организация.Значение = ОрганизацияСсылка;
    
    // Устанавливаем отбор по списку ссылок
    ФормаВыбора.Отбор.Ссылка.ВидСравнения = ВидСравнения.ВСписке;
    ФормаВыбора.Отбор.Ссылка.Значение = СписокПодразделений;
    ФормаВыбора.Отбор.Ссылка.Использование = Истина;
    
    // Отключаем иерархию (если необходимо)
    ФормаВыбора.ЭлементыФормы.СправочникСписок.ИерархическийПросмотр = Ложь;
    
    ФормаВыбора.Открыть();
    
КонецПроцедуры

В данном примере мы принудительно устанавливаем значение реквизита Организация в элементах формы. Это заставляет внутренние обработчики типовой формы «поверить», что пользователь сам выбрал организацию, и не сбрасывать фильтр.

Решение 2: Использование специальных параметров формы

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


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

Этот способ является более «чистым» с точки зрения архитектуры типовых решений, так как форма сама обработает это значение в процедуре ПриОткрытии и настроит все необходимые элементы интерфейса.

Решение 3: Универсальный метод ОткрытьФорму

Интересной особенностью современных версий платформы 8.3 (даже при работе с обычными формами) является возможность использования метода ОткрытьФорму() с передачей структуры параметров. Платформа самостоятельно пытается сопоставить ключи структуры с именами параметров или отборов формы.

Проанализируем пример кода:


ЗначениеОтбора = Новый Структура("Владелец", НужнаяОрганизация);
ПараметрыФормы = Новый Структура("Отбор", ЗначениеОтбора);
ОткрытьФорму("Справочник.ПодразделенияОрганизаций.Форма.ФормаВыбора", ПараметрыФормы, Элемент);

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

Проблема с отключением иерархического просмотра

Часто программисты жалуются, что строка ФормаВыбора.ЭлементыФормы.СправочникСписок.ИерархическийПросмотр = Ложь; игнорируется. Разберем ситуацию: почему иерархия возвращается?

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

Чтобы гарантированно отключить иерархию, попробуйте следующее:

Итоги

Мы рассмотрели несколько подходов к решению проблемы некорректной работы формы с параметрами. Подведем итоги совместной работы:

Во-первых, при работе с типовыми конфигурациями (УПП, БП) всегда проверяйте наличие на форме реквизитов, дублирующих отборы (например, поле выбора Организации). Их заполнение важнее, чем настройка объекта Отбор.

Во-вторых, используйте возможности платформы по передаче параметров через структуру в метод ОткрытьФорму, это сокращает объем кода.

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

← На главную