Как создать и открыть свою форму выбора во внешнем отчете или обработке 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке внешних отчетов и дополнительных обработок нередко возникает ситуация, когда пользователю необходимо выбрать документ или справочник, у которого в конфигурации отсутствует назначенная стандартная форма выбора (например, Документ.РегламентированныйОтчет). В таких случаях автогенерируемая платформой форма открывается как обычный список, не позволяя интерактивно вернуть выбранную ссылку в поле ввода.

Разберем, почему возникает такое поведение платформы и как правильно реализовать собственную форму выбора внутри внешнего отчета.

Причины проблемы и механизм работы управляемых форм

Проанализируем ситуацию: когда форма создается внутри внешней обработки или отчета, она является независимой произвольной формой. Платформа 1С не связывает её автоматически с метаданными документа конфигурации. В результате на форме по умолчанию отсутствует стандартная кнопка Выбрать, а двойной клик по строке таблицы пытается открыть сам документ, вместо того чтобы передать ссылку в вызывающее поле.

Для корректной работы механизма выбора нам необходимо выполнить три действия:

  1. Перехватить событие НачалоВыбора у реквизита на основной форме отчета.
  2. Открыть произвольную форму с признаком режима выбора и передать элемент-владелец.
  3. Настроить саму форму выбора и динамический список для возврата результата через метод ОповеститьОВыборе.

Шаг 1. Переопределение события НачалоВыбора

Рассмотрим код вызова формы. На основной форме внешнего отчета для поля ввода документа создаем обработчик события НачалоВыбора. В нем отключаем стандартное поведение платформы с помощью флага СтандартнаяОбработка = Ложь и открываем нашу форму:


&НаКлиенте
Процедура РегламентированныйОтчетНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    
    ПараметрыФормы = Новый Структура;
    ПараметрыФормы.Вставить("РежимВыбора", Истина);
    ПараметрыФормы.Вставить("ЗакрыватьПриВыборе", Истина);
    
    // Передаем элемент поля ввода в качестве владельца формы выбора
    ОткрытьФорму("ВнешнийОтчет.ИмяОтчета.Форма.ФормаВыбораРегламентированногоОтчета", ПараметрыФормы, Элемент);
КонецПроцедуры

Важный момент: передача третьего параметра Элемент связывает открываемое окно с вызывающим полем ввода, благодаря чему платформа автоматически перенесет выбранное значение в данный реквизит при оповещении о выборе.

Шаг 2. Настройка динамического списка и элементов формы выбора

Создадим во внешнем отчете форму с типом Форма (произвольная) и добавим основной реквизит Список с типом ДинамическийСписок, настроенным на основную таблицу нужного документа.

Разберем ключевые настройки таблицы формы:

  1. У таблицы динамического списка в свойствах устанавливаем флаг Режим выбора (РежимВыбора = Истина).
  2. Создаем команду формы ВыбратьЗначение, выносим её в командную панель и назначаем свойство КнопкаПоУмолчанию = Истина (чтобы выбор происходил по нажатию клавиши Enter).

Напишем обработчик для команды выбора:


&НаКлиенте
Процедура КомандаВыбрать(Команда)
    ТекущаяСтрока = Элементы.Список.ТекущаяСтрока;
    Если ЗначениеЗаполнено(ТекущаяСтрока) Тогда
        ОповеститьОВыборе(ТекущаяСтрока);
    КонецЕсли;
КонецПроцедуры

Шаг 3. Обработка двойного клика мыши

Чтобы форма реагировала на двойной клик мыши по строке динамического списка, назначим обработчик события Выбор для элемента таблицы:


&НаКлиенте
Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    ОповеститьОВыборе(ВыбраннаяСтрока);
КонецПроцедуры

Процедура ОповеститьОВыборе передает ссылку на выбранный документ в форму-владелец и автоматически закрывает текущую форму выбора.

Альтернативный вариант: использование ОписанияОповещения

Если выбор необходимо осуществлять без прямой привязки к конкретному элементу управления формы, можно воспользоваться асинхронным оповещением через ОписаниеОповещения.

Посмотрим на пример реализации:


&НаКлиенте
Процедура РегламентированныйОтчетНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    
    Оповещение = Новый ОписаниеОповещения("ПослеВыбораОтчета", ЭтотОбъект);
    ОткрытьФорму("ВнешнийОтчет.ИмяОтчета.Форма.ФормаВыбораРегламентированногоОтчета", , ЭтотОбъект, , , , Оповещение);
КонецПроцедуры

&НаКлиенте
Процедура ПослеВыбораОтчета(РезультатВыбора, ДополнительныеПараметры) Экспорт
    Если ЗначениеЗаполнено(РезультатВыбора) Тогда
        Отчет.РегламентированныйОтчет = РезультатВыбора;
    КонецЕсли;
КонецПроцедуры

В этом случае в самой форме выбора достаточно вызвать метод Закрыть(ВыбранноеЗначение), и результат вернется в процедуру ПослеВыбораОтчета.

← На главную