24.02.2023

Отбор в форме выбора 8.3. Как открыть форму списка с некоторым отбором? ПараметрыВыбора = Новый Структура("Отбор", Отборы)


Добрый день.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

КонецЕсли;

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

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

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

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

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

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

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

&НаКлиенте

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

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

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

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

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

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

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

&НаКлиенте

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

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

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

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

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

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

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

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

Отбор на форме в поле ввода 1С 8.2 с несколькими значениями

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

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

Установка отбора в поле ввода на форме в 1С 8.3, событие НачалоВыбора

Теперь рассмотрим отбор в поле ввода на управляемой форме в 1С 8.3 . Найдем на форме интересующий нас элемент, в котором мы будем устанавливать отбор, в нашем случае это поле «Организация». Находим событие «НачалоВыбора», щелкаем на лупу и оказываемся в процедуре. Мы видим параметр ДанныеВыбора, этот параметр имеет тип СписокЗначений. Для того чтобы ограничить выбор необходимыми элементами, нам необходимо заполнить СписокЗначений. Элементы выбрать можем только на сервере, поэтому создаем процедуру с директивой компиляции &НаСервере. В данной процедуре заполняем ДанныеВыбора.

Как открыть форму списка с некоторым отбором?

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

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

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

ЗначениеОтбора = Новый Структура("Номер", "333");

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

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

2. Можно открыть форму списка без параметров:

ОткрытьФорму("Документ.ПриходнаяНакладная.ФормаСписка");

И затем, в обработчике события формы списка приходных накладных ПриСозданииНаСервере написать код, который создает отбор в динамическом списке, являющемся основным реквизитом формы:

&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));

ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Номер");

ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше;

ЭлементОтбора.Использование = Истина;

ЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;

ЭлементОтбора.ПравоеЗначение = "000000001";

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

Преимущества данного метода в том, что ВидСравнения у отбора можно задавать не только Равно , как в первом случае, а и Больше , Меньше и т.п.

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

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

Для этого в форме списка номенклатуры создадим команду и соответствующую ей кнопку Приходные накладные .

Обработчик выполнения этой команды заполним следующим образом:

&НаКлиенте

Процедура ПриходныеНакладные(Команда)

ФормаСписка = ПолучитьФорму("Документ.ПриходнаяНакладная.ФормаСписка");

ФормаСписка.ФильтрПоТовару = Элементы.Список.ТекущаяСтрока;

ФормаСписка.Открыть();

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

В этом обработчике мы получаем форму списка приходных накладных и передаем в параметр формы ФильтрПоТовару ссылку на текущий элемент в списке номенклатуры и открываем форму с этим параметром.

Затем создадим форму списка документов ПриходнаяНакладная и создадим реквизит формы ФильтрПоТовару , который мы будем использовать в качестве параметра формы при ее открытии. Теперь откроем палитру свойств основного реквизита формы Список . Установим флаг ПроизвольныйЗапрос и в строке Настройка списка нажмем Открыть .

В поле Запрос введем следующий текст запроса:

ВЫБРАТЬ

ДокументПриходнаяНакладная.Номер,

ДокументПриходнаяНакладная.Дата

ИЗ

Документ.ПриходнаяНакладная КАК ДокументПриходнаяНакладная

ГДЕ

ДокументПриходнаяНакладная.Товары.Товар = &Товар

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

&НаКлиенте

Процедура ПриОткрытии(Отказ)

Список.Параметры.УстановитьЗначениеПараметра("Товар", ФильтрПоТовару);

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

Здесь Список.Параметры - это список параметров запроса динамического списка для реквизита Список . Значение параметра Товар устанавливается равным значению параметра формы ФильтрПоТовару .

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

Демонстрационный пример для 3-го варианта находится в каталоге 1CITS/EXE/FAQ/ОткрытьФормуСОтбором.dt. Пример выполнен на версии платформы 8.2.9.356.

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

Код 1C v 8.2 УП Форма = ОткрытьФорму("Документ.РасходнаяНакладная.Форма.ФормаСписка"); //Открываем форму
ОтборВладелец =Форма.Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); //Добавлям отбор
ОтборВладелец.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; //Как будем сравнивать
ОтборВладелец.Использование = Истина; // Устанавливаем галку использованияНовый ПолеКомпоновкиДанных("Номенклатура")
ОтборВладелец.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Контрагент"); //По какому реквизиту будем делать отбор
ОтборВладелец.ПравоеЗначение = Объект.Контрагент; // И само значение отбора

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

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

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

Например, в следующем примере открывается список приходных накладных с отбором по полю Номер, равному 333.

Код 1C v 8.2 УП ЗначениеОтбора = Новый Структура("Номер", "333");
ПараметрыВыбора = Новый Структура("Отбор", ЗначениеОтбора);
ОткрытьФорму("Документ.ПриходнаяНакладная.ФормаСписка", ПараметрыВыбора);

Второй способ

Можно открыть форму списка без параметров:

Код 1C v 8.2 УП ОткрытьФорму("Документ.ПриходнаяНакладная.ФормаСписка");

И затем, в обработчике события формы списка приходных накладных ПриСозданииНаСервере написать код, который создает отбор в динамическом списке, являющемся основным реквизитом формы:

Код 1C v 8.2 УП &НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Номер");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше;
ЭлементОтбора.Использование = Истина;
ЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
ЭлементОтбора.ПравоеЗначение = "000000001";
КонецПроцедуры

Преимущества данного метода в том, что ВидСравнения у отбора можно задавать не только Равно, как в первом случае, а и Больше, Меньше и т.п.

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

Третий способ

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

Например, нам нужно открыть список приходных накладных, в которых присутствует номенклатура, выделенная в списке номенклатуры.

Для этого в форме списка номенклатуры создадим команду и соответствующую ей кнопку Приходные накладные.

Обработчик выполнения этой команды заполним следующим образом:

Код 1C v 8.2 УП &НаКлиенте
Процедура ПриходныеНакладные(Команда)
ПараметрыВыбора = Новый Структура("ФильтрПоТовару", Элементы.Список.ТекущаяСтрока);
ОткрытьФорму("Документ.ПриходнаяНакладная.ФормаСписка", ПараметрыВыбора);
КонецПроцедуры

В этом обработчике мы открываем форму списка приходных накладных, передавая в параметр формы ФильтрПоТовару ссылку на текущий элемент в списке номенклатуры.

Затем создадим форму списка документов ПриходнаяНакладная и создадим параметр формы ФильтрПоТовару, который мы будем использовать для открытия формы с нужным отбором.

Теперь откроем палитру свойств основного реквизита формы Список. Установим флаг ПроизвольныйЗапрос и в строке Настройка списка нажмём Открыть.

В поле Запрос введём следующий текст запроса:

Код 1C v 8.2 УП ВЫБРАТЬ
ДокументПриходнаяНакладная.Номер,
ДокументПриходнаяНакладная.Дата
ИЗ
Документ.ПриходнаяНакладная КАК ДокументПриходнаяНакладная
ГДЕ
ДокументПриходнаяНакладная.Товары.Товар = &Товар

В запросе мы используем параметр Товар, в который и будет передаваться ссылка на текущую строку в списке номенклатуры, содержащуюся в параметре формы списка приходных накладных ФильтрПоТовару.

Для этого в обработчике события формы списка ПриСозданииНаСервере напишем код для установки значения параметра запроса Товар:

Код 1C v 8.2 УП &НаКлиенте
Процедура ПриОткрытии(Отказ)
Список.Параметры.УстановитьЗначениеПараметра("Товар", Параметры.ФильтрПоТовару);
КонецПроцедуры

Здесь Список.Параметры - это список параметров запроса динамического списка для реквизита Список. Значение параметра Товар устанавливается равным значению параметра формы ФильтрПоТовару.

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


© 2024
rmt50.ru - Скорая компьютерная помощь