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