Как программно открыть или переопределить форму выбора в 1С:Предприятии?

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

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

1. Программное открытие произвольной формы выбора

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

1.1. Открытие по имени формы

Мы можем указать платформе точное имя формы, которую хотим открыть. Программное изменение форм значительно ускоряет разработку. Рассмотрим примеры:

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

    
    // Откроем конкретную форму по имени "ФормаВыбора" для документа "ПриобретениеТоваровУслуг"
    ОткрытьФорму("Документ.ПриобретениеТоваровУслуг.Форма.ФормаВыбора");
    
  2. Открытие формы выбора "по умолчанию": Если мы хотим, чтобы платформа сама определила и открыла стандартную форму выбора для объекта, мы можем не указывать полный путь до конкретной формы в ветке Формы, а просто сослаться на предопределенное имя ФормаВыбора. Если такой формы нет, платформа сгенерирует ее автоматически.

    
    // Откроем форму выбора "по умолчанию" для документа "ПриобретениеТоваровУслуг"
    // Если ее нет, платформа сгенерирует ее
    ОткрытьФорму("Документ.ПриобретениеТоваровУслуг.ФормаВыбора");
    

1.2. Передача параметров и установка отборов

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

Для установки отбора при открытии формы выбора мы обычно используем объект Структура, который передается в параметрах метода ОткрытьФорму(). Давайте посмотрим на пример, где мы хотим отфильтровать элементы справочника "Номенклатура" по признаку "ЭтоУслуга = Ложь":


// Создаем структуру параметров
ПередаваемыеПараметры = Новый Структура;

// Устанавливаем отбор. Ключ - имя реквизита, значение - значение для отбора
// Например, для отбора по типу номенклатуры
ПередаваемыеПараметры.Вставить("Отбор", Новый Структура("ЭтоУслуга", Ложь)); 
// Или, если в форме есть реквизит "Поставщик", можно передать
// ПередаваемыеПараметры.Вставить("Поставщик", МойПоставщик);

// Откроем форму выбора с заданными параметрами
ОткрытьФорму("Справочник.Номенклатура.ФормаВыбора", ПередаваемыеПараметры);

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

1.3. Условное открытие разных форм

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

Рассмотрим пример, где выбор формы зависит от значения переменной ВыборПользователя:


ПередаваемыйПараметр = Новый Структура("КакойТоПараметр", "ЗначениеПараметра");
Оп = Новый ОписаниеОповещения("ПослеВыбора", ЭтотОбъект);

Если ВыборПользователя = 0 Тогда
    ИмяФормы = "ОбалденнаяФормаВыбора";
ИначеЕсли ВыборПользователя = 1 Тогда
    ИмяФормы = "ФормаВыбораДляТетиМаши";
Иначе
    ИмяФормы = "ФормаВыбора";
КонецЕсли;

ФормаДляОткрытия = "Документ.ПриобретениеТоваровУслуг.Форма." + ИмяФормы;
ОткрытьФорму(ФормаДляОткрытия, ПередаваемыйПараметр,,,,,Оп,РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);

Обратите внимание на параметр РежимОткрытияОкнаФормы.БлокироватьОкноВладельца. Он позволяет открыть форму в модальном режиме, блокируя основное окно до тех пор, пока пользователь не сделает выбор или не закроет форму. Это часто упрощает обработку результата выбора.

1.4. Динамическое получение имени объекта метаданных

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

На сервере мы можем получить полное имя объекта метаданных из его типа. Однако будьте внимательны: если ОписаниеТипов содержит более одного типа, может возникнуть ошибка.


// Предположим, у нас есть ОписаниеТипов для какого-то объекта
// ИмяТаблицы = ОписаниеТипов.ПривестиЗначение(Неопределено).Метаданные().ПолноеИмя();
// Этот способ может вызвать ошибку, если ОписаниеТипов содержит более 1 типа.

// Более надежный способ, если ОписаниеТипов содержит только один тип:
ИмяОбъектаМетаданных = Метаданные.НайтиПоТипу(ОписаниеТипов.Типы()[0]).ПолноеИмя();
ИмяФормыВыбора = СтрШаблон("%1.ФормаВыбора", ИмяОбъектаМетаданных);
// Теперь ИмяФормыВыбора можно использовать в ОткрытьФорму()

2. Переопределение стандартной формы выбора через модуль менеджера

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

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

2.1. Использование процедуры ОбработкаПолученияФормы

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

  1. Установить в параметре ВыбраннаяФорма имя другой формы или объект метаданных формы.
  2. Установить в параметре СтандартнаяОбработка значение Ложь. Это укажет платформе, что мы уже обработали запрос и не нужно выполнять стандартные действия.

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


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

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

Мы видим, что параметр ВидФормы позволяет нам различать, какую именно форму запрашивает платформа: "ФормаСписка" (основная форма списка), "ФормаВыбора" (форма, которая открывается при выборе в поле ввода) или "ФормаОбъекта" (форма элемента/документа). Это дает нам очень гибкий инструмент для управления поведением форм.

3. Переопределение поведения выбора для поля ввода

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

Для таких случаев мы можем использовать события поля ввода: НачалоВыбора() и ОбработкаВыбора().

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

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

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

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

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

4. Дополнительные аспекты и рекомендации

Помимо основных методов, рассмотрим несколько важных моментов, которые помогут нам в работе с формами выбора.

4.1. Получение выбранного значения из формы

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

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

    
    &НаКлиенте
    Процедура ОткрытьФормуВыбораИОбработать()
        ОписаниеОповещенияОВыборе = Новый ОписаниеОповещения("ОбработатьВыбор", ЭтотОбъект);
        ОткрытьФорму("Справочник.Контрагенты.ФормаВыбора", , , , , , ОписаниеОповещенияОВыборе);
    КонецПроцедуры
    
    &НаКлиенте
    Процедура ОбработатьВыбор(ВыбранноеЗначение, ДополнительныеПараметры) Экспорт
        Если ВыбранноеЗначение <> Неопределено Тогда
            Сообщить("Пользователь выбрал: " + ВыбранноеЗначение);
            // Присвоить значение реквизиту формы
            // МойРеквизит = ВыбранноеЗначение;
        КонецЕсли;
    КонецПроцедуры
    
  2. В модальном режиме: Если форма открыта в модальном режиме (например, с использованием РежимОткрытияОкнаФормы.БлокироватьОкноВладельца или методом ОткрытьФормуМодально()), результат выбора возвращается непосредственно из вызова функции ОткрытьФорму().

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

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

Форма выбора в 1С часто использует ДинамическийСписок, который является основным реквизитом формы. Мы можем управлять отборами в этом списке несколькими способами:

  1. Статический отбор: Устанавливается в конфигураторе для самого динамического списка.

  2. Динамический отбор через параметры формы: Как мы уже рассмотрели, отборы можно передавать через параметры при открытии формы.

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

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

4.3. Использование реквизита НачальныйТекущийРодитель

При открытии формы выбора для иерархических справочников, если мы хотим сразу позиционировать пользователя на определенной папке (родителе), рекомендуется использовать параметр НачальныйТекущийРодитель. Это более предпочтительно, чем прямая установка свойства ТекущийРодитель для табличного поля открываемой формы, так как это обеспечивает независимость использования формы от её внутреннего устройства.


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

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

← На главную