Разработка и Конфигурация · 13 мин
Как передать параметр в форму выбора в 1С
Как передать параметр в форму выбора в 1С: ОткрытьФорму, структура параметров, отбор, обработка выбора через ОповеститьОВыборе. Примеры кода для управляемых форм.
Передача параметра в форму выбора — одна из самых частых задач при разработке на платформе 1С:Предприятие 8.3. Типовой сценарий: пользователь нажимает кнопку выбора в поле ввода, открывается форма списка справочника или документа, и в неё нужно передать отбор, текущее значение, режим выбора или произвольные данные для настройки поведения формы.
В управляемых формах механизм построен вокруг объекта Структура, которая передаётся вторым параметром в метод ОткрытьФорму(). Внутри открываемой формы эти значения доступны через свойство Параметры в обработчике ПриСозданииНаСервере. Результат выбора возвращается через оповещение ОповеститьОВыборе или через обработку оповещения в вызывающей форме.
Ниже разобраны рабочие способы передачи параметров, установка отбора в динамическом списке, возврат выбранного значения, типичные ошибки и ограничения платформы. Примеры приведены для управляемого приложения — именно оно используется в современных конфигурациях (БП, УТ, ERP, ЗУП).
Базовый способ: ОткрытьФорму со структурой параметров
Универсальный метод открытия любой формы — ОткрытьФорму(). Его второй параметр принимает структуру, где ключи — имена параметров, а значения — передаваемые данные. Третьим параметром обычно указывают владельца формы, чтобы платформа корректно маршрутизировала оповещения о выборе.
&НаКлиенте
Процедура ПодобратьНоменклатуру(Команда)
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("РежимВыбора", Истина);
ПараметрыФормы.Вставить("ЗакрыватьПриВыборе", Ложь);
ПараметрыФормы.Вставить("ТекущаяСтрока", Объект.Номенклатура);
ОткрытьФорму("Справочник.Номенклатура.ФормаВыбора",
ПараметрыФормы, ЭтотОбъект, УникальныйИдентификатор);
КонецПроцедуры
Ключи РежимВыбора, ЗакрыватьПриВыборе, ТекущаяСтрока, Отбор — стандартные параметры форм списков, их обрабатывает сама платформа. Любые собственные ключи (например, СкладОтбора или ТолькоВНаличии) нужно обработать вручную в модуле формы выбора.
Четвёртый параметр ОткрытьФорму — ключ уникальности. Если передать туда УникальныйИдентификатор текущей формы, повторный вызов не создаст дубликат окна, а активирует уже открытое. Это полезно, когда подбор должен существовать в единственном экземпляре.
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("РежимВыбора", Истина);
ОткрытьФорму("Справочник.Номенклатура.ФормаВыбора", ПараметрыФормы, ЭтотОбъект);Передача отбора в динамический список формы выбора
Чаще всего параметр нужен, чтобы ограничить список: показать только контрагентов-поставщиков, только номенклатуру определённой группы, только непомеченные на удаление элементы. Для этого в структуру параметров добавляют ключ Отбор — вложенную структуру, где ключ совпадает с именем поля динамического списка.
&НаКлиенте
Процедура ВыбратьПоставщика(Команда)
Отбор = Новый Структура;
Отбор.Вставить("Поставщик", Истина);
Отбор.Вставить("ПометкаУдаления", Ложь);
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Отбор", Отбор);
ПараметрыФормы.Вставить("РежимВыбора", Истина);
ОткрытьФорму("Справочник.Контрагенты.ФормаВыбора",
ПараметрыФормы, ЭтотОбъект);
КонецПроцедуры
Платформа превращает такой отбор в фиксированные элементы отбора динамического списка. Важное следствие: пользователь не сможет снять этот отбор штатными средствами быстрого поиска — он «зашит» в настройки списка. Если нужен отменяемый отбор, его устанавливают программно в ПриСозданииНаСервере с режимом отображения, допускающим изменение.
Ограничение: отбор через структуру работает только по равенству. Сложные условия (больше/меньше, в списке, по подстроке) так не передать — их добавляют вручную в Список.Отбор на сервере в открываемой форме.
Чтение параметров внутри формы выбора
В модуле открываемой формы переданные значения доступны через свойство Параметры. Чтение выполняют в обработчике ПриСозданииНаСервере — это единственное место, где параметры гарантированно доступны до отрисовки формы и где можно настроить список до первого обращения к данным.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Параметры.Свойство("Склад") Тогда
ЭлементОтбора = Список.Отбор.Элементы.Добавить(
Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Склад");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = Параметры.Склад;
ЭлементОтбора.Использование = Истина;
КонецЕсли;
КонецПроцедуры
Обязательно проверяйте наличие параметра через Параметры.Свойство("Имя") перед обращением. Форма выбора может открываться не только вашим кодом, но и платформой — например, при стандартном выборе из поля ввода. В этом случае нестандартных параметров не будет, и прямое обращение Параметры.Склад вызовет ошибку «Поле объекта не обнаружено».
Если параметр должен влиять на заголовок формы, видимость колонок или доступность кнопок, всё это также настраивается в ПриСозданииНаСервере на основании прочитанных значений.
- 1Сформируйте структуру параметров в вызывающей форме
- 2Вызовите ОткрытьФорму с параметрами и указанием владельца
- 3В форме выбора прочитайте параметры в ПриСозданииНаСервере через Параметры.Свойство()
- 4Примените отбор к динамическому списку или настройте элементы формы
- 5Верните результат через ОповеститьОВыборе и обработайте его в ОбработкаВыбора владельца
Возврат выбранного значения обратно в форму
Когда форма открыта с ключом РежимВыбора = Истина и указан владелец, платформа сама обрабатывает стандартный выбор: при двойном щелчке по строке значение приходит в обработчик ОбработкаВыбора формы-владельца. Дополнительный код в форме выбора не нужен.
&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
Если ТипЗнч(ВыбранноеЗначение) = Тип("СправочникСсылка.Номенклатура") Тогда
Объект.Номенклатура = ВыбранноеЗначение;
Модифицированность = Истина;
КонецЕсли;
КонецПроцедуры
Для нестандартных сценариев — например, выбор по кнопке с дополнительными данными — в форме выбора вызывают ОповеститьОВыборе(Значение) явно. В качестве значения можно передать не только ссылку, но и структуру с несколькими полями, если по выбранной строке нужно заполнить сразу несколько реквизитов.
Альтернатива оповещению — ОписаниеОповещения и открытие формы через ОткрытьФорму с последней группой параметров или через метод ПоказатьОткрытьФорму. Однако для форм выбора канонический путь именно ОбработкаВыбора: он корректно работает и с блокирующими окнами, и с немодальным режимом.
Множественный выбор и подбор
Если установить ЗакрыватьПриВыборе = Ложь и МножественныйВыбор = Истина, форма остаётся открытой, и каждый выбор приходит отдельным событием. В ОбработкаВыбора тогда добавляют строку в табличную часть, а не заменяют значение. При закрытии формы подбора выбранные строки могут прийти массивом — проверяйте тип ВыбранноеЗначение через ТипЗнч.
Альтернативы: параметры выбора поля ввода и стандартная обработка
Не всегда нужно открывать форму вручную. Если задача — ограничить выбор в конкретном поле ввода, используйте свойство поля «Параметры выбора» (ПараметрыВыбора). Оно задаётся в конфигураторе или программно и автоматически передаётся в форму выбора, которую открывает сама платформа.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
НовыйПараметр = Новый ПараметрВыбора("Отбор.Поставщик", Истина);
МассивПараметров = Новый Массив;
МассивПараметров.Добавить(НовыйПараметр);
Элементы.Контрагент.ПараметрыВыбора =
Новый ФиксированныйМассив(МассивПараметров);
КонецПроцедуры
Дополнительно существуют связи параметров выбора (СвязиПараметровВыбора): они позволяют автоматически подставлять в отбор формы выбора значение другого поля текущей формы — классический пример: выбор договора только по выбранному контрагенту. Это избавляет от ручного открытия формы целиком.
Если же нужна полностью своя логика выбора, в обработчике НачалоВыбора поля ввода установите СтандартнаяОбработка = Ложь и откройте форму самостоятельно с любыми параметрами.
Сравнение вариантов
Максимальная гибкость: любые параметры, свой код в форме выбора. Требует ручной обработки параметров и выбора.
Простой отбор без кода открытия; платформа всё делает сама. Подходит только для стандартной формы выбора.
Автоматическая зависимость от значений других полей. Не подходит для сложных условий и вычисляемых отборов.
Типичные ошибки и ограничения
Самая частая проблема — параметр передан, но форма его «не видит». Причины: открыта не та форма (у объекта несколько форм выбора, а назначена основная другая), параметр читается не в ПриСозданииНаСервере, а позже, либо имя ключа в структуре отличается от имени, которое проверяет Параметры.Свойство().
Вторая группа ошибок связана с отбором: поле отбора отсутствует в запросе динамического списка (для произвольного запроса поле нужно явно вывести), либо тип значения отбора не совпадает с типом поля — например, передана строка вместо ссылки. В таком случае отбор молча не срабатывает или список оказывается пустым.
Третья группа — нарушение возврата результата: форма открыта без владельца, поэтому ОбработкаВыбора не вызывается; либо ОповеститьОВыборе вызван, но владелец не проверяет тип пришедшего значения и падает на чужих оповещениях.
Отдельное ограничение тонкого и веб-клиента: между клиентом и сервером параметры сериализуются, поэтому передавать можно только сериализуемые типы — примитивы, ссылки, структуры, массивы, таблицы значений. Передать, например, открытое соединение или объект COM нельзя.
Как проверить результат
В ПриСозданииНаСервере Параметры.Свойство() возвращает Истина
Свойство отсутствует — проверьте имя ключа и какая форма реально открылась
Список показывает только подходящие элементы
Показаны все элементы — проверьте имя поля отбора и тип значения
Срабатывает ОбработкаВыбора владельца с нужным значением
Обработчик не вызывается — форма открыта без владельца или без РежимВыбора
Проверка результата и отладка
Быстрый способ убедиться, что параметры доходят, — временно добавить в ПриСозданииНаСервере формы выбора вывод в журнал регистрации или сообщение с перечнем ключей структуры Параметры. В отладчике достаточно поставить точку останова и посмотреть содержимое Параметры в табло.
Для проверки отбора откройте настройки динамического списка в режиме предприятия через «Ещё — Настроить список»: фиксированный отбор, переданный параметром, виден в расширенном режиме настройки. Если его там нет — проблема на этапе формирования структуры; если есть, но данные не фильтруются — проблема в типах значений или в составе полей запроса.
Финальный контроль — сценарный: открыть форму, убедиться в корректном отборе, выбрать элемент, проверить, что в вызывающей форме заполнилось нужное поле и установился признак модифицированности.
Что важно запомнить
Параметры передаются структурой через ОткрытьФорму, читаются через Параметры в ПриСозданииНаСервере с обязательной проверкой Свойство(), отбор задаётся ключом Отбор по равенству, а результат возвращается в ОбработкаВыбора владельца. Указывайте владельца формы — без него выбор не вернётся.
Частые вопросы
Как передать несколько параметров в форму выбора?
Добавьте все значения в одну структуру: ПараметрыФормы.Вставить("Ключ1", Значение1), ПараметрыФормы.Вставить("Ключ2", Значение2) и так далее. Количество ключей не ограничено, но каждый нестандартный ключ нужно обработать в модуле формы выбора вручную.
Почему отбор, переданный параметром, не работает?
Чаще всего имя поля в структуре Отбор не совпадает с именем поля динамического списка, либо тип значения не соответствует типу поля (например, строка вместо ссылки). Для произвольного запроса списка также проверьте, что поле вообще присутствует в выборке запроса.
Как передать параметр, если форму выбора открывает сама платформа?
Используйте свойство поля ввода «Параметры выбора» — его можно задать в конфигураторе или программно через Элементы.ИмяПоля.ПараметрыВыбора. Для зависимости от других полей формы применяйте «Связи параметров выбора».
Как получить из формы выбора не ссылку, а несколько значений?
В форме выбора сформируйте структуру с нужными полями (например, ссылка, наименование, цена) и вызовите ОповеститьОВыборе(СтруктураРезультата). В вызывающей форме в ОбработкаВыбора проверьте тип значения и заполните реквизиты из структуры.
ОбработкаВыбора не вызывается — в чём причина?
Проверьте три условия: форма открыта с указанием владельца (третий параметр ОткрытьФорму), в параметрах установлен РежимВыбора = Истина, а в форме выбора либо работает стандартный выбор, либо явно вызван ОповеститьОВыборе. Нарушение любого из условий разрывает цепочку возврата значения.
Можно ли передать в форму выбора таблицу значений или массив?
Да, структуры, массивы и таблицы значений сериализуются и передаются между клиентом и сервером. Передавайте по возможности ссылки вместо «тяжёлых» объектов — это снижает объём передаваемых данных и число серверных вызовов.