Имя: Пароль:
1C
1С v8
Как открывать нужную форму выбора для составного реквизита УФ
0 ChAlex
 
06.09.12
19:31
Задача: на УФ есть реквизит составного типа (допустим справочник "Товары" и справочник "Услуги"). Нужно при выборе реквизита открывать не форму выбора соответствующего справочника, а некую иную. Как такое организовать? Или это невозможно?

Трабл при этом возникающий: выбрать нужную форму можно было бы в событии "ПриНачалеВыбора" - но тут засада в том, что тип справочника еще не определен. Полазив с отладчиком - вырисовывается такая схема вызова событий при попытке выбора:

1. Вызывается событие "ПриНачалеВыбора" -  тут тип еще не определен и соответственно что-либо определять безсмысленно.
2. Выводится окно выбора типа реквизита.
3. После выбора типа реквизита вызывается событие "ПриИзменении"
и на этом все.

Вот и вопрос: в какой точке можно переопределить какую форму открывать?
1 Feanorko
 
06.09.12
19:40
>Вот и вопрос: в какой точке можно переопределить какую форму открывать?

СтандартнаяОбработка = Ложь и впегед
2 ChAlex
 
06.09.12
19:44
(1) - Куда вперед? А самое главное когда? Что СтандартнаяОбработка = Ложь - и ежу понятно. Прочитайте внимательно пост выше: в момент когда вызывается событие ПриНачалеВыбора - еще не известно форму какого справочника открыть! Да елси даже в этот момент и определить: - то откроется 2 формы: - первая та , что переопределена в событии, а вторая - стандартная форма выбора уже выбранного типа справочника
3 Азазелло
 
06.09.12
19:56
(2) Пока первое, что пришло на ум - отключаем у реквизита свойство ВыбиратьТип и кастомизируем ПриНачалеВыбора. Первый раз, пока тип реквизита = Неопределено - генерим список выбора типа значения, второй раз - в зависимости от выбранного ранее типа открываем нужную форму.
4 Feanorko
 
06.09.12
19:58
(2)
Процедура ПриНачалеВыбора(или как она там)
 СтандартнаяОбработка = Ложь;
 ВыбираемТип();
 ОткрываемФормуВыбора();
КонецПроцедуры

....

Profit
5 ChAlex
 
06.09.12
20:08
(3)(4) - в том то и дело "кастомизируем". Блин ну почему не сделать модель событий нормальную и логичную?! Хотя чего тут сетовать - в 1С много есть чего через Ж и фиг когда изменится. Кстати праллельный трабл - сначала на форме был реквизит, который не имел составной тип: все открывалось на ура. После того как реквизит изменить на составной: - ВСЕ! На форме ну никак не открывается выборка нужного справочника - ВСЕГДА ОТКРЫВАЕТСЯ форма того, справочника, который был раньше. И любые танцы с бубном - не помогаю. Пока с формы не удалить элемент и разместить повторно!!! И только после этого начинает срабатывать выбор нужного справочника! Я тихо шалею. А если посмотреть список зарегистрированных и не исправленных траблов в последнем релизе - с удивлением наталкиваюсь на ошибки, датированные еще 2010 годом!!! Это 2-х лет не хватило на то, чтобы отреагировать?... :)
6 Азазелло
 
06.09.12
20:16
(5) ну да, сложно... Много чего не продумано, из того, что можно было бы конфигурить лишь мышом, приходится программировать. Мне вот допустим всегда хотелось бы, чтобы значения булевых свойств элементов формы (а-ля Видимость, Доступность) можно было бы привязывать к значениям реквизитов объектов или форм.
Приходится играть по правилам, придуманным разработчиками платформы :(
7 ChAlex
 
06.09.12
20:22
(3) - а как можно в УФ определить типы реквизита (для универсальности). Конечно решение влоб - явно прописывать, но хотелось бы универсально через ТипЗначение.Типы(). В хелпе написано что для управляемого приложения есть свойство ТипЗначения для реквизита (доступное на сервере) - тока что-то не могу до него достучаться

(6) - ну блин список хотелок - и я могу на н-ное количество листов нарисовать.. :) Я, например, не понимаю вооще ограничений, присутствующих в УФ - в частности, для элемента можно указать реквизит формы в поле "СвязьПоТипу". НО: если это реквизит не размещен на форме (вернее не имеет видимости!!!!) - то и это сразу не работает!! Кажется ну какая нах разница - ведь реквизит имеется на клиенте - ну каого городить хрен знает чего
8 Азазелло
 
06.09.12
20:34
(7) мне почему-то видится единственным способом получить список возможных типов реквизита - через метаданные.
9 ChAlex
 
06.09.12
20:39
(8) - через метаданные сейчас и получаю. Но! Допустим поле в регистре имеет несколько больше типов, чем допустимые на форме. Т.е. на форме реквизит не имеет представления в сохраняемых данных - это просто реквизит формы -  и все. Форма создается для конкретного списка видов - остальные не использовать. Вот и выпадает тогда. Опять придется ручками и не забыть, если состав реквизита изменится в листинге подобавлять: - неудобняк однако!
10 ChAlex
 
06.09.12
20:41
А кстати - еще один момент: в обычных формах при очистке составного реквизита появлялась пиктограмка на кнопке "Т", а в УФ - такого нет. Что-то мне казалось раньше и в УФ такое было. .. Или это мне только кажется?
11 Азазелло
 
06.09.12
20:44
(10) может, кажется? в УФ вроде для составных типов при очистке поля сразу и значение и тип зачищаются.
12 Ns33
 
06.09.12
21:00
Я тут поэкспериментировал, работает такая штука, правда только на второй выбор:

&НаСервере
Процедура ФФ1()
   Элементы.реквизит1.ФормаВыбора="Справочник.Номенклатура.Форма.ФормаВыбора1";    
КонецПроцедуры
 
&НаКлиенте
Процедура Реквизит1ПриИзменении(Элемент)
   фф1();
КонецПроцедуры

Реквизит1ПриИзменении() вызывается 2 раза - при выборе типа и при выборе элемента.
13 ChAlex
 
06.09.12
23:19
(11) - я имею ввиду что значение и тип то зачищены, но это состояние никак не индицируется. Такое же поведение и в обычных формах, только там точно при этом отображается пиктограмка выбора типа "Т", а в управляемых вот дежавю всвязи с этим (обычно не обращал внимания, а вот при детальном рассмотрении бросается в глаза ее отсутсвие). Но какое-то смутное ощущение, что где-то в управляемых формах на глаза попадалось отображение выбора типа. Но сприть не буду - может и показалось.


(12) - ПриИзменении вызывается 2 раза - спору нет (после выбора типа значение очищается, и после выбора значения естественно) - впринципе можно и так зацепится, но не лучший вариант: вызов сервера (который вообщем-то лучше избежать, как-никак необходимости в этом нет) ну и все равно писать алгоритм обработки. Так что наверное лучше способ (3).
14 chaplin-che
 
07.09.12
00:19
Сделай как в 10.3 утэшке, сначала выбор из списка типа, потом че хочешь открывай.
Ошибка? Это не ошибка, это системная функция.