![]() |
![]() |
|
Поиск владельца формы | ☑ | ||
---|---|---|---|---|
0
Darklight
17.02.12
✎
13:23
|
Из реквизита, расположенного на форме документа, открывается форма выбора справочника (стандартным механизмом 1С через поле ввода). Как в форме выбора справочника определить форму исходного документа, из которого открыта форма выбора?
Владелец формы возвращает поле ввода, но из него нельзя получить форму, на которой установлен этот элемент формы. Переход на программное открытие формы (с передачей, например, в качестве владельца самой исходной формы, вместо поля ввода), пока не рассматриваю, т.к. это геморно и во многих местах нужно прописать. В т.ч. в полях составного типа. Пока вижу только перебор метаданных (документов) и всех форм, поиск отрытых форм и поиск в них указанного поля ввода. |
|||
1
Maxus43
17.02.12
✎
13:32
|
Мой гений дарит Вам (с)
Функция ПолучитьОткрытуюФорму(Источник, ИмяФормы = "", ИмяМетаданных="", МетаданныеИсточника="") #Если Клиент Тогда ОткрытаяФорма = Неопределено; ПараметрыИсточника = Источник.ДополнительныеСвойства; Попытка Если СтрЧислоВхождений(НРег(ИмяФормы),"списка")>0 Тогда ФормаСписка = Вычислить(ИмяМетаданных + "[МетаданныеИсточника.Имя].ПолучитьФормуСписка()"); Если ФормаСписка.Открыта() Тогда ОткрытаяФорма = ФормаСписка; ПараметрыИсточника.Вставить("ОткрытаяФорма", ОткрытаяФорма); ПараметрыИсточника.Вставить("ДействиеСФормой", "ЗакончитьРедактирование"); КонецЕсли; ИначеЕсли СтрЧислоВхождений(НРег(ИмяФормы),"выбора")>0 Тогда ФормаВыбора = Вычислить(ИмяМетаданных + "[МетаданныеИсточника.Имя].ПолучитьФормуВыбора()"); Если ФормаВыбора.Открыта() Тогда ОткрытаяФорма = ФормаВыбора; ПараметрыИсточника.Вставить("ОткрытаяФорма", ОткрытаяФорма); ПараметрыИсточника.Вставить("ДействиеСФормой", "ЗакончитьРедактирование"); КонецЕсли; Иначе ФормаЭлемента = Источник.ПолучитьФорму(ИмяФормы); Если ФормаЭлемента.Открыта() Тогда ОткрытаяФорма = ФормаЭлемента; ПараметрыИсточника.Вставить("ОткрытаяФорма", ОткрытаяФорма); ПараметрыИсточника.Вставить("ДействиеСФормой", "Закрыть"); КонецЕсли; КонецЕсли; Исключение КонецПопытки; Возврат ОткрытаяФорма; #КонецЕсли КонецФункции |
|||
2
Maxus43
17.02.12
✎
13:33
|
(1) выполняет поиск и закрытие открытой формы. закрытие убери и всё
|
|||
3
Maxus43
17.02.12
✎
13:34
|
напильником шлифануть для конкретно своей задачи
|
|||
4
Darklight
17.02.12
✎
13:37
|
(1)Спасибо. А можно уточнить входные параметры функции?
|
|||
5
Maxus43
17.02.12
✎
13:38
|
(4) вроде переменные названы по человечьи.
короче для тебя надо вот: ФормаВыбора = Вычислить(ИмяМетаданных + "[МетаданныеИсточника.Имя].ПолучитьФормуВыбора()"); Если ФормаВыбора.Открыта() Тогда ОткрытаяФорма = ФормаВыбора; просто так короче, без явного перебора |
|||
6
Maxus43
17.02.12
✎
13:39
|
ИмяМетаданных + "[МетаданныеИсточника.Имя].ПолучитьФормуВыбора()");
"справочник" "нужный Справочник" "нужная форма" |
|||
7
Darklight
17.02.12
✎
13:58
|
(6) ЭЭээ... по-моему Вы что-то не ак поняли. Мне из формы выбора справочника нужно определить форму, из которой она была открыта? Или я всё-таки не понял вашего решения?
|
|||
8
Maxus43
17.02.12
✎
14:01
|
код в (5) - получение открытой формы, имея некоторую инфу, надо попытаться эту инфу нарыть сначала конечно
|
|||
9
Mort
17.02.12
✎
14:12
|
Вот к чему приводит недооценка/незнание оопешной парадигмы черного ящика.
|
|||
10
Darklight
17.02.12
✎
14:42
|
(8) Учитывая, что у меня формы документов - использовать функцию Вычислить мне нет необходимости; учитывая, что у меня формы документов - форму я буду получать через ПолучитьФорму("ФормаДокумента") менеджера документов (или через ПолучитьФорму() глобального контекста), а в остальном ваше предложение сводит к тому, что я написал в предполагаемом мною решении моей проблемы в (0), только нет самого кода перебора метаданных. Что же Вы так гениально хотели подарить :] Но, в любом случае, есть одна засада - при получении формы редактирования объекта (формы документа) не из конкретного объекта - поиск отрытой формы не осуществляется - а всегда возвращается новый объект!!! Вот что с этим делать - не ясно :(
|
|||
11
Kashemir
17.02.12
✎
14:45
|
(10)
ПолучитьФорму(<Форма>, <Владелец>, <КлючУникальности>) Значение параметра присваивается свойству открываемой формы КлючУникальности. Следует учитывать, что при получении формы из "объекта" система получает форму для конкретного экземпляра объекта с учетом совокупности переданных параметров, в то время как для "ссылки" всегда существует только один объект в базе данных и форма получается одна (для одинаковой совокупности параметров |
|||
12
Kashemir
17.02.12
✎
14:46
|
(11)
Тип: Произвольный. В данном параметре может быть задан некоторый ключ, значение которого будет использоваться для поиска уже открытых форм. При поиске учитываются значения свойств открытых форм соответствующим значениям параметров метода. Если найдена открытая форма (по совпадению всех параметров), то она будет возвращена вместо новой формы. Если из некой формы (один и тот же владелец) требуется открывать новые экземпляры другой формы, то при каждом вызове метода значение данного параметра должно быть уникально (в рамках соответствующих значений свойств открытых форм). Значение параметра присваивается свойству открываемой формы |
|||
13
Maxus43
17.02.12
✎
14:48
|
(11)(12) тут ключ надо ставить не открываем форме а уже открытой, и "знать" значение ключа в открываемой
|
|||
14
Darklight
17.02.12
✎
14:48
|
(12)Документ открывается пользователем из интерфейса, его форме не присваивается ключа уникальности. Соответственно, я не могу его использовать!
|
|||
15
Maxus43
17.02.12
✎
14:51
|
(14) перед открытием формы выбора можно форме источнику присвоить ключ
|
|||
16
Kashemir
17.02.12
✎
14:54
|
(14) Для случая открытия документа из интерфейса ... должна работать привязка по ссылке, следовательно:
в то время как для "ссылки" всегда существует только один объект в базе данных и форма получается одна (для одинаковой совокупности параметров |
|||
17
Maxus43
17.02.12
✎
14:59
|
ЭтаФорма.КлючУникальности = Строка(УИД_Объекта);
Фрм = ПолучитьФормуВыбора(,,Строка(УИД_Объекта)+"ГыЧтобНеОдинаковыеКлючиУникальностиУДвухФорм"); Фрм.Открыть(); в форме выбора - КлючУникальностиФормыВладельца = Лев(ЭтаФорма.КлючУникальности, 32); гы :) |
|||
18
Darklight
17.02.12
✎
15:08
|
(15)Это сводится к тому, что мне придётся писать код в каждой форме документа-источника, что равносильно тому, что я напишу свой алгоритм открытия формы и передам форме выбора в качестве владельца форму документа.
(16)А тут я не понял, что вы хотели сказать - цитируете синтаксис помошник - ну так хоть говорите, как это правильно применить. Вот 1С-цы сволочи. Есть в менеджера документов функция "ПолучитьФормуНовогоДокумента" для получения формы нового документа (хотя это можно было бы решить и просто созданием нового документа объекта и получения его формы). Но зачем же тогда ПолучитьФорму("ФормаДокумента") тоже возвращает форму нового документа, вместо того, чтобы как и для других форм произвести поиск всех открытых форм (ибо Ключ по умолчанию = Ложь). Тогда тут остаётся только дело за ручным отслеживанием открываемых форм. Можно ли это событие отловить из одного общего места? |
|||
19
Maxus43
17.02.12
✎
15:15
|
цель задачи какая?
|
|||
20
Kashemir
17.02.12
✎
15:16
|
(18) Если я правильно понял вопрос из (10):
Но, в любом случае, есть одна засада - при получении формы редактирования объекта (формы документа) не из конкретного объекта - поиск отрытой формы не осуществляется - а всегда возвращается новый объект!!! Вот что с этим делать - не ясно :( Цитирование СП является ответом на него. |
|||
21
Darklight
17.02.12
✎
15:17
|
(17)Maxus43 - Вы извращенец!
Форма владелец: Фрм = НужныйМенеджер.ПолучитьФормуВыбора(, ЭтаФорма) Фрм.Открыть(); Форма выбора: ФормаВладелец = ЭтаФорма.ВладелецФормы; |
|||
22
Maxus43
17.02.12
✎
15:24
|
(21) это не предел. смотри кошерно как:
Форма выбора: ПриОткрытии() Оповестить("СкажитеКтоМеняОткрыл"); ОбработкаОповещения(ИмяСобытия, Параметр, Источник) Если ИмяСобытия = "ПолучайНаЗдоровье" Тогда НашёлОбъект = Источник; КонецЕсли; КонецПроцедуры; ФормаВладелец: ОбработкаОповещения(ИмяСобытия, Параметр, Источник) Если ИмяСобытия = "СкажитеКтоМеняОткрыл" Тогда Оповестить("ПолучайНаЗдоровье",, ЭтотОбъект); КонецЕсли; |
|||
23
Darklight
17.02.12
✎
15:29
|
(19) Ээээ см сабж. Нужно найти форму владельца (форма редактирования документа) из которой была открыта форма выбора (в самой форме выбора, не прибегая к написанию кода в самом владельце - ибо их много... много реквизитов откуда форма выбора может быть открыта).
(20) Данное цитирование - здесь делу не поможет - либо я не понимаю - что же вы хотите сказать! Теперь вижу только один выход (к нему прибегал я и ранее, очень давно, но ищу новые возможности, с ростом версии платформы 1С): регистрировать (в списке) в глобальной переменной все открываемые формы (при их открытии; а так же, по возможности, убирать её при их закрытии). И для поиска открытой формы - перебирать этот список ;) А далее как я уже говорил, по полю ввода (владелец открытой формы выбора) можно найти ту форму, в к элементам которой он принадлежит. Осталось разобраться только с грамотной регистрацией открываемых/закрываемых форм. Ранее я прописывал это в соответствующих обработчиках всех форм (автоматически путём обработки выгруженных модулей). Но, может, сейчас есть более технологичное решение в 1с 8.2? Поддерживающее ещё и управляемые формы (правда это пока не надо, но на перспективу нужно). |
|||
24
Darklight
17.02.12
✎
15:32
|
(22)Почти то же что предлагаю я. Но, у вас так все формы будут отвечать (если открыто более одной) где такой когд будет прописан ;) а нужна только форма владелец именно этого поля ввода - ну, в прочем, это уже можно как раз доработать. Другие, более технологичные варианты будут - всё-таки вопрос стоял в отказе внесения изменения в код форм владельцев (форм документов).
|
|||
25
Kashemir
17.02.12
✎
15:33
|
(23) Альтернативой регистрации может быть внешнее событие и реакция форм на него
|
|||
26
Maxus43
17.02.12
✎
15:34
|
Когда я спрашивал - какая цель - я имел ввиду пример когда это нужно, реальных задач таких не встречал. надо искать другой путь
|
|||
27
Kashemir
17.02.12
✎
15:35
|
Кстати была уже похожая тема v8: Количество одновременно редактируемых документов.
|
|||
28
Darklight
17.02.12
✎
15:39
|
(25) Это уже было выше предложено Maxus43 - но это опять требует вмешательства в код исходных документов.
(26) Задача была простая - требуется определить состав отображаемых элементов справочника в зависимости от даты документа, из которого открыт этот справочник. Просто в разных периодах должен отображаться разный состав справочника. И это должно быть реализовано очень жёстко с точки зрения пользователя, чтобы не дай бог, он не выбрал неправильный элемент (недоступный для этого документа по его дате). |
|||
29
Darklight
17.02.12
✎
15:45
|
(27)Прочитал, но сути не понял. Где регистрировать - это не так важно. Важно как определять момент открытия формы, не вставляя никакого кода в саму форму ;)
|
|||
30
Maxus43
17.02.12
✎
15:50
|
без совсем кода никак видимо, на в данной задаче есть более простой код, в ключ уникальности формы выбора вставляй дату и всё, не надо будет получать форму-владельца
|
|||
31
Darklight
17.02.12
✎
15:53
|
Смортрию типовые документы. В формах в обработчике события ПриОтркытии "везде" есть вот такой вот вызов
РаботаСДиалогами.АктивизироватьРеквизитВФорме(ЭтотОбъект, ЭтаФорма); Тогда можно в этой процедуре общего модуля единожды разместить код регистрации открытия формы. Ведь вряд ли она будет вызвана для неоткрытой формы. Да и не критично это будет (всё равно формы будут проверяться методом Форма.Открыта()). Могу ли я так поступить? |
|||
32
Maxus43
17.02.12
✎
16:02
|
(31) я бы в другую процедуру впихнул, РаботаСДиалогами.УстановитьЗаголовокФормыДокумента
|
|||
33
Darklight
17.02.12
✎
16:04
|
(32) Так тоже можно. Здесь уже больше вопрос - что более массово используется.
|
|||
34
Darklight
17.02.12
✎
17:25
|
Чёрт! Чёрт! Чёрт! ПолеВвода в реквизите ВладелецФормы и реальное ПолеВвода из которого была открыта форма - это РАЗНЫЕ объекты, даже с разным составом свойств!!! И никак не зацепишь одно за другое! Чёрт! Чёрт! Чёрт!
|
|||
35
Darklight
17.02.12
✎
18:34
|
(34) &*^&^%$# Слов нет! Когда я вручную подсовываю в функцию "ПолучитьФрму" в качестве владельца ПолеВвода - оно корректно передаётся в форму в качестве ВладелецФормы, но когда это происходит автоматически при стандартной обработке выбора - то передаваемый объект ПолеВвода не соответствует исходному полю ввода из которого инициирован выбор - что за БРЕД!
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |