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