User Rating: 5 / 5

Star ActiveStar ActiveStar ActiveStar ActiveStar Active
 

Добрый день.

Сегодня мы поговорим о том, как программно открывать формы выбора в новом управляемом интерфейсе.

Раньше в "обычном приложении" мы писали так:

форма = Справочник.номенклатура.ПолучитьФормуВыбора();

результатВыбора = форма.открытьМодальНО();

Между этими операторами мы могли изменить свойства формы, например задать отбор. Мы могли указать конкретную форму по имени. Могли изменять её внешний вид, обращаясь к свойствам элементав формы по их имени через точку (форма.Кнопка1.Видимость = Ложь;)

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

 

Итак приступим.

1. Самый простой случай, когда нам не нужно управлять выбором (настраивать отборы, передавать параметры в открывшуюся форму выбора).

Поскольку формы можно открывать только на клиенте, то это будет клиентский кусок кода. Пользоваться будем функцией ВвестиЗначение(<Значение>, <Подсказка>, <Тип>). Собственно, из её описания все понятно. Возвращает она флаг того, был ли выполнен пользователем выбор, в первый параметр мы передаем контейнер, в который вернется значение выбора, во второй текст, который отобразится в заголовке окна выбора, в третий массив типов.

Вот пример использования:

 

Перем ВыбТМЦ;

МассивТипов = Новый Массив;

МассивТипов.Добавить(Тип("СправочникСсылка.Номенклатура"));

ОписаниеТиповТМЦ = Новый ОписаниеТипов(Массив);

 

Если ВвестиЗначение(ВыбТМЦ, "Выберите номенклатуру", ОписаниеТиповТМЦ) Тогда

//Обрабаботка выбранного значения

КонецЕсли;

 

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

 

2. Иногда, перед выбором значения, нам требуется установить какие-либо отборы и параметры выбора. Например нам нужно выбрать договор контрагента. Первый способ нам откроет все догвоора, а нам нужно с отбором по владельцу.

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

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

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

 

Итак, смотрим описание процедуры, у неё 4 параметра. В первом мы указываем строку с полным путём к форме "Справочник.ДоговорыКонтрагентов.ФормаВыбора". Во втором мы указываем параметры выбора, о них чуть ниже. В третий - владельца, это форма или поле выбора, которое получит в себя результат выбора, мы его не заполняем. Четвертый параметр в нашем слечае тоже не используется.

Итак, для простого выбора нам подойдет строка:

&НаКлиенте

Процедура Команда1(Команда)

рез = ОткрытьФормуМодально("Справочник.ДоговорыКонтрагентов.ФормаВыбора");

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

Но это полный аналог медода №1, и мы увидим форму выбора всех договоров, без отбора по владельцу. Т.е. так делать можно, только если мы хотим конкретизировать имя формы выбора.

Чтобы задать отбор, нам поможет второй параметр.

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

В моем примере я нарисовал в обработке поле выбора, ссылающееся на реквизит формы обработки  "контрагент" с типом данных "СправочникСсылка.Контрагенты". и написал следующий кусок кода:

&НаКлиенте

Процедура Команда1(Команда)

Отборы = Новый Структура("Владелец", Контрагент);

ПараметрыВыбора = Новый Структура("Отбор", Отборы);

рез = ОткрытьФормуМодально("Справочник.ДоговорыКонтрагентов.ФормаВыбора",ПараметрыВыбора);

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

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

На сегодня все, спасибо за внимание.

Авторизуйтесь пожалуйста