Как в управляемой форме 1С определить, что она открыта в режиме выбора?

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

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

Использование стандартного параметра РежимВыбора

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

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


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

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

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

Различие между режимами выбора и подбора

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

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

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

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

Особенности для произвольных форм

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

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


ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("РежимВыбора", Истина);
ПараметрыОткрытия.Вставить("ВладелецФайлов", ТекущийОбъект.Ссылка);

ОткрытьФорму("Обработка.ПодборНоменклатуры.Форма.ФормаВыбора", ПараметрыОткрытия, Элемент);

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

Анализ владельца формы

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

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

Работа с динамическим списком

Для форм, основным реквизитом которых является ДинамическийСписок, существует понятие расширения формы. В документации 1С указано, что параметры РежимВыбора, ВыборОбъекта и ТекущаяСтрока являются ключевыми для расширения формы динамического списка.

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

Резюме по использованию в коде

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

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

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

← На главную