Имя: Пароль:
1C
1С v8
Получить форму по элементу управления
,
0 maxp77
 
09.10.14
12:56
Задача:
в одной из типовых функций УПП:
- УниверсальныеМеханизмы.ПолучитьДеревоМакетовПечати;
- УниверсальныеМеханизмы.УстановитьПодменюПечати;
- УниверсальныеМеханизмы.УстановитьПечатьПоУмолчанию
по передаваемому в них элементу управления "ЭлементыФормы.ОсновныеДействияФормы"
определять конкретную форму, на которой этот элемент управления расположен. Как?
1 maxp77
 
09.10.14
14:31
up
2 maxp77
 
09.10.14
16:26
up
3 ssh2QQ6
 
09.10.14
16:39
Раз это ОсновныеДействияФормы, то вероятно источник действий командной панели, а это видимо командная панель - Форма. Можно ее получить через свойство элемента ИсточникДействий
4 maxp77
 
09.10.14
16:41
(3) ИсточникДействий в таком случае = Неопределено, это только в конфигураторе в палитре свойств для источника действий будет написано "форма". Не подходит.
5 maxp77
 
09.10.14
16:43
пробовал даже через метод ПолучитьПривязку() для командной панели добраться до формы, но он к сожалению панель формы возвращает, а не саму форму.
6 ssh2QQ6
 
09.10.14
16:44
(4) да, не подходит
7 SeiOkami
 
09.10.14
17:00
(0), не понимаю проблемы глянуть процедуру
8 maxp77
 
09.10.14
17:10
(7) в обработчике ПередОткрытием() формы документа вызывается процедура общего модуля
УниверсальныеМеханизмы.УстановитьПодменюПечати    (мПодменюПечати, ЭлементыФормы.ОсновныеДействияФормы, мДеревоМакетов);

В этой процедуре требуется определять, что за форма её вызвала по переданному элементу управления ЭлементыФормы.ОсновныеДействияФормы.

сама процедура:
Процедура УстановитьПодменюПечати(ПодменюПечати, КоманднаяПанель, ДеревоМакетов) Экспорт

    Если ДеревоМакетов.Строки.Количество() > 1 Тогда
        ИмяПодменю = "ПодменюПечати";

        Если ПодменюПечати = Неопределено Тогда
            Если КоманднаяПанель.ВыравниваниеКнопок = ВыравниваниеКнопокКоманднойПанели.Право Тогда
                КоманднаяПанель.Кнопки.Вставить(0,,ТипКнопкиКоманднойПанели.Разделитель);
                ПодменюПечати = КоманднаяПанель.Кнопки.Вставить(0,ИмяПодменю,ТипКнопкиКоманднойПанели.Подменю,"Печать");
            Иначе
                КоманднаяПанель.Кнопки.Добавить(,ТипКнопкиКоманднойПанели.Разделитель);
                ПодменюПечати = КоманднаяПанель.Кнопки.Добавить(ИмяПодменю,ТипКнопкиКоманднойПанели.Подменю,"Печать");
            КонецЕсли;

            ПодменюПечати.Подсказка = "Меню выбора печатных форм";
        КонецЕсли;
        
    Иначе
        Если ПодменюПечати <> Неопределено Тогда
            КоманднаяПанель.Кнопки.Удалить(ПодменюПечати);
            ПодменюПечати = Неопределено;
        КонецЕсли;

    КонецЕсли;
    
КонецПроцедуры
9 hhhh
 
09.10.14
17:13
(8) "В этой процедуре требуется определять, что за форма её вызвала" - здесь не требуется форма. Без формы всё.
10 hhhh
 
09.10.14
17:14
(9)+ а, понял.
11 hhhh
 
09.10.14
17:21
у меня таки

         Фрм = КоманднаяПанель.ИсточникДействий;
         Если ТипЗнч(Фрм) = Тип("Форма") Тогда

срабатывает. не знаю, почему у вас не пашет.
12 maxp77
 
09.10.14
17:31
(11) вы этот код в каком модуле пишете?
Вообще, даже в СП написано:
"Если значение свойства Неопределено, то источниками данных будет являться форма и все элементы управления, которые могут выступать в качестве источника действий."
13 maxp77
 
09.10.14
18:03
Есть ещё идеи?
14 DailyLookingOnA Sunse
 
09.10.14
18:06
Перебирать все метаданные в поисках формы, в которой есть элемент со свойствами, равными исходным.
15 maxp77
 
09.10.14
18:30
(14) Жестоко, но это в лучшем случае позволит только найти метаданные формы, но не получить экземпляр конкретной формы, т.к., например, документов одного типа может быть открыто сразу несколько.
16 hhhh
 
09.10.14
19:00
(12) значение свойства там у командной панели Форма. Откуда неопределено может взяться?
17 Фокусник
 
09.10.14
19:02
Придется ждать, когда в платформе приделают .Владелец() для реквизита формы, как это сделали со строкой ТЗ/ДЗ :)
18 maxp77
 
09.10.14
22:02
(16) код в студию, пожалуйста :) В УПП и в ЗУП неопределено возвращает в типовых документах. Возможно, это как-то связано со свойством командной панели Автозаполнение, там оно сброшено.
19 maxp77
 
09.10.14
22:04
(17) ждать нет времени, нужно изобретать велосипед :)
20 maxp77
 
11.10.14
19:54
(17) может быть это как-то взаимосвязано с ошибкой платформы
https://bugboard.v8.1c.ru/error/000002126.html
"В клиент-серверном варианте информационной базы в обычном приложении при получении или открытии обычных форм внешних обработок вместо формы возвращается значение Неопределено."

Надо бы на последнем релизе платформы проверить.