Как добавить свой пункт меню в выпадающий список поля ввода на управляемой форме 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Метод 1: Использование списка выбора и события ОбработкаВыбора

Это самый прямолинейный способ, который подходит, если нам нужно добавить фиксированную команду в конкретное поле на форме. Мы добавим элемент в коллекцию СписокВыбора и опишем реакцию системы на его выбор.

Разберем реализацию по шагам. Сначала на стороне сервера при создании формы мы наполним список выбора нашего элемента формы нужным значением. Проанализируем пример кода:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Добавляем новый пункт в выпадающий список конкретного поля
    // Параметры: Значение, Представление, Пометка, Картинка
    Элементы.Контрагент.СписокВыбора.Добавить(
        "СоздатьСпецВариант", 
        "Создать вариант номенклатуры этого контрагента...", 
        Ложь, 
        БиблиотекаКартинок.Новый
    );
    
КонецПроцедуры

Теперь нам необходимо обработать нажатие на этот пункт. Для этого используем клиентское событие ОбработкаВыбора. Нам важно установить СтандартнаяОбработка = Ложь, чтобы система не пыталась подставить текстовое значение в поле, а выполнила наш алгоритм.


&НаКлиенте
Процедура КонтрагентОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
    
    // Проверяем, выбрана ли наша кастомная команда
    Если ВыбранноеЗначение = "СоздатьСпецВариант" Тогда
        
        // Отменяем стандартное поведение платформы
        СтандартнаяОбработка = Ложь;
        
        // Здесь описываем логику: открытие формы, вызов функции и т.д.
        ОткрытьФорму("Справочник.НоменклатураКонтрагентов.ФормаОбъекта", Новый Структура("Основание", Объект.Ссылка));
        
    КонецЕсли;
    
КонецПроцедуры

Метод 2: Глобальное расширение через модуль менеджера

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

Выясним, как это работает: когда пользователь начинает вводить текст или нажимает кнопку выпадающего списка, платформа обращается к менеджеру объекта за данными. Мы можем вмешаться в этот процесс и модифицировать параметр ДанныеВыбора.


// В модуле менеджера справочника Номенклатура
Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
    
    // Если данные еще не сформированы, сформируем их стандартно
    // Или сразу подменим список своим
    Если ДанныеВыбора = Неопределено Тогда
        ДанныеВыбора = Новый СписокЗначений;
    КонецЕсли;
    
    // Добавляем наш пункт в начало списка
    ДанныеВыбора.Вставить(0, "ДействиеСоздатьПоШаблону", "быстрое создание по шаблону...");
    
КонецПроцедуры

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

Метод 3: Динамическое формирование списка через АвтоПодбор

Рассмотрим ситуацию, когда содержимое выпадающего списка должно зависеть от того, что именно пользователь вводит в поле. Для этого идеально подходит событие АвтоПодбор. Это позволяет реализовать «умный» поиск.

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


&НаКлиенте
Процедура НоменклатураАвтоПодбор(Элемент, Текст, ДанныеВыбора, Параметры, Ожидание, СтандартнаяОбработка)
    
    // Если пользователь ввел более 3 символов
    Если СтрДлина(Текст) > 3 Тогда
        
        // Запрещаем стандартный поиск, если хотим полностью контролировать список
        // Или дополняем существующий
        СписокВариантов = Новый СписокЗначений;
        СписокВариантов.Добавить("СоздатьНовый", "Ничего не найдено. Создать " + Текст + "?");
        
        ДанныеВыбора = СписокВариантов;
        СтандартнаяОбработка = Ложь;
        
    КонецЕсли;
    
КонецПроцедуры

Метод 4: Использование свойства Кнопка создания (Платформа 8.3.15+)

В современных версиях платформы 1С реализован более изящный механизм для добавления команд создания объектов. У элементов формы типа ПолеВвода есть свойство Кнопка создания.

Разберем преимущества этого способа:

  1. Визуальное соответствие стандартам UX: рядом с полем появляется привычный «плюсик».
  2. Наличие специализированного события ОбработкаСоздания.
  3. Возможность передать параметры заполнения напрямую в открываемую форму.

Чтобы переопределить логику этой кнопки, используйте следующий код:


&НаКлиенте
Процедура КонтрагентОбработкаСоздания(Элемент, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь; // Выключаем стандартное открытие формы нового элемента
    
    ПараметрыФормы = Новый Структура("РежимВыбора", Истина);
    ОткрытьФорму("Обработка.ПомощникСозданияКонтрагента.Форма", ПараметрыФормы, Элемент);
    
КонецПроцедуры

Советы по улучшению интерфейса

Чтобы пользователь четко отличал данные (ссылки на элементы) от команд (ваших кастомных пунктов), рекомендуем придерживаться следующих правил:

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

← На главную