Как реализовать выбор произвольного документа в поле ввода управляемой формы 1С без изменения конфигурации

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

При разработке внешних обработок на платформе 1С:Предприятие 8.3 (управляемые формы) часто возникает необходимость предоставить пользователю возможность выбрать произвольный документ из базы данных. Для этого обычно создается реквизит формы с составным типом ДокументСсылка и размещается соответствующее поле ввода.

Однако при стандартной настройке разработчики часто сталкиваются с нетипичным поведением: после выбора вида документа открывается журнал или список, но при попытке выбрать конкретную запись двойным кликом мыши или нажатием клавиши Enter документ не переносится в поле ввода, а открывается на редактирование. Разберем по шагам причину этого явления и рассмотрим, как обойти проблему во внешней обработке без внесения изменений в конфигурацию.

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

Выясним, почему платформой 1С задействуется форма редактирования вместо выбора объекта:

  1. Отсутствие основной формы выбора: Если в конфигураторе для конкретного типа документа не создана специальная форма выбора и она не назначена как основная, платформа автоматически использует стандартную форму списка.
  2. Отсутствие контекста выбора: Когда форма списка открывается платформой без явного указания параметра режима выбора, динамический список на форме работает в режиме обычной навигации и просмотра. В этом режиме двойной клик воспринимается как команда открытия формы объекта.
  3. Составной тип данных: При использовании реквизита типа ДокументСсылка платформа сначала запрашивает у пользователя выбор конкретного типа метаданных, после чего интерактивно переходит к открытию формы списка данного объекта.

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

Способ 1. Программный перехват события «НачалоВыбора»

Наиболее универсальный способ — перехватить стандартный процесс выбора в поле ввода и открыть форму списка нужного документа в явно заданном режиме выбора с передачей владельца формы.

Разберем алгоритм реализации данного метода:

  1. Для элемента формы (поля ввода) создаем обработчик события НачалоВыбора.
  2. В обработчике отменяем стандартные действия платформы с помощью установки СтандартнаяОбработка = Ложь;.
  3. Вызываем диалог выбора типа метаданных через ПоказатьВыборТипа или ПоказатьВводЗначения.
  4. После выбора пользователем типа документа программно вызываем метод ОткрытьФорму, куда передаем структуру параметров с флагом РежимВыбора = Истина и указом поля ввода в качестве владельца.

Рассмотрим пример кода модулей формы внешней обработки:


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

КонецПроцедуры

&НаКлиенте
Процедура ПослеВыбораТипаДокумента(ВыбранныйТип, ДополнительныеПараметры) Экспорт

    Если ВыбранныйТип = Неопределено Тогда
        Возврат;
    КонецЕсли;

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

КонецПроцедуры

Способ 2. Создание собственной универсальной формы выбора

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

Проанализируем порядок действий для реализации этого способа:

  1. Добавляем новую форму в состав внешней обработки (например, с именем ФормаВыбораДокумента).
  2. На форме размещаем выпадающий список или поле выбора для указания вида документа и динамический список (или таблицу формы) для вывода записей.
  3. При изменении выбранного вида документа программно формируем текст запроса для динамического списка, например:
    
    ДинамическийСписок.ТекстЗапроса = "ВЫБРАТЬ Ссылка, Дата, Номер ИЗ Документ." + ВыбранноеИмяВида;
    
  4. Обрабатываем событие ВыборЗначения или Выбор таблицы формы, вызывая метод ОповеститьОВыборе(ТекущиеДанные.Ссылка) или Закрыть(ТекущиеДанные.Ссылка).
  5. Из основной формы обработки вызываем созданную форму с помощью метода ОткрытьФормуМодально или ОткрытьФорму с обработкой оповещения о закрытии.

Ограничения и рекомендации по работе с управляемыми формами

При использовании описанных способов обратим внимание на следующие важные технические нюансы:

← На главную