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