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