Как программно открыть журнал документов для выбора значения в реквизит?

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

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

Разберем причину поведения системы

Основная причина того, что документ не «садится» в реквизит, кроется в режиме открытия формы. ФормаСписка журнала по умолчанию настроена на отображение данных. Чтобы платформа поняла, что вы хотите получить от пользователя выбор, необходимо явно указать РежимВыбора. В противном случае, даже если вы передали владельца в параметры, система может не активировать механизм возврата значения.

Способ №1: Использование параметров открытия

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

Рассмотрим пример кода для такой реализации:


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

&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
    // Здесь мы обрабатываем полученный документ
    Сообщить("Выбран документ: " + ВыбранноеЗначение);
КонецПроцедуры

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

Способ №2: Использование ОписанияОповещения

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

Рассмотрим, как это реализовать на практике:


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

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

Важные рекомендации для корректной работы

Чтобы ваш код работал надежно, обратите внимание на следующие ключевые моменты:

  1. Владелец формы: Всегда передавайте в качестве владельца формы тот элемент управления (Элемент), который инициирует выбор. Это связывает контекст формы и позволяет платформе корректно возвращать значения.
  2. Тип формы: Если у вас в конфигураторе создана специальная ФормаВыбора для журнала, лучше открывать именно её, а не ФормаСписка. Она изначально оптимизирована для выбора и возврата данных.
  3. Параметры отбора: При использовании динамических списков не забывайте, что отборы через ПараметрыОтбора должны соответствовать полям, добавленным в схему компоновки данных динамического списка журнала.
  4. Режим открытия: Использование РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс в методе ОткрытьФорму делает интерфейс более предсказуемым для пользователя при выборе значения из модального окна.

Анализируя предложенные решения, мы видим, что использование ОписаниеОповещения является наиболее гибким и современным подходом. Оно позволяет избежать «завязки» на стандартные обработчики и делает код более читаемым и легким в поддержке. Не бойтесь экспериментировать с параметрами и выбирать тот способ, который лучше подходит под архитектуру вашей конкретной задачи!

← На главную