К статье
Практический материал

Разработка и Конфигурация · 10 мин

Ключ уникальности формы в 1С: что это и как правильно использовать

Что такое ключ уникальности формы в 1С, как он работает с методом ПолучитьФорму, когда нужен и как избежать ошибок при открытии форм.

Ключ уникальности формы — это параметр, который платформа 1С использует, чтобы отличать один экземпляр формы от другого. Без него система решает вопрос «уже открыта такая форма или нет» только по объекту данных: например, форма элемента справочника уникальна по ссылке на элемент, форма документа — по ссылке на документ. Но бывают ситуации, когда одного и того же объекта недостаточно: нужно открыть две разные формы одного элемента или, наоборот, гарантировать, что форма откроется только один раз.

Ключ уникальности передаётся в метод ПолучитьФорму() третьим параметром и в ОткрытьФорму() через структуру параметров. Значением ключа может быть строка, число, ссылка, уникальный идентификатор и другие сериализуемые типы. Платформа сравнивает ключи строго: если ключи различаются, это разные формы, даже если они построены по одному объекту.

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

Как платформа определяет уникальность формы

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

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

Важно понимать: сравнение идёт в рамках одного клиентского сеанса. Два пользователя, открывшие форму с одним ключом, никак друг на друга не влияют — у каждого свой экземпляр.

Где используется ключ уникальности

Основные точки применения — методы глобального контекста и параметры форм. При вызове ПолучитьФорму("Справочник.Номенклатура.Форма.ФормаЭлемента", Параметры, КлючУникальности) третий параметр и есть ключ. В ОткрытьФорму() ключ передаётся через параметр КлючУникальности либо добавляется в структуру параметров формы.

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

bsl
УникальныйКлюч = Новый УникальныйИдентификатор;
ПараметрыФормы = Новый Структура("Ключ", СсылкаНаЭлемент);
ОткрытьФорму("Справочник.Номенклатура.Форма.ФормаЭлемента", ПараметрыФормы, , УникальныйКлюч);
// Каждый вызов создаст новое окно, т.к. ключ каждый раз новый

Типичные сценарии применения

Открытие нескольких форм одного объекта

Задача: пользователь должен видеть карточку одного товара в двух окнах — например, для сравнения данных до и после изменений. По умолчанию второй вызов просто активирует уже открытую форму. Решение — передавать каждый раз новый УникальныйИдентификатор в качестве ключа.

Гарантированное единственное открытие общей формы

Обратная задача: общая форма (например, панель настроек обработки) не должна открываться дважды. Поскольку у неё нет объекта-владельца, платформа по умолчанию позволяет создавать сколько угодно экземпляров. Фиксированный строковый ключ, например "ПанельНастроек", заставит повторный вызов активировать уже открытое окно.

Разделение форм выбора с разными отборами

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

Маршрут решения

Как выбрать ключ

Нужно, чтобы форма открылась ровно один разИспользуйте фиксированный строковый ключ, одинаковый при каждом вызове
Нужно открывать новое окно при каждом вызовеГенерируйте новый УникальныйИдентификатор при каждом открытии
Форма привязана к объекту и поведение по умолчанию устраиваетКлюч не передавайте — платформа использует ссылку объекта
Нужны разные экземпляры для разных контекстовФормируйте ключ из имени контекста, например "ВыборДля_" + ИмяПоля

Как проверить, что ключ работает правильно

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

В отладчике поведение видно по стеку вызовов: при совпадении ключа обработчики ПриСозданииНаСервере и ПриОткрытии не выполняются повторно — это надёжный признак того, что форма не пересоздавалась, а была активирована существующая.

Контрольные точки

Как проверить результат

Повторный вызов с тем же ключом
Норма

Существующее окно активируется, новое не создаётся

Тревожный признак

Открывается второе окно — ключ не передаётся или теряется

Вызов с новым УникальныйИдентификатор
Норма

Каждый раз открывается новое окно

Тревожный признак

Окно активируется старое — ключ не применяется

Срабатывание ПриСозданииНаСервере
Норма

Выполняется только при реальном создании формы

Тревожный признак

Выполняется при каждом вызове при фиксированном ключе

Типичные ошибки и ограничения

Самая частая ошибка — передача в ключ несериализуемого или нестабильного значения. Например, если в качестве ключа использовать структуру или значение, которое при каждом вызове формируется по-разному, платформа будет считать формы разными, и окна начнут плодиться. Ключ должен быть простым и детерминированным там, где нужна уникальность, и гарантированно новым там, где нужна множественность.

Вторая ошибка — ожидание, что ключ уникальности блокирует форму на уровне базы данных. Это не так: механизм работает только внутри клиентского сеанса и никак не защищает объект от одновременного редактирования другим пользователем. Для защиты данных используются объектные блокировки.

Типичные ошибки
01
Передача нового УникальныйИдентификатор при каждом вызове там, где нужна одна форма — окна множатся и расходуют память клиента
02
Использование фиксированного ключа для форм редактирования разных объектов — вторая карточка не откроется, активируется первая
03
Ожидание, что ключ блокирует объект от других пользователей — ключ работает только в рамках сеанса
04
Передача сложных несериализуемых значений в качестве ключа — непредсказуемое поведение сравнения

Ограничение механизма: ключ уникальности не сохраняется между сеансами и не влияет на поведение формы после перезапуска клиента. Также при работе в управляемом приложении блокирующие окна имеют собственную логику владельца, и ключ уникальности взаимодействует с ней — форма, открытая с владельцем, закрывается вместе с ним независимо от ключа.

Альтернативы ключу уникальности

Не всегда задачу нужно решать именно ключом. Если требуется предотвратить повторное открытие окна, можно хранить ссылку на открытую форму в переменной модуля и проверять её перед вызовом — но это хрупче, чем механизм платформы. Если нужно различать экземпляры по контексту, иногда достаточно разных имён форм или параметра РежимОткрытияОкна.

Сравнение подходов

Ключ уникальности

Штатный механизм платформы, работает с ПолучитьФорму и ОткрытьФорму. Подходит почти всегда

Хранение формы в переменной

Ручной контроль через переменную модуля. Гибко, но требует обработки закрытия формы и легко ломается

Разные имена форм

Создание отдельных форм в конфигураторе под разные сценарии. Надёжно, но увеличивает объём конфигурации

Практические рекомендации

Выбирайте тип ключа осознанно: строка — для фиксированных семантических ключей, УникальныйИдентификатор — для гарантированно новых экземпляров, ссылка — когда ключ должен совпадать с логикой объекта. Документируйте в комментариях, почему выбран именно такой ключ, — это частое место ошибок при доработках.

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

Итог

Что важно запомнить

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

Частые вопросы

Что произойдёт, если не передавать ключ уникальности?

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

Можно ли использовать в качестве ключа строку с русскими буквами?

Да, тип строки не ограничен латиницей. Важно только, чтобы значение было стабильным между вызовами: одинаковая строка должна означать одну и ту же форму.

Влияет ли ключ уникальности на других пользователей?

Нет. Ключ сравнивается только среди форм текущего клиентского сеанса. Другие пользователи открывают свои экземпляры независимо, а защиту данных от конкурентного редактирования обеспечивают объектные блокировки СУБД и механизм версионирования.

Почему форма с фиксированным ключом всё равно открывается второй раз?

Частые причины: ключ передаётся не в тот параметр, в одном из вызовов он формируется иначе (например, с лишним пробелом или другим регистром), либо формы открываются с разными именами. Проверьте оба места вызова в отладчике.

Нужен ли ключ уникальности для ОткрытьФормуМодально?

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

Как открыть форму записи регистра сведений с ключом?

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