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