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

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

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

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

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

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

Материал ориентирован на управляемые формы, которые используются во всех современных конфигурациях на платформе 8.3. Если конфигурация работает в режиме обычного приложения, механика похожа, но синтаксис открытия форм отличается.

Что такое форма выбора и когда нужна своя

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

Собственная форма выбора нужна, когда стандартного поведения недостаточно:

  • нужно показывать только элементы, удовлетворяющие условию (например, только поставщиков, только непомеченные на удаление, только действующие договоры);
  • требуется другой состав колонок — артикул, цена, остаток, ИНН;
  • нужен выбор нескольких элементов одновременно;
  • форму выбора открывают программно из своей обработки или кнопки, а не из поля ввода;
  • результат выбора надо обработать особым образом — например, сразу создать строку табличной части.

Создание формы выбора у объекта метаданных

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

Порядок действий в конфигураторе
  1. 1
    Откройте конфигуратор и найдите нужный объект (например, Справочники → Номенклатура).
  2. 2
    Раскройте объект, перейдите на ветку «Формы» и нажмите «Добавить».
  3. 3
    В конструкторе выберите тип «Форма выбора», задайте имя, например ФормаВыбора.
  4. 4
    В дереве реквизитов формы перетащите в элементы формы нужные колонки списка.
  5. 5
    На закладке «Основные формы» объекта назначьте созданную форму в поле «Форма выбора».
  6. 6
    Обновите конфигурацию базы данных (F7) и проверьте выбор в режиме предприятия.

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

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

Настройка отбора в форме выбора

Чаще всего доработка формы выбора сводится к отбору. Есть два способа: зафиксировать отбор в самой форме или передавать его параметром при открытии. Первый вариант подходит, когда условие постоянное; второй — когда условие зависит от контекста вызова.

Постоянный отбор устанавливается в модуле формы в обработчике ПриСозданииНаСервере через настройки динамического списка:

&НаСервере

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

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

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

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

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

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

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

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

Программное открытие формы выбора

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

&НаКлиенте

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

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

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

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

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

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

Отбор.Вставить("ЭтоГруппа", Ложь);

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

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

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

Ключевые параметры:

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

Третий параметр ОткрытьФорму — владелец формы. Если передать ЭтотОбъект, оповещение о выборе придёт именно в текущую форму, что упрощает обработку результата.

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

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

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

Способ через ОбработкаВыбора подключается автоматически, если форма выбора открывалась из поля ввода. Для программного открытия надёжнее использовать ОписаниеОповещения:

&НаКлиенте

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

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

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

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

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

&НаКлиенте

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

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

Возврат; // пользователь закрыл форму без выбора

КонецЕсли;

Объект.Товар = Результат;

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

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

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

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

Открытие формы из поля ввода
Норма

Открывается созданная форма выбора с нужными колонками

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

Открывается стандартная форма — не назначена основной или не обновлена конфигурация БД

Отбор при открытии
Норма

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

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

Видны все элементы — отбор передан с ошибкой в имени поля или не применился

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

Выбранное значение попадает в реквизит вызывающей формы

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

Поле очищается — нет проверки результата на Неопределено

Закрытие без выбора
Норма

Данные в вызывающей форме не меняются

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

Реквизит стирается при нажатии Esc

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

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

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

&НаКлиенте

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

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

Возврат;

КонецЕсли;

ПараметрыОтбора = Новый Структура("Номенклатура", Результат);

НайденныеСтроки = Объект.Товары.НайтиСтроки(ПараметрыОтбора);

Если НайденныеСтроки.Количество() > 0 Тогда

НайденныеСтроки[0].Количество = НайденныеСтроки[0].Количество + 1;

Иначе

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

НоваяСтрока.Номенклатура = Результат;

НоваяСтрока.Количество = 1;

КонецЕсли;

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

Если включён МножественныйВыбор и пользователь выделил несколько строк за раз, результатом будет массив ссылок — обработчик должен уметь работать и с массивом, и с одиночным значением. Проверяйте тип через ТипЗнч(Результат) = Тип("Массив").

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

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

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

Отдельного внимания заслуживает модальность. В современных конфигурациях режим использования модальности обычно запрещён, поэтому методы ОткрытьФормуМодально и ОткрытьЗначение не работают. Весь обмен результатом выбора строится на асинхронных оповещениях — это нужно учитывать при переносе старого кода из обычных форм.

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

Альтернативы собственной форме выбора

Не каждая задача требует создания формы. Часть сценариев закрывается настройками поля ввода без единой строчки кода в модуле формы:

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

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

Отбор по реквизиту той же формы (договоры выбранного контрагента). Настраивается в свойствах поля ввода, кода нет. Не подходит для сложных условий.

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

Фиксированные значения отбора (только поставщики, только непомеченные). Задаются в свойствах поля. Ограничение — значения статичны.

Быстрый выбор (ввод по строке)

Пользователь вводит текст и выбирает из выпадающего списка без открытия формы. Удобно для больших справочников, но не даёт обзора всего списка.

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

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

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

Итог

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

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

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

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

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

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

Добавьте в обработчик ПриСозданииНаСервере формы выбора элемент отбора динамического списка по полю ПометкаУдаления со значением Ложь. Такой отбор, установленный программно в модуле формы, пользователь не сможет отключить штатными средствами настройки списка.

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

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

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

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

Чем форма выбора отличается от формы списка?

Форма списка предназначена для просмотра и редактирования элементов: двойной щелчок открывает карточку объекта. Форма выбора предназначена для подбора значения: двойной щелчок или кнопка «Выбрать» возвращает ссылку в вызывающую форму и закрывает окно. Форму списка тоже можно открыть в режиме выбора, передав параметр РежимВыбора = Истина.

Почему не работает ОткрытьФормуМодально в тонком клиенте?

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