Приветствую Вас ГостьСреда, 15.05.2024, 02:38

Каталог статей


Открыть форму выбора

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

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

1. Ввод значений без предварительного отбора

Справку по методам ввода значений можно найти в разделе "Функции для вызова диалога ввода данных".

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

  1. имя процедуры – обработчика оповещения, которая будет выполнена после получения ответа пользователя,
  2. в каком модуле расположена эта процедура.
  3. дополнительные параметры - значение любого типа, которое при вызове будет передано в указанную процедуру последним параметром.

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

Процедура должна быть экспортной, запускаться на клиенте и  иметь 2 параметра: РезультатЗакрытия, ДопПараметры.

РезультатЗакрытия может быть массивом при множественном выборе.

Для модальных окон самый простой способ через ВвестиЗначение()

    Сотрудник = Неопределено;
    ОписаниеСортудник = Новый ОписаниеТипов("СправочникСсылка.Сотрудники");
    РезультатВыбора = ВвестиЗначение(Сотрудник,"Выберите ответственное лицо",ОписаниеСортудник);

Для не модальных окон его аналог ПоказатьВводЗначения()

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

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

&НаСервере
Процедура ВОГ_ИзменитьВладельцаПослеНаСервере(НовыйВладелец, ДопПараметры) Экспорт
    Если НовыйВладелец<>Неопределено Тогда
        Объект.ВладелецДоговора = НовыйВладелец;    
    КонецЕсли;
КонецПроцедуры

 

В описании оповещения указывается экспортная процедура, которая должна иметь 2 параметра: РезультатЗакрытия, ДопПараметры.

РезультатЗакрытия может быть массивом при множественном выборе.

2. Подбор немодально без Описания оповещения

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

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

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

Основные параметры, которые могут потребоваться:

  • ЗакрыватьПриВыборе - если Истина, то после того как будет произведен выбор, форма выбора закроется
  • МножественныйВыбор - можно выбрать сразу несколько позиций. В этом случае будет возвращено не конкретная ссылка, а массив ссылок

ВАЖНО!!! Если не использовать ОписаниеОповещения, то обработка выбора будет выполнятся в событии ОбработкаВыбора() того элемента, который указан третьим параметром метода ОткрытьФорму, т.е. владельца. Событие ОбработкаВыбора имеют все элементы формы, в которые можно ввести значение. Если в качестве владельца будет указана форма (ЭтаФорма), то надо ловить получение результата выбора в событии формы. Если в качестве владельца будет указана таблица фомы, то надо обрабатывать событие ОбработкаВыбора таблицы формы. Если в качестве владельца будет указан элемент формы, то события ОбработкаВыбора может быть, в этом случае значение передается прямо в элемент формы.

Событие ОбработкаВыбора  вызывается в случаях:

  1. когда в вызываемой форме будет выполнен интерактивный отбор
  2. когда в вызываемой форме будет вызван метод ОповеститьОВыборе()

Пример процедуры ОбработкаВыбора  :

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

Здесь мы задаем значение в новую строку прямо на клиенте

Метод ОповеститьОВыборе(ЗначениеВыбора) посылает оповещение владельцу формы о выполнении выбора или подбора, передает ему выбранное значение и закрывает форму, если она открыта не в режиме множественного выбора.

У метода один параметр ЗначениеВыбора. В него можно передавать как массив ссылок, так и отдельную ссылку. Если форма выбора была вызвана с параметром МножественныйВыбор, то в динамическом списке доступен выбор нескольких значений, и надо возвращать Элементы.Список.ВыделенныеСтроки. Если множественный выбор недоступен, то возвращаем Элементы.Список.ТекущаяСтрока.

Надо помнить, что динамический список возвращает ссылку в Список.ТекущаяСтрока, если у списка задано свойство "Основная таблица". В этом случае будет возвращена ссылка на элемент данного справочника.

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

3. способ без отбора.

&НаКлиенте
Процедура ИсправитьУчетныйМесяцАктов(Команда)
    ВыбратьДокументы("АктВыполненныхРабот", "ИсправитьУчетныйМесяцАктовКонец")
КонецПроцедуры
 

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

Описание доступных параметров можно посмотреть "Расширение управляемой формы для динамического списка (Managed form extension for dynamic lists) синтакс-помощнике "Интрефейс(Управляемый) / Форма клиентского приложения\Расширение динамического списка\Параметры формы"

Если хотим чтобы был множественный выбор, то указываем параметр "МножественныйВыбор".

Если при отборе хотим встать на заранее определенный элемент, то используем параметр "ТекущаяСтрока".

Если надо выбирать только группы, то используем параметр ВыборГруппИЭлементов = ИспользованиеГруппИЭлементов.Группы.

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

   ПользовательскиеНастройки = Новый ПользовательскиеНастройкиКомпоновкиДанных();

   ПараметрыФормы  = Новый Структура("...,ПользовательскиеНастройки", ...,ПользовательскиеНастройки);

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

Например зададим в форме выбора для элемента Список свойство ВыборГруппИЭлементов

    ФормаВыбораКонтрагента = ПолучитьФорму("Справочник.Контрагенты.ФормаВыбора",ПараметрыФормы,ЭтотОбъект);
    ФормаВыбораКонтрагента.ОписаниеОповещенияОЗакрытии = ОповещениеЗакрытиеФормы;
    ФормаВыбораКонтрагента.Элементы.Список.ВыборГруппИЭлементов = ИспользованиеГруппИЭлементов.ГруппыИЭлементы;
    ФормаВыбораКонтрагента.Открыть();
 

4. Через параметры формы / отбор (Структура).

При использовании этого способа можно задать только соответствие типа "равно" 

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

Процедура ОбработатьВыбор(РезультатЗакрытия,ДопПараметры) Экспорт
    Сообщить(РезультатЗакрытия);
КонецПроцедуры

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

Ещё стоит учитывать, что формы списка построены на базе СКД, и, когда открывается форма таким образом, то параметры отбора попадают в фиксированные настройки, которые не сможет изменить пользователь. Если у пользователя может возникнуть необходимость изменит настройки, то надо позаботится о том, чтобы удалить отбор из фиксированных настроек и перенести их в обычные настройки. Например так следующим образом: 

  1.  В форме выбора в обработке "ПриСозданииНаСервере" определяем есть ли параметр отбора. Если есть, то устанавливаем служебный признак ПрограммныйОтбор = Истина; и запоминаем значение параметра отбора.
  2. В методе ПриОткрытии очищаем фиксированные настройки и добавляем аналогичные параметры отбора в обычные настройки.

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

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

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

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

5. Через отбор настройки компоновки данных.

При этом способе условия могут принимать значение "в списке", "не равно" и т.д.

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

Процедура ОбработатьВыбор(РезультатЗакрытия,ДопПараметры) Экспорт
    Сообщить(РезультатЗакрытия);
КонецПроцедуры
 

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

Для модальных форм: 

НовФорма = Документы.Кредит.ПолучитьФорму();
Результ = НовФорма.ОткрытьМодально();
тут Результ -- это то, что возвращает метод Закрыть() вызываемой формы. Можешь таким образом, написать часть в документе кредита, а часть дописать в вызывающем документе

Для немодальных форм;

ОткрытьФорму(<ИмяФормы>, <Параметры>, <Владелец>, <Уникальность>, <Окно>, <НавигационнаяСсылка>, <ОписаниеОповещенияОЗакрытии>, <РежимОткрытияОкна>) - указать процедуру, которую передать в параметр <ОписаниеОповещенияОЗакрытии>
В самой форме просто выполнить код "ЭтаФорма.Закрыть(Параметры)"
В таком случае будет произведен возврат значений из открытой формы в код модуля, из которого его открыли без необходимости изменять процедуру "ОбработкаОповещения"

7. Превратить форму списка в форму выбора

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

Например:

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

8. Произвольная форма выбора при выборе элемента.

Для ссылочного реквизита можно установить произвольную форму вместо стандартной формы выбора. Для этого в свойстве "Форма выбора" нужного реквизита надо указать соответствующую форму. Форма разрабатывается для объекта, на который ссылается реквизит.

Категория: Формы | Добавил: leshic (03.04.2019)
Просмотров: 5892 | Рейтинг: 5.0/1
Всего комментариев: 1
1 StevenGrery  
Cool + for the post

Вход на сайт
Поиск
Категории раздела
СКД [48]
Регистры [7]
Формы [41]
Администрирование [35]
Запросы [10]
Объекты конфигурации и типы данных [20]
Взаимодействие с другими базами, приложениями и источниками данных [16]
Программирование [29]
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0