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