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