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

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

Как настроить форму выбора в 1С

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

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

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

Материал ориентирован на управляемые формы (такси-интерфейс), поскольку именно они используются в современных конфигурациях. Примеры кода приведены на встроенном языке 1С и подходят для типовых и самописных конфигураций на платформе 8.3.

Как устроена форма выбора и когда её нужно дорабатывать

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

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

Настройка выбора без программирования: параметры и свойства

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

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

Чтобы исключить из выбора помеченные на удаление элементы без кода, в собственной форме выбора достаточно добавить отбор в динамический список через «Настройку списка» — платформа сохранит его как постоянный. Это предпочтительнее программной фильтрации, потому что настройка видна прямо в конфигураторе и не ломается при обновлении типового кода.

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

Когда декларативных средств не хватает, создайте собственную форму. В конфигураторе откройте объект метаданных, перейдите на закладку «Формы» и добавьте новую форму с видом «Форма выбора». Конструктор предложит основной реквизит — обычно это «Список» типа «ДинамическийСписок» с автоматическим запросом по таблице объекта.

После создания формы проверьте ключевое свойство самой формы — «РежимОткрытияОкна»: для выбора обычно используется «Блокировать окно владельца» или «Блокировать весь интерфейс», чтобы пользователь не мог продолжить ввод, не завершив подбор. Также убедитесь, что у динамического списка включено свойство «АвтоЗаполнениеДоступныхПолей» либо вручную отметьте поля, которые должны быть доступны для отбора и вывода.

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

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

Настройка динамического списка и отборов

Динамический список — сердце формы выбора. Через «Настройку списка» в конфигураторе задаются постоянные отборы, сортировка и группировка. Постоянный отбор пользователь не сможет снять, поэтому именно сюда помещают технологические ограничения вроде «ПометкаУдаления = Ложь» или «ЭтоГруппа = Ложь» для форм выбора, где группы выбирать нельзя.

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

&НаСервере

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

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

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

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

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

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

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

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

КонецЕсли;

КонецЕсли;

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

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

Программное открытие формы выбора и обработка результата

Открыть форму выбора из кода можно двумя способами. Современный — через метод «ОткрытьФорму» с параметрами и описанием оповещения о закрытии. Устаревший модальный вызов «ВыбратьЭлемент» в управляемом приложении не используется и в ряде режимов запрещён настройками совместимости.

&НаКлиенте

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

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

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

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

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

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

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

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

&НаКлиенте

Процедура ПослеВыбораКонтрагента(Результат, ДополнительныеПараметры) Экспорт

Если Результат <> Неопределено Тогда

Объект.Контрагент = Результат;

КонецЕсли;

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

Обратите внимание на параметр «МножественныйВыбор»: если он установлен в Истина, результатом будет массив ссылок, а не одна ссылка, и обработчик оповещения должен это учитывать. Параметр «ТекущаяСтрока» позволяет спозиционировать список на уже выбранном значении — это заметно улучшает удобство при повторном открытии.

Если форма выбора открывается из поля ввода стандартно, а вам нужно лишь перехватить результат, используйте обработчик «ОбработкаВыбора» формы-владельца. В нём доступны выбранное значение и источник выбора, что позволяет реализовать, например, автоматическое заполнение связанных реквизитов после подбора.

1c
ОткрытьФорму("Справочник.Номенклатура.ФормаВыбора", ПараметрыФормы, ЭтотОбъект,,,, Оповещение, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);

Проверка результата и типичные ошибки

После настройки проверьте сценарий целиком: открытие формы из поля ввода, применение отборов, выбор значения, передачу результата в документ. Отдельно проверьте поведение при отказе от выбора — закрытие формы по Escape не должно очищать уже заполненное поле или вызывать ошибку «Неопределено».

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

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

Отбор по владельцу
Норма

В списке только элементы нужного владельца, отбор не снимается пользователем

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

Видны все элементы или отбор можно отключить

Передача результата
Норма

После выбора поле заполнено ссылкой, форма закрылась

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

Поле пустое или возникает ошибка обращения к значению

Скорость открытия
Норма

Форма открывается без заметной паузы на рабочей базе

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

Открытие занимает несколько секунд из-за тяжёлого запроса списка

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

Типичные ошибки
01
Доработана форма списка вместо формы выбора — при подборе открывается стандартная форма без отборов
02
Собственная форма создана, но не назначена основной формой выбора объекта
03
Отбор установлен программно без проверки существующего параметра «Отбор» — условия перезаписывают друг друга
04
Модальный вызов выбора в управляемом приложении — код не работает при запрещённой модальности
05
В запросе списка нет основной таблицы — выбор ссылки возвращает Неопределено

Альтернативные подходы и ограничения

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

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

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

Параметры и связи выбора

Подходят для простых отборов по реквизитам. Ограничение: нельзя менять состав колонок и логику запроса

Собственная форма выбора

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

Быстрый выбор без формы

Лучший вариант для коротких списков. Ограничение: непригоден для больших справочников и сложных отборов

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

Итог

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

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

Частые вопросы о настройке формы выбора

Почему при подборе открывается не моя форма, а стандартная?

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

Как запретить выбор групп в иерархическом справочнике?

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

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

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

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

Передайте при открытии параметр «МножественныйВыбор» со значением Истина и «ЗакрыватьПриВыборе» со значением Ложь. Пользователь сможет отметить несколько строк, а в обработчик оповещения вернётся массив ссылок. Учтите это в коде обработки результата — обращение к массиву как к одиночной ссылке вызовет ошибку.

Форма выбора открывается медленно. Что проверить в первую очередь?

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

Нужно ли дорабатывать типовую конфигурацию напрямую?

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