К статье
Практический материал

Разработка и Конфигурация · 13 мин

Как передать параметр в форму выбора в 1С

Как передать параметр в форму выбора в 1С: ОткрытьФорму, структура параметров, отбор, обработка выбора через ОповеститьОВыборе. Примеры кода для управляемых форм.

Передача параметра в форму выбора — одна из самых частых задач при разработке на платформе 1С:Предприятие 8.3. Типовой сценарий: пользователь нажимает кнопку выбора в поле ввода, открывается форма списка справочника или документа, и в неё нужно передать отбор, текущее значение, режим выбора или произвольные данные для настройки поведения формы.

В управляемых формах механизм построен вокруг объекта Структура, которая передаётся вторым параметром в метод ОткрытьФорму(). Внутри открываемой формы эти значения доступны через свойство Параметры в обработчике ПриСозданииНаСервере. Результат выбора возвращается через оповещение ОповеститьОВыборе или через обработку оповещения в вызывающей форме.

Ниже разобраны рабочие способы передачи параметров, установка отбора в динамическом списке, возврат выбранного значения, типичные ошибки и ограничения платформы. Примеры приведены для управляемого приложения — именно оно используется в современных конфигурациях (БП, УТ, ERP, ЗУП).

Базовый способ: ОткрытьФорму со структурой параметров

Универсальный метод открытия любой формы — ОткрытьФорму(). Его второй параметр принимает структуру, где ключи — имена параметров, а значения — передаваемые данные. Третьим параметром обычно указывают владельца формы, чтобы платформа корректно маршрутизировала оповещения о выборе.

&НаКлиенте

Процедура ПодобратьНоменклатуру(Команда)

ПараметрыФормы = Новый Структура;

ПараметрыФормы.Вставить("РежимВыбора", Истина);

ПараметрыФормы.Вставить("ЗакрыватьПриВыборе", Ложь);

ПараметрыФормы.Вставить("ТекущаяСтрока", Объект.Номенклатура);

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

ПараметрыФормы, ЭтотОбъект, УникальныйИдентификатор);

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

Ключи РежимВыбора, ЗакрыватьПриВыборе, ТекущаяСтрока, Отбор — стандартные параметры форм списков, их обрабатывает сама платформа. Любые собственные ключи (например, СкладОтбора или ТолькоВНаличии) нужно обработать вручную в модуле формы выбора.

Четвёртый параметр ОткрытьФорму — ключ уникальности. Если передать туда УникальныйИдентификатор текущей формы, повторный вызов не создаст дубликат окна, а активирует уже открытое. Это полезно, когда подбор должен существовать в единственном экземпляре.

bsl
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("РежимВыбора", Истина);
ОткрытьФорму("Справочник.Номенклатура.ФормаВыбора", ПараметрыФормы, ЭтотОбъект);

Передача отбора в динамический список формы выбора

Чаще всего параметр нужен, чтобы ограничить список: показать только контрагентов-поставщиков, только номенклатуру определённой группы, только непомеченные на удаление элементы. Для этого в структуру параметров добавляют ключ Отбор — вложенную структуру, где ключ совпадает с именем поля динамического списка.

&НаКлиенте

Процедура ВыбратьПоставщика(Команда)

Отбор = Новый Структура;

Отбор.Вставить("Поставщик", Истина);

Отбор.Вставить("ПометкаУдаления", Ложь);

ПараметрыФормы = Новый Структура;

ПараметрыФормы.Вставить("Отбор", Отбор);

ПараметрыФормы.Вставить("РежимВыбора", Истина);

ОткрытьФорму("Справочник.Контрагенты.ФормаВыбора",

ПараметрыФормы, ЭтотОбъект);

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

Платформа превращает такой отбор в фиксированные элементы отбора динамического списка. Важное следствие: пользователь не сможет снять этот отбор штатными средствами быстрого поиска — он «зашит» в настройки списка. Если нужен отменяемый отбор, его устанавливают программно в ПриСозданииНаСервере с режимом отображения, допускающим изменение.

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

Чтение параметров внутри формы выбора

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

&НаСервере

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

Если Параметры.Свойство("Склад") Тогда

ЭлементОтбора = Список.Отбор.Элементы.Добавить(

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

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

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

ЭлементОтбора.ПравоеЗначение = Параметры.Склад;

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

КонецЕсли;

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

Обязательно проверяйте наличие параметра через Параметры.Свойство("Имя") перед обращением. Форма выбора может открываться не только вашим кодом, но и платформой — например, при стандартном выборе из поля ввода. В этом случае нестандартных параметров не будет, и прямое обращение Параметры.Склад вызовет ошибку «Поле объекта не обнаружено».

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

Порядок действий
  1. 1
    Сформируйте структуру параметров в вызывающей форме
  2. 2
    Вызовите ОткрытьФорму с параметрами и указанием владельца
  3. 3
    В форме выбора прочитайте параметры в ПриСозданииНаСервере через Параметры.Свойство()
  4. 4
    Примените отбор к динамическому списку или настройте элементы формы
  5. 5
    Верните результат через ОповеститьОВыборе и обработайте его в ОбработкаВыбора владельца

Возврат выбранного значения обратно в форму

Когда форма открыта с ключом РежимВыбора = Истина и указан владелец, платформа сама обрабатывает стандартный выбор: при двойном щелчке по строке значение приходит в обработчик ОбработкаВыбора формы-владельца. Дополнительный код в форме выбора не нужен.

&НаКлиенте

Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)

Если ТипЗнч(ВыбранноеЗначение) = Тип("СправочникСсылка.Номенклатура") Тогда

Объект.Номенклатура = ВыбранноеЗначение;

Модифицированность = Истина;

КонецЕсли;

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

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

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

Множественный выбор и подбор

Если установить ЗакрыватьПриВыборе = Ложь и МножественныйВыбор = Истина, форма остаётся открытой, и каждый выбор приходит отдельным событием. В ОбработкаВыбора тогда добавляют строку в табличную часть, а не заменяют значение. При закрытии формы подбора выбранные строки могут прийти массивом — проверяйте тип ВыбранноеЗначение через ТипЗнч.

Альтернативы: параметры выбора поля ввода и стандартная обработка

Не всегда нужно открывать форму вручную. Если задача — ограничить выбор в конкретном поле ввода, используйте свойство поля «Параметры выбора» (ПараметрыВыбора). Оно задаётся в конфигураторе или программно и автоматически передаётся в форму выбора, которую открывает сама платформа.

&НаСервере

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

НовыйПараметр = Новый ПараметрВыбора("Отбор.Поставщик", Истина);

МассивПараметров = Новый Массив;

МассивПараметров.Добавить(НовыйПараметр);

Элементы.Контрагент.ПараметрыВыбора =

Новый ФиксированныйМассив(МассивПараметров);

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

Дополнительно существуют связи параметров выбора (СвязиПараметровВыбора): они позволяют автоматически подставлять в отбор формы выбора значение другого поля текущей формы — классический пример: выбор договора только по выбранному контрагенту. Это избавляет от ручного открытия формы целиком.

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

Сравнение вариантов

ОткрытьФорму со структурой параметров

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

Параметры выбора поля ввода

Простой отбор без кода открытия; платформа всё делает сама. Подходит только для стандартной формы выбора.

Связи параметров выбора

Автоматическая зависимость от значений других полей. Не подходит для сложных условий и вычисляемых отборов.

Типичные ошибки и ограничения

Самая частая проблема — параметр передан, но форма его «не видит». Причины: открыта не та форма (у объекта несколько форм выбора, а назначена основная другая), параметр читается не в ПриСозданииНаСервере, а позже, либо имя ключа в структуре отличается от имени, которое проверяет Параметры.Свойство().

Вторая группа ошибок связана с отбором: поле отбора отсутствует в запросе динамического списка (для произвольного запроса поле нужно явно вывести), либо тип значения отбора не совпадает с типом поля — например, передана строка вместо ссылки. В таком случае отбор молча не срабатывает или список оказывается пустым.

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

Типичные ошибки
01
Обращение к Параметры.Имя без проверки Свойство() — ошибка при стандартном открытии формы платформой
02
Отбор по полю, которого нет в динамическом списке, — отбор молча игнорируется
03
Открытие формы без указания владельца — ОбработкаВыбора не вызывается, значение теряется
04
Передача мутабельных объектов вместо ссылок — лишние серверные вызовы и риск устаревших данных

Отдельное ограничение тонкого и веб-клиента: между клиентом и сервером параметры сериализуются, поэтому передавать можно только сериализуемые типы — примитивы, ссылки, структуры, массивы, таблицы значений. Передать, например, открытое соединение или объект COM нельзя.

Контрольные точки

Как проверить результат

Параметр дошёл до формы
Норма

В ПриСозданииНаСервере Параметры.Свойство() возвращает Истина

Тревожный признак

Свойство отсутствует — проверьте имя ключа и какая форма реально открылась

Отбор применился
Норма

Список показывает только подходящие элементы

Тревожный признак

Показаны все элементы — проверьте имя поля отбора и тип значения

Выбор возвращается
Норма

Срабатывает ОбработкаВыбора владельца с нужным значением

Тревожный признак

Обработчик не вызывается — форма открыта без владельца или без РежимВыбора

Проверка результата и отладка

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

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

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

Итог

Что важно запомнить

Параметры передаются структурой через ОткрытьФорму, читаются через Параметры в ПриСозданииНаСервере с обязательной проверкой Свойство(), отбор задаётся ключом Отбор по равенству, а результат возвращается в ОбработкаВыбора владельца. Указывайте владельца формы — без него выбор не вернётся.

Частые вопросы

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

Добавьте все значения в одну структуру: ПараметрыФормы.Вставить("Ключ1", Значение1), ПараметрыФормы.Вставить("Ключ2", Значение2) и так далее. Количество ключей не ограничено, но каждый нестандартный ключ нужно обработать в модуле формы выбора вручную.

Почему отбор, переданный параметром, не работает?

Чаще всего имя поля в структуре Отбор не совпадает с именем поля динамического списка, либо тип значения не соответствует типу поля (например, строка вместо ссылки). Для произвольного запроса списка также проверьте, что поле вообще присутствует в выборке запроса.

Как передать параметр, если форму выбора открывает сама платформа?

Используйте свойство поля ввода «Параметры выбора» — его можно задать в конфигураторе или программно через Элементы.ИмяПоля.ПараметрыВыбора. Для зависимости от других полей формы применяйте «Связи параметров выбора».

Как получить из формы выбора не ссылку, а несколько значений?

В форме выбора сформируйте структуру с нужными полями (например, ссылка, наименование, цена) и вызовите ОповеститьОВыборе(СтруктураРезультата). В вызывающей форме в ОбработкаВыбора проверьте тип значения и заполните реквизиты из структуры.

ОбработкаВыбора не вызывается — в чём причина?

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

Можно ли передать в форму выбора таблицу значений или массив?

Да, структуры, массивы и таблицы значений сериализуются и передаются между клиентом и сервером. Передавайте по возможности ссылки вместо «тяжёлых» объектов — это снижает объём передаваемых данных и число серверных вызовов.