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

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

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

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

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

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

Ниже разобран полный цикл: создание формы, её регистрация в качестве формы выбора, передача параметров и отборов, возврат выбранного значения и типичные ошибки, из-за которых механизм не срабатывает. Примеры приведены для управляемых форм (режим «Такси»), как наиболее распространённого сценария.

Как работает механизм выбора в 1С

Выбор значения в управляемом приложении — это диалог между двумя формами. Форма-источник (например, документ с полем «Контрагент») инициирует открытие формы выбора и передаёт в неё параметры: текущее значение, отборы, признак множественного выбора. Форма выбора открывается в режиме блокирования окна владельца, пользователь отмечает нужный элемент, и результат возвращается в форму-источник.

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

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

Создание собственной формы выбора в конфигураторе

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

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

&НаСервере

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

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

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

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

ЭлементОтбора.ПравоеЗначение = Ложь;

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

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

Чтобы платформа стала открывать эту форму при выборе, откройте палитру свойств объекта метаданных и в поле «Форма выбора» укажите созданную форму. После обновления конфигурации базы данных стандартный выбор во всех полях этого типа будет использовать вашу форму.

Порядок действий
  1. 1
    В конфигураторе добавьте новую форму списка для нужного справочника или документа
  2. 2
    Настройте состав колонок, отборы по умолчанию и дополнительные команды
  3. 3
    В свойствах объекта метаданных укажите форму в поле «Форма выбора»
  4. 4
    Обновите конфигурацию базы данных
  5. 5
    Проверьте выбор в поле ввода: должна открыться ваша форма, а результат должен подставляться в поле

Программная подмена формы через ОбработкаПолученияФормы

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

Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма,

ДополнительнаяИнформация, СтандартнаяОбработка)

Если ВидФормы = "ФормаВыбора" Тогда

Если Параметры.Свойство("РежимВыбораПоставщика")

И Параметры.РежимВыбораПоставщика Тогда

СтандартнаяОбработка = Ложь;

ВыбраннаяФорма = "ФормаВыбораПоставщиков";

КонецЕсли;

КонецЕсли;

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

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

Чтобы передать в форму контекстный параметр (в примере — РежимВыбораПоставщика), в свойствах поля ввода установите связь через событие «НачалоВыбора» либо используйте свойство поля «ПараметрыВыбора» и «СвязиПараметровВыбора» — они автоматически попадут в параметры формы выбора.

Передача параметров и отборов в форму выбора

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

&НаКлиенте

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

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

ПараметрыВыбораПоля.Добавить(Новый ПараметрВыбора("Отбор.ВидНоменклатуры",

ПредопределенноеЗначение("Справочник.ВидыНоменклатуры.Товары")));

Элементы.Номенклатура.ПараметрыВыбора = Новый ФиксированныйМассив(ПараметрыВыбораПоля);

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

Параметры с именем «Отбор.<ИмяПоля>» платформа автоматически превращает в отбор динамического списка формы выбора — это работает и для стандартной, и для вашей собственной формы, если в ней основной реквизит является динамическим списком по тому же объекту. Дополнительно поддерживаются стандартные параметры: ТекущаяСтрока (позиционирование на текущем значении), МножественныйВыбор, РежимВыбора, ЗакрыватьПриВыборе.

Если вы открываете форму выбора вручную (например, по кнопке), параметры передаются вторым аргументом ОткрытьФорму, а результат принимается через описание оповещения:

&НаКлиенте

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

ПараметрыФормы = Новый Структура("МножественныйВыбор, ЗакрыватьПриВыборе", Истина, Ложь);

Оповещение = Новый ОписаниеОповещения("ПослеВыбораНоменклатуры", ЭтотОбъект);

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

ЭтотОбъект, , , , Оповещение, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);

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

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

В своей форме выбора за возврат результата отвечает метод ОповеститьОВыборе. Для формы списка удобнее всего подключить обработчик события ВыборЗначения таблицы списка — он срабатывает по двойному клику и по Enter:

&НаКлиенте

Процедура СписокВыборЗначения(Элемент, Значение, СтандартнаяОбработка)

СтандартнаяОбработка = Ложь;

ОповеститьОВыборе(Значение);

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

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

Для приёма результата в форме-источнике при ручном открытии реализуйте обработчик:

&НаКлиенте

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

Если ТипЗнч(ВыбранноеЗначение) = Тип("Массив") Тогда

Для Каждого Ссылка Из ВыбранноеЗначение Цикл

НоваяСтрока = Объект.Товары.Добавить();

НоваяСтрока.Номенклатура = Ссылка;

КонецЦикла;

КонецЕсли;

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

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

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

Открытие формы
Норма

При клике на поле выбора открывается именно ваша форма с нужными колонками

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

Открывается стандартная форма — проверьте свойство «Форма выбора» и обновление конфигурации БД

Возврат значения
Норма

Двойной клик по строке подставляет ссылку в поле ввода

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

Форма закрывается без подстановки — не вызывается ОповеститьОВыборе или нет обработчика ВыборЗначения

Отборы
Норма

В списке видны только элементы, удовлетворяющие переданному отбору

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

Отбор игнорируется — проверьте имена полей в ПараметрыВыбора и состав динамического списка

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

Первая распространённая ошибка — форма назначена в конфигураторе, но продолжает открываться стандартная. Причины: конфигурация базы данных не обновлена, форма назначена не тому объекту (например, справочнику-владельцу вместо подчинённого) или в модуле менеджера есть ОбработкаПолученияФормы, которая перекрывает настройку.

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

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

Типичные ошибки
01
Установка СтандартнаяОбработка = Ложь без проверки ВидФормы — подменяются все формы объекта, включая форму элемента
02
Использование Закрыть() вместо ОповеститьОВыборе при выборе из стандартного поля ввода — значение не подставляется в поле
03
Игнорирование параметра МножественныйВыбор — подбор по кнопке возвращает только одну строку вместо массива
04
Отбор в запросе динамического списка вместо отбора компоновки — пользователь не видит и не может снять ограничение, а стандартные ПараметрыВыбора перестают работать
05
Изменение типовой формы выбора вместо создания своей — конфликты при обновлении конфигурации

Безопасность изменений и когда привлекать специалиста

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

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

Итог

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

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

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

Можно ли сделать свою форму выбора только для одного документа, не меняя её глобально?

Да. Не назначайте форму в свойствах объекта, а в обработчике «НачалоВыбора» нужного поля документа установите СтандартнаяОбработка = Ложь и откройте свою форму через ОткрытьФорму с описанием оповещения. Либо передавайте контекстный параметр через ПараметрыВыбора и анализируйте его в ОбработкаПолученияФормы.

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

Используйте параметр выбора «Отбор.Владелец» в свойстве ПараметрыВыбора поля ввода или передайте в ОткрытьФорму структуру с ключом «Отбор», содержащим вложенную структуру с полем «Владелец». Для подчинённых справочников также работает стандартная связь параметров выбора.

Почему двойной клик по списку не подставляет значение в поле?

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

Как реализовать множественный выбор с возвратом нескольких значений?

Передайте в форму параметры МножественныйВыбор = Истина и ЗакрыватьПриВыборе = Ложь. В форме вызывайте ОповеститьОВыборе для каждого выбранного элемента или накопите ссылки в массив и передайте его одним вызовом. Форма-владелец должна обрабатывать массив в ОбработкаВыбора или в обработчике оповещения.

Работает ли свой механизм выбора в обычном приложении?

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

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

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