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

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

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

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

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

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

Что такое параметр формы и чем ключевой отличается от обычного

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

У каждого параметра есть два важных свойства: «Ключевой» и «Значение заполняется по умолчанию» (для стандартных параметров). Флаг «Ключевой» меняет поведение платформы тремя способами. Во-первых, значение ключевого параметра включается в ключ уникальности формы. Во-вторых, он попадает в навигационную ссылку формы, поэтому форму можно «закладкой» открыть в том же состоянии. В-третьих, ключевые параметры учитываются при автосохранении и восстановлении настроек формы.

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

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

Настройка выполняется в редакторе формы и занимает меньше минуты. Откройте нужную форму объекта или общую форму, перейдите на закладку «Параметры» в правой части редактора (рядом с закладками «Реквизиты», «Команды», «Командный интерфейс»). Если параметра ещё нет, добавьте его кнопкой «Добавить», укажите имя и тип.

Затем выделите параметр и откройте палитру свойств (правый клик — «Свойства» или Alt+Enter). Установите флажок «Ключевой». После этого сохраните конфигурацию. Обратите внимание: тип параметра должен быть сериализуемым — примитивные типы, ссылки, перечисления подходят; сложные объекты вроде таблиц значений в ключевые параметры ставить нельзя, потому что их значение должно представляться строкой в навигационной ссылке.

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

Как передать ключевой параметр из кода

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

ПараметрыФормы = Новый Структура;

ПараметрыФормы.Вставить("Организация", ТекущаяОрганизация);

ПараметрыФормы.Вставить("Период", НачалоМесяца(ТекущаяДатаСеанса()));

ОткрытьФорму("Обработка.СверкаОстатков.Форма.ФормаСверки", ПараметрыФормы);

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

bsl
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	Если Параметры.Свойство("Организация") Тогда
		ОрганизацияОтбор = Параметры.Организация;
	КонецЕсли;
КонецПроцедуры

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

При вызове ОткрытьФорму() платформа строит ключ уникальности из имени формы и значений всех ключевых параметров. Если форма с таким ключом уже открыта, новое окно не создаётся — активируется существующее. Это удобно для обработок и отчётов: пользователь, дважды нажавший кнопку «Сверка по складу Х», получит одну и ту же форму, а не два одинаковых окна.

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

Сравнение вариантов

Ключевой параметр без ключа уникальности

Повторный вызов с теми же значениями активирует открытую форму. Подходит для обработок-«одиночек», но новые неключевые параметры при повторном вызове теряются.

Параметр КлючУникальности при открытии

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

Неключевой параметр

Не влияет на уникальность и навигационную ссылку. Подходит для вспомогательных настроек, которые не идентифицируют состояние формы.

Стандартный ключевой параметр «Ключ» у форм объектов

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

Для формы записи регистра сведений в роли ключа выступает ключ записи — значение типа РегистрСведенийКлючЗаписи. При разработке расширений и переопределении открытия форм важно не переименовывать и не удалять стандартный параметр Ключ: механизмы платформы (навигационные ссылки, «Перейти по ссылке», история работы) опираются именно на него.

Типичные ошибки при работе с ключевыми параметрами

Самая распространённая ошибка — ожидание, что при повторном вызове ОткрытьФорму() с теми же ключевыми параметрами форма обновится новыми данными. На деле платформа просто активирует старую форму, а обработчики создания не выполняются. Если нужно обновить содержимое, передавайте данные через оповещения (Оповестить / обработчик ОбработкаОповещения) или открывайте форму с новым ключом уникальности.

Вторая группа ошибок связана с типами. Попытка сделать ключевым параметр типа «ТаблицаЗначений», «Массив» или «ДанныеФормы» приведёт к ошибке при формировании навигационной ссылки или сохранении настроек, потому что ключевые значения должны иметь строковое представление. Также нельзя менять набор ключевых параметров формы «на лету» — состав фиксируется в конфигураторе.

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

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

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

Дополнительная проверка — навигационная ссылка. В открытой форме выполните команду «Получить ссылку» (или аналог через меню): в строке ссылки должны присутствовать значения ключевых параметров. Если параметра в ссылке нет, платформа не считает его ключевым.

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

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

Повторное открытие с теми же значениями
Норма

Активируется уже открытая форма

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

Открывается второе окно — флаг «Ключевой» не установлен или имя параметра не совпадает

Открытие с другим значением параметра
Норма

Создаётся новая форма

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

Активируется старая форма — значение не попадает в ключ

Навигационная ссылка формы
Норма

Значение параметра присутствует в ссылке

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

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

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

Часто задаваемые вопросы

Можно ли сделать ключевым параметр типа «Массив» или «ТаблицаЗначений»?

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

Почему при повторном ОткрытьФорму форма не обновляется новыми параметрами?

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

Где в модуле формы правильно читать переданные параметры?

В обработчике ПриСозданииНаСервере через коллекцию Параметры. На клиенте в ПриОткрытии часть параметров может быть уже недоступна. Сохраните нужные значения в реквизиты формы при создании и дальше работайте с реквизитами.

Чем ключевой параметр отличается от параметра КлючУникальности в ОткрытьФорму?

Ключевой параметр объявляется в конфигураторе и входит в состав ключа формы наряду с её именем. КлючУникальности — это отдельный аргумент метода ОткрытьФорму, который переопределяет ключ целиком: с ним форма откроется заново независимо от значений ключевых параметров.

Нужно ли вручную добавлять параметр «Ключ» для формы элемента справочника?

Нет. Платформа создаёт стандартный ключевой параметр Ключ автоматически для всех объектных форм. В него передаётся ссылка на объект, и именно он обеспечивает уникальность карточки элемента и её навигационную ссылку.

Влияет ли признак «Ключевой» на сохранение настроек формы?

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

Итог

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

Ключевой параметр формы включается флажком «Ключевой» в свойствах параметра и определяет уникальность формы: одинаковые значения — одна форма, разные — отдельные окна. Используйте сериализуемые типы, читайте параметры в ПриСозданииНаСервере, а для принудительно новой копии формы применяйте КлючУникальности.