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