Переназначить форму записи РС

1. frkbvfnjh 787 06.10.21 09:05 Сейчас в теме
Всем привет! У меня у регистра сведений есть есть несколько форм записи и в зависимости от условий нужно открывать свою разновидность формы записи. Так вот как переназначить форму записи в зависимости от условий? В обычном приложении достаточно было при открытии выставить Отказ = Истина и открыть нужную форму, а в управляемом режиме такая схема не работает - если взвести отказ, то форма которую открыли программно, тоже не открывается. Так же пробовал вместо отказа закрывать основную форму после открытия дополнительной - тоже не работает. Такое ощущение, что теперь если взвести отказ или закрыть окно при открытии формы, то вообще никакой код не выполняется. Сейчас делаю так:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
	Если Условие = ИстинаТогда
		//Отказ = Истина;
		
		ПараметрыФормы = Новый Структура("Ключ", Запись.ИсходныйКлючЗаписи);
		ОткрытьФорму(
			"РегистрСведений.ИмяРегистра.Форма.ФормаЗаписи_Дополнительная",
			ПараметрыФормы,
			Неопределено
		);
		
		//Закрыть();
		Возврат;
	КонецЕсли;
	
	//Какой-то код...
КонецПроцедуры
Показать


Открываются обе формы, если же раскомментировать Отказ = Истина или Закрыть(), то не открывается ни одна форма. Как правильно поступить?
По теме из базы знаний
Найденные решения
6. DBV 06.10.21 09:44 Сейчас в теме
(1) попробуйте так

Если Условие = Истина Тогда
	Отказ = Истина;
	
	ПараметрыФормы = Новый Структура("Ключ", Запись.ИсходныйКлючЗаписи);
	ОткрытьФорму("РегистрСведений.ИмяРегистра.Форма.ФормаЗаписи_Дополнительная",
		ПараметрыФормы,
		ВладелецФормы
	);
	
	//Закрыть();
	//Возврат;
КонецЕсли;
Показать
frkbvfnjh; +1 Ответить
24. frkbvfnjh 787 06.10.21 11:53 Сейчас в теме
(23) Кому интересно, конечный вариант в модуле менеджера регистра выглядит примерно так:
Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка)
	Если ВидФормы = "ФормаСписка" Тогда
		Если Условие = Истина Тогда 
            ВыбраннаяФорма = "ФормаСписка_Доп";
            СтандартнаяОбработка = Ложь;
		КонецЕсли;
	ИначеЕсли ВидФормы = "ФормаЗаписи" Тогда
		Если Условие = Истина Тогда 
            ВыбраннаяФорма = "ФормаЗаписи_Доп";
            СтандартнаяОбработка = Ложь;
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры
Показать
Drivingblind; +1 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. -AI- 06.10.21 09:16 Сейчас в теме
(1) у меня в одном месте сделано так:
Процедура ПриОткрытии(Отказ)
	ОткрытьФорму(ПараметрыОкна.ИмяФормы,
				 ПараметрыОкна.Параметры,,
				 ПараметрыОкна.Уникальность,
				 ПараметрыОкна.Окно);
	Закрыть();
КонецПроцедуры
PS ПараметрыОкна - это реквизит формы с типом "произвольный".
туда записывается заполненная структура в процедуре ПриСозданииНаСервере()
3. frkbvfnjh 787 06.10.21 09:29 Сейчас в теме
(2)
ПараметрыОкна
Что за переменная ПараметрыОкна? Что там за значения?
4. -AI- 06.10.21 09:34 Сейчас в теме
(3)
Что за переменная ПараметрыОкна? Что там за значения?

вам зачем?

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

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

PS если всё же хотите знать, то ПараметрыОкна - реквизит формы который заполняется в обработчике ПриСозданииНаСервере()
это сделано что бы не делать ещё одного серверного вызова в обработчике ПриОткрытии(),
а при запуске ПриОткрытии(), уже все данные известны, осталось только открыть нужную форму.
5. frkbvfnjh 787 06.10.21 09:43 Сейчас в теме
(4) Почитай, что я написал в самом начале - я так делал, эффект одинаковый. Вот текущий вариант:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
//Какой-то код...
    Если Условие = ИстинаТогда
        //Отказ = Истина;
        
        ПараметрыФормы = Новый Структура("Ключ", Запись.ИсходныйКлючЗаписи);
        ОткрытьФорму(
            "РегистрСведений.ИмяРегистра.Форма.ФормаЗаписи_Дополнительная",
            ПараметрыФормы,
            Неопределено
        );
        
        //Закрыть();
        Возврат;
    КонецЕсли;
КонецПроцедуры
Показать


Перенес проверку условия в конец процедуры, ничего не изменилось, ни одна форма не открылась. Поэтому и спрашиваю, что в параметрах, может что то с уникальностью подкрутить нужно.
7. -AI- 06.10.21 09:46 Сейчас в теме
(5) а почему у меня открывается?

PS и вообще, у вас многое закомментировано,
если всё именно так как написано, то должны открываться обе формы, т.к. нет кода который закроет первую...
6. DBV 06.10.21 09:44 Сейчас в теме
(1) попробуйте так

Если Условие = Истина Тогда
	Отказ = Истина;
	
	ПараметрыФормы = Новый Структура("Ключ", Запись.ИсходныйКлючЗаписи);
	ОткрытьФорму("РегистрСведений.ИмяРегистра.Форма.ФормаЗаписи_Дополнительная",
		ПараметрыФормы,
		ВладелецФормы
	);
	
	//Закрыть();
	//Возврат;
КонецЕсли;
Показать
frkbvfnjh; +1 Ответить
8. frkbvfnjh 787 06.10.21 09:51 Сейчас в теме
(6) Да, спасибо, помогло! При взводе отказа и указании владельца формы открылась одна форма - дополнительная! Блин, и как я должен был догадаться? Как это вообще связано?
9. DBV 06.10.21 09:58 Сейчас в теме
(8) Какой режим открытия окна у формы ФормаЗаписи_Дополнительная?
10. frkbvfnjh 787 06.10.21 10:01 Сейчас в теме
(9) Понятия не имею, просто в конфигураторе добавил еще одну форму записи, а программный код открытия вы видели - там не задается режим открытия. При создании формы записи, у самой формы режим открытия не менял, все по умолчанию.
12. frkbvfnjh 787 06.10.21 10:04 Сейчас в теме
(9) Сейчас посмотрел - Блокировать окно владельца
13. DBV 06.10.21 10:06 Сейчас в теме
(12) дело в этом, вы открываете окно с владельцем Неопределено, поэтому не сработало изначально

Тут, либо указать владельца, либо изменить режим
frkbvfnjh; +1 Ответить
15. frkbvfnjh 787 06.10.21 10:08 Сейчас в теме
(13) Понятно, спасибо большое за объяснение!
16. -AI- 06.10.21 10:10 Сейчас в теме
(8)
При взводе отказа и указании владельца формы открылась одна форма - дополнительная! Блин, и как я должен был догадаться? Как это вообще связано?

скорее всего, в 1С заложено, что при закрытии окна закрываются все дочерние.

а так как вы не указали родителя, то родителем стало текущее окно.
17. frkbvfnjh 787 06.10.21 10:14 Сейчас в теме
(16) Да, скорее всего так, теперь начинает доходить, как это связано. Больное спасибо!
18. -AI- 06.10.21 10:28 Сейчас в теме
(17) кстати, проверил работоспособность у себя на окне ФормаЗаписи

получил эффект, что теперь невозможно открыть Запись с использованием ссылки вида
e1cib/data/РегистрСведений.ИмяРегистра?Объект=1234567890&Параметр=9876543210
19. markw 06.10.21 10:52 Сейчас в теме
(1)
аются обе фо

А чем не нравится ОбработкаПолученияФормы в модуле менеджера?
frkbvfnjh; +1 Ответить
20. frkbvfnjh 787 06.10.21 11:21 Сейчас в теме
(19) Так не знал о таком способе. Ща попробую. Спасибо, походу это идеальный вариант...
21. FatPanzer 06.10.21 11:31 Сейчас в теме
(19) Там нет проверки условия по ссылке или по ключу регистра. Если только он явно не указан в параметрах формы.
Причем срабатывает этот обработчик только при автоматическом открытии форм из динамических списков.
22. frkbvfnjh 787 06.10.21 11:44 Сейчас в теме
(21)
срабатывает этот обработчик только при автоматическом открытии форм из динамических списков

Спасибо за уточнение. Попробовал программно открыть форму через конструкцию
ОткрытьФорму("РегистрСведений.ИмяРегистра.ФормаСписка");

Все отработало как надо, обработчик в модуле менеджера сработал, а вот если вызвать с точным указанием формы
ОткрытьФорму("РегистрСведений.ИмяРегистра.Форма.ФормаСписка");

то обработчик не срабатывает и форма не переназначается, но мне кажется так даже правильнее, ведь если в явном виде указывают какая форма требуется, то она и должна открыться.
23. frkbvfnjh 787 06.10.21 11:49 Сейчас в теме
(19) Спасибо, все работает. Остановлюсь на Вашем варианте, т.к. в моём случае - это идеальное решение. Способ переназначения при открытии очень пригодится, но это все таки более радикальный способ, на случай если нужно "наглухо" переназначить форму.
24. frkbvfnjh 787 06.10.21 11:53 Сейчас в теме
(23) Кому интересно, конечный вариант в модуле менеджера регистра выглядит примерно так:
Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка)
	Если ВидФормы = "ФормаСписка" Тогда
		Если Условие = Истина Тогда 
            ВыбраннаяФорма = "ФормаСписка_Доп";
            СтандартнаяОбработка = Ложь;
		КонецЕсли;
	ИначеЕсли ВидФормы = "ФормаЗаписи" Тогда
		Если Условие = Истина Тогда 
            ВыбраннаяФорма = "ФормаЗаписи_Доп";
            СтандартнаяОбработка = Ложь;
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры
Показать
Drivingblind; +1 Ответить
26. -AI- 07.10.21 11:29 Сейчас в теме
(23) "наглухо" меняется форма по-умолчанию в разделе Формы, верхние поля:
Прикрепленные файлы:
27. frkbvfnjh 787 07.10.21 11:30 Сейчас в теме
(26) :)))) Да, это понятно, но вдруг через настройку без доработки конфы понадобиться
11. DBV 06.10.21 10:04 Сейчас в теме
Посмотрите у формы РежимОткрытияОкна, я так думаю, что стоит блокировать окно владельца
14. frkbvfnjh 787 06.10.21 10:07 Сейчас в теме
(11) Да, все верно. Наверное поэтому закрывать нельзя, и отказ видимо каким-то хитрым образом на это завязан.
25. frkbvfnjh 787 06.10.21 12:44 Сейчас в теме
Думаю вопрос полностью и счерпан. Оба способа мне очень пригодились. Получил бесценные знания. Всем большое спасибо!
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот