Как программно открыть форму объекта из динамического списка с передачей данных

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

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

Разбор основной проблемы: почему форма открывается пустой?

Рассмотрим ситуацию: у нас есть динамический список (например, список запросов). Мы хотим по нажатию кнопки или по двойному клику открыть специальную форму обработки этого запроса. Если просто вызвать ОткрытьФорму("Справочник.ТекущиеЗапросы.Форма.ФормаЭлемента"), платформа создаст новый экземпляр формы. Поскольку мы не указали, какой именно элемент справочника нам нужен, система решит, что мы хотим создать новый объект. В процедуре ПриСозданииНаСервере реквизит Объект будет содержать пустые значения, так как ссылка не была передана.

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

Использование параметра «Ключ» для инициализации объекта

Параметр Ключ — это системный «мостик» между списком и формой объекта. Когда вы передаете в этот параметр ссылку (тип СправочникСсылка, ДокументСсылка и т.д.), платформа выполняет целый ряд автоматических действий:

  1. Обращается к базе данных по указанной ссылке.
  2. Считывает все данные объекта (реквизиты, табличные части).
  3. Заполняет основной реквизит открываемой формы (тот, который в редакторе формы выделен жирным шрифтом, обычно это Объект с типом СправочникОбъект).

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

Посмотрим на пример правильной подготовки параметров и вызова формы:


// Определим ссылку на объект, который хотим открыть
// В данном примере берем её из текущей строки списка
СсылкаНаОбъект = Элементы.Список.ТекущаяСтрока;

// Формируем структуру параметров
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Ключ", СсылкаНаОбъект);

// Открываем форму
ОткрытьФорму("Справочник.ТекущиеЗапросы.Форма.ФормаОбработкиЗапроса", ПараметрыФормы, ЭтаФорма);

Как получить текущую строку из динамического списка?

Выясним, как правильно извлекать данные из динамического списка для передачи в параметры. Существует два основных способа в зависимости от контекста вызова.

Способ 1: В событии «Выбор»

Если вы переопределяете стандартное действие при двойном клике или нажатии Enter на строке списка, используйте обработчик события Выбор. В этом событии параметр ВыбраннаяСтрока уже содержит ссылку на объект (или ключ записи для регистров).


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

Способ 2: Нажатие произвольной кнопки

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

Тонкости работы с типами данных в списках

Рассмотрим ситуацию, когда в динамическом списке включена группировка (например, по иерархии или по какому-то полю). В этом случае ТекущаяСтрока может вернуть не ссылку на объект, а специальный идентификатор строки группировки. Если передать такой идентификатор в параметр Ключ, система выдаст ошибку или откроет пустую форму.

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


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

Передача произвольных параметров и «ЗначенияЗаполнения»

Иногда задача стоит шире: нужно не просто открыть существующий объект, а создать новый, предварительно заполнив его данными из текущей строки списка. В этом случае параметр Ключ использовать нельзя (так как объекта еще нет в базе).

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


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

Особенности работы с владельцами объектов

Если вы открываете форму элемента подчиненного справочника, крайне важно передать владельца. Платформа 1С использует для этого зарезервированный параметр Владелец. Если этого не сделать, при создании нового элемента поле «Владелец» останется пустым, что может нарушить логику учета.

Пример открытия с указанием владельца:


ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Ключ", СсылкаНаЭлемент);
ПараметрыФормы.Вставить("Владелец", СсылкаНаКонтрагента); // Указываем владельца

ОткрытьФорму("Справочник.КонтактныеЛица.Форма.ФормаЭлемента", ПараметрыФормы);

Резюме и рекомендации

Мы проанализировали основные способы программного взаимодействия между динамическим списком и формой объекта. Подведем итоги:

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

← На главную