Всем привет! У меня у регистра сведений есть есть несколько форм записи и в зависимости от условий нужно открывать свою разновидность формы записи. Так вот как переназначить форму записи в зависимости от условий? В обычном приложении достаточно было при открытии выставить Отказ = Истина и открыть нужную форму, а в управляемом режиме такая схема не работает - если взвести отказ, то форма которую открыли программно, тоже не открывается. Так же пробовал вместо отказа закрывать основную форму после открытия дополнительной - тоже не работает. Такое ощущение, что теперь если взвести отказ или закрыть окно при открытии формы, то вообще никакой код не выполняется. Сейчас делаю так:

```1c
    &НаКлиенте
    Процедура ПриОткрытии(Отказ)
    Если Условие = ИстинаТогда
    //Отказ = Истина;

    ПараметрыФормы = Новый Структура("Ключ", Запись.ИсходныйКлючЗаписи);
    ОткрытьФорму(
    "РегистрСведений.ИмяРегистра.Форма.ФормаЗаписи_Дополнительная",
    ПараметрыФормы,
    Неопределено
    );

    //Закрыть();
    Возврат;
    КонецЕсли;

    //Какой-то код...
    КонецПроцедуры
```

Открываются обе формы, если же раскомментировать Отказ = Истина или Закрыть(), то не открывается ни одна форма. Как правильно поступить?
---
попробуйте так

```1c
    Если Условие = Истина Тогда
    Отказ = Истина;

    ПараметрыФормы = Новый Структура("Ключ", Запись.ИсходныйКлючЗаписи);
    ОткрытьФорму("РегистрСведений.ИмяРегистра.Форма.ФормаЗаписи_Дополнительная",
    ПараметрыФормы,
    ВладелецФормы
    );

    //Закрыть();
    //Возврат;
    КонецЕсли;
```
---
Кому интересно, конечный вариант в модуле менеджера регистра выглядит примерно так:

```1c
    Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка)
    Если ВидФормы = "ФормаСписка" Тогда
    Если Условие = Истина Тогда
    ВыбраннаяФорма = "ФормаСписка_Доп";
    СтандартнаяОбработка = Ложь;
    КонецЕсли;
    ИначеЕсли ВидФормы = "ФормаЗаписи" Тогда
    Если Условие = Истина Тогда
    ВыбраннаяФорма = "ФормаЗаписи_Доп";
    СтандартнаяОбработка = Ложь;
    КонецЕсли;
    КонецЕсли;
    КонецПроцедуры
```
---
у меня в одном месте сделано так:

```1c
    Процедура ПриОткрытии(Отказ)
    ОткрытьФорму(ПараметрыОкна.ИмяФормы,
    ПараметрыОкна.Параметры,,
    ПараметрыОкна.Уникальность,
    ПараметрыОкна.Окно);
    Закрыть();
    КонецПроцедуры
```
PS ПараметрыОкна - это реквизит формы с типом "произвольный".
туда записывается заполненная структура в процедуре ПриСозданииНаСервере()
---
ПараметрыОкна Что за переменная ПараметрыОкна? Что там за значения?
---
Что за переменная ПараметрыОкна? Что там за значения?
вам зачем?

для вас важно только одно:

Отказ = Истина; в начале процедуры ПриОткрытии()
надо заменить на Закрыть(); в конце...

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

```1c
    &НаКлиенте
    Процедура ПриОткрытии(Отказ)
    //Какой-то код...
    Если Условие = ИстинаТогда
    //Отказ = Истина;

    ПараметрыФормы = Новый Структура("Ключ", Запись.ИсходныйКлючЗаписи);
    ОткрытьФорму(
    "РегистрСведений.ИмяРегистра.Форма.ФормаЗаписи_Дополнительная",
    ПараметрыФормы,
    Неопределено
    );

    //Закрыть();
    Возврат;
    КонецЕсли;
    КонецПроцедуры
```

Перенес проверку условия в конец процедуры, ничего не изменилось, ни одна форма не открылась. Поэтому и спрашиваю, что в параметрах, может что то с уникальностью подкрутить нужно.
---
а почему у меня открывается?

PS и вообще, у вас многое закомментировано,
если всё именно так как написано, то должны открываться обе формы, т.к. нет кода который закроет первую...
---
попробуйте так

```1c
    Если Условие = Истина Тогда
    Отказ = Истина;

    ПараметрыФормы = Новый Структура("Ключ", Запись.ИсходныйКлючЗаписи);
    ОткрытьФорму("РегистрСведений.ИмяРегистра.Форма.ФормаЗаписи_Дополнительная",
    ПараметрыФормы,
    ВладелецФормы
    );

    //Закрыть();
    //Возврат;
    КонецЕсли;
```
---
Да, спасибо, помогло! При взводе отказа и указании владельца формы открылась одна форма - дополнительная! Блин, и как я должен был догадаться? Как это вообще связано?
---
Какой режим открытия окна у формы ФормаЗаписи_Дополнительная?
---
Понятия не имею, просто в конфигураторе добавил еще одну форму записи, а программный код открытия вы видели - там не задается режим открытия. При создании формы записи, у самой формы режим открытия не менял, все по умолчанию.
---
Сейчас посмотрел - Блокировать окно владельца
---
дело в этом, вы открываете окно с владельцем Неопределено, поэтому не сработало изначально

Тут, либо указать владельца, либо изменить режим
---
Понятно, спасибо большое за объяснение!
---
При взводе отказа и указании владельца формы открылась одна форма - дополнительная! Блин, и как я должен был догадаться? Как это вообще связано?
скорее всего, в 1С заложено, что при закрытии окна закрываются все дочерние.

а так как вы не указали родителя, то родителем стало текущее окно.
---
Да, скорее всего так, теперь начинает доходить, как это связано. Больное спасибо!
---
кстати, проверил работоспособность у себя на окне ФормаЗаписи

получил эффект, что теперь невозможно открыть Запись с использованием ссылки вида
e1cib/data/РегистрСведений.ИмяРегистра?Объект=1234567890&Параметр=9876543210
---
аются обе фо
А чем не нравится ОбработкаПолученияФормы в модуле менеджера?
---
Так не знал о таком способе. Ща попробую. Спасибо, походу это идеальный вариант...
---
Там нет проверки условия по ссылке или по ключу регистра. Если только он явно не указан в параметрах формы.
Причем срабатывает этот обработчик только при автоматическом открытии форм из динамических списков.
---
срабатывает этот обработчик только при автоматическом открытии форм из динамических списков
Спасибо за уточнение. Попробовал программно открыть форму через конструкцию
```1c
    ОткрытьФорму("РегистрСведений.ИмяРегистра.ФормаСписка");
```

Все отработало как надо, обработчик в модуле менеджера сработал, а вот если вызвать с точным указанием формы

```1c
    ОткрытьФорму("РегистрСведений.ИмяРегистра.Форма.ФормаСписка");
```

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

```1c
    Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка)
    Если ВидФормы = "ФормаСписка" Тогда
    Если Условие = Истина Тогда
    ВыбраннаяФорма = "ФормаСписка_Доп";
    СтандартнаяОбработка = Ложь;
    КонецЕсли;
    ИначеЕсли ВидФормы = "ФормаЗаписи" Тогда
    Если Условие = Истина Тогда
    ВыбраннаяФорма = "ФормаЗаписи_Доп";
    СтандартнаяОбработка = Ложь;
    КонецЕсли;
    КонецЕсли;
    КонецПроцедуры
```
---
"наглухо" меняется форма по-умолчанию в разделе Формы, верхние поля:
---
:)))) Да, это понятно, но вдруг через настройку без доработки конфы понадобиться
---
Посмотрите у формы РежимОткрытияОкна, я так думаю, что стоит блокировать окно владельца
---
Да, все верно. Наверное поэтому закрывать нельзя, и отказ видимо каким-то хитрым образом на это завязан.
---
Думаю вопрос полностью и счерпан. Оба способа мне очень пригодились. Получил бесценные знания. Всем большое спасибо!