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