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