Имя: Пароль:
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
"В клиент-серверном варианте информационной базы в обычном приложении при получении или открытии обычных форм внешних обработок вместо формы возвращается значение Неопределено."

Надо бы на последнем релизе платформы проверить.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший