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