Почему форма списка 1С не открывается в режиме выбора через параметры и как это исправить

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

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

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

Суть проблемы: ожидание против реальности

Рассмотрим типичный сценарий. Разработчик пытается открыть форму списка справочника программно, передавая стандартный набор параметров для выбора одного или нескольких элементов. Код выглядит примерно так:


ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("РежимВыбора", Истина);
ПараметрыФормы.Вставить("МножественныйВыбор", Ложь);
ОткрытьФорму("Справочник.МойСправочник.Форма.ФормаСписка", ПараметрыФормы, ЭтаФорма);

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

Анализ механизма параметров управляемой формы

Проанализируем ситуацию: в управляемом приложении параметры, передаваемые в функцию ОткрытьФорму(), делятся на две категории: системные и пользовательские. К системным относятся Отбор, ТекущаяСтрока, РежимВыбора и другие.

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

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

Решение проблемы: программная инициализация в обработчике ПриСозданииНаСервере

Наиболее надежный и рекомендуемый способ гарантировать переход формы в нужный режим — это явное управление свойствами элементов в серверном контексте. Разберем по шагам, как это реализовать.

Нам необходимо перехватить переданные параметры в модуле открываемой формы и вручную установить свойства основного динамического списка. Рассмотрим пример кода для процедуры ПриСозданииНаСервере:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

    // Проверяем наличие параметра РежимВыбора в структуре Параметры
    Если Параметры.Свойство("РежимВыбора") Тогда
        // Устанавливаем режим выбора непосредственно для элемента интерфейса (таблицы)
        Элементы.Список.РежимВыбора = Параметры.РежимВыбора;
        
        // Устанавливаем системное свойство формы, отвечающее за поведение при закрытии
        ЭтаФорма.ЗакрыватьПриВыборе = Параметры.РежимВыбора;
    КонецЕсли;

    // Аналогично обрабатываем возможность множественного выбора
    Если Параметры.Свойство("МножественныйВыбор") Тогда
        Элементы.Список.МножественныйВыбор = Параметры.МножественныйВыбор;
    КонецЕсли;

КонецПроцедуры

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

Важность основного реквизита

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

  1. Откройте форму в конфигураторе.
  2. Перейдите на закладку Реквизиты.
  3. Убедитесь, что реквизит типа ДинамическийСписок (обычно с именем Список) выделен жирным шрифтом. Это означает, что флаг Основной реквизит установлен.

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

Взаимосвязь с владельцем формы и обработкой выбора

Посмотрим на ситуацию шире. Режим выбора не имеет смысла без механизма возврата выбранного значения. Когда мы устанавливаем РежимВыбора = Истина, форма ожидает, что у нее есть Владелец.

Если вы открываете форму командой ОткрытьФорму(..., ..., ЭтаФорма), текущая форма становится владельцем. При выборе значения в открытой форме списка, у формы-владельца сработает событие ОбработкаВыбора. Рассмотрим, как это работает:

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

Использование стандартных настроек метаданных

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

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

В этом случае при нажатии на "лупу" в поле ввода платформа сама сформирует правильную структуру параметров, включая РежимВыбора = Истина, и "пробросит" их внутрь формы более надежно.

Особенности работы в расширениях

Проанализируем специфику расширений. Часто разработчики сталкиваются с тем, что в основной конфигурации форма работает корректно, а в расширении — нет. Это связано с тем, что расширение может не полностью наследовать Расширение формы клиентского приложения для конкретного типа объекта (справочника).

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

Резюме

Для того чтобы форма списка в управляемом приложении гарантированно открылась в режиме выбора, следует придерживаться следующего алгоритма:

  1. Всегда проверять наличие основного реквизита формы.
  2. Передавать параметры РежимВыбора и МножественныйВыбор при вызове ОткрытьФорму.
  3. В модуле формы в процедуре ПриСозданииНаСервере принудительно устанавливать свойства Элементы.ИмяВашегоСписка.РежимВыбора и ЭтаФорма.ЗакрыватьПриВыборе на основании переданных параметров.

Такой подход исключает влияние ошибок документации или особенностей поведения платформы в различных версиях 1С:Предприятие 8.3.

← На главную