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