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