Как сохранить данные и открыть уже существующую форму при повторном нажатии на кнопку в 1С

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

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

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

Выясним причину проблемы

Рассмотрим, почему платформа 1С по умолчанию открывает пустую форму. Когда мы вызываем метод ОткрытьФорму() и передаем в него только параметры отбора или пустую структуру, платформа расценивает этот вызов как команду на создание абсолютно нового незаписанного объекта.

Для того чтобы открылась форма конкретного, уже сохраненного элемента, платформе необходимо явно сообщить ссылка на какой именно объект должна быть открыта. Это делается путем передачи параметра Ключ в структуру параметров формы.

Способ 1. Передача параметра «Ключ» и использование ОписанияОповещения

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

Разберем реализацию этого механизма по шагам.

Шаг 1. Настройка первой (родительской) формы

В первой форме создадим реквизит для хранения ссылки на объект (например, СсылкаНаСправочник) и пропишем код открытия второй формы:


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

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

Шаг 2. Настройка вызова и закрытия во второй форме

Во второй форме при сохранении элемента возвращаем ссылку на записанный объект в качестве параметра закрытия формы:


&НаКлиенте
Процедура СохранитьИЗакрыть(Команда)
    Если Записать() Тогда
        Закрыть(Объект.Ссылка);
    КонецЕсли;
КонецПроцедуры

Теперь при первом нажатии откроется пустая форма нового элемента. После записи и закрытия ссылка сохранится в реквизит СсылкаНаСправочник. При всех последующих нажатиях передаваемый параметр Ключ заставит платформу загружать именно созданный ранее элемент.

Способ 2. Использование параметра «Уникальность» функции ОткрытьФорму

Если требуется, чтобы окно не создавалось заново, если оно уже открыто пользователем, полезно применять четвертый параметр метода ОткрытьФорму — ключ уникальности.

В качестве ключа уникальности можно передавать ссылку на объект или сгенерированный УникальныйИдентификатор. Если окно с таким ключом уже существует в платформе (даже если оно свернуто), повторный вызов ОткрытьФорму() не будет создавать новый экземпляр, а активизирует уже открытое окно с сохраненным состоянием данных.

Способ 3. Использование механизма подчиненности (параметр «Владелец»)

Если открываемый справочник является подчиненным по отношению к основному справочнику, правильным решением будет передача владельца при открытии формы:


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

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

Способ 4. Передача несохраненных данных через Временное хранилище

Рассмотрим случай, когда данные во второй форме не должны записываться в базу данных сразу (например, если пользователю нужна возможность отменить изменения или сам основной объект еще не сохранен).

  1. На сервере вызывается метод ПоместитьВоВременноеХранилище(), куда помещается структура или таблица с введенными данными.
  2. Адрес временного хранилища передается в параметрах открываемой формы.
  3. Вторая форма при событии ПриСозданииНаСервере считывает данные из хранилища по переданному адресу.
  4. При закрытии вторая форма обновляет данные во временном хранилище и возвращает его адрес в родительскую форму через ОписаниеОповещения.

Способ 5. Автоматическое сохранение данных формы в настройках

Если открываемая форма является произвольной (не формой объекта справочника) и данные не требуют записи в таблицы БД, можно воспользоваться встроенным механизмом платформы:

  1. Откроем нужную форму в Конфигураторе.
  2. В палитре свойств формы найдем свойство АвтоматическоеСохранениеДанныхВНастройках и установим его значение в Использовать.
  3. На вкладке «Реквизиты» отметим флажками нужные реквизиты в колонке «Сохранение».

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

Резюме и практические рекомендации

Подытожим основные правила работы с параметрами форм при вызове метода ОткрытьФорму:

  1. Для открытия существующего объекта базы данных всегда передавайте в структуру параметров ключ Ключ со ссылкой на элемент.
  2. Используйте ОписаниеОповещения для получения ссылки на только что созданный элемент из закрываемой формы.
  3. Помните, что произвольные параметры, переданные при открытии формы, доступны в коллекции Параметры только во время выполнения события ПриСозданииНаСервере. Если эти данные понадобятся позже, сохраните их в реквизитах формы.
← На главную