Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Волшебство программирования на 1С:Предприятие 7.7 и 8.0. Выпуск 105



Волшебство программирования на 1С:Предприятие 7.7 и 8.0
Выпуск 105 / 31.06.2006

7.7: Параметр и контекст формы
URL: http://www.kb.mista.ru/article.php?id=172
Автор: Ангел-Хоронитель.

Итак, что же такое параметр?

Параметр – это значение, передаваемое в форму при открытии. Параметр может иметь любой тип и принимать любое значение.

Зачем нужен параметр?

Параметр нужен для передачи в форму дополнительных значений. Например: откуда открыта форма.

Как передать параметр?

Параметр передается в форму при открытии. Например:

      ОткрытьФорму("Документ.ПеремещениеТМЦ","Розница");
Или еще пример:
Товар = ВыбранныйТовар;
ОткрытьФормуМодально("Отчет.ДвиженияТМЦ",Товар);
Как получить параметр в открывшейся форме?

Получить параметр, переданный в форму, мы можем таким образом:
Процедура ПриОткрытии()
    ПолучПараметр = Форма.Параметр;
КонецПроцедуры // ПриОткрытии
Как передать несколько значений?

Поскольку параметр может принимать любое значение, он может принимать значение типа Список. Пример
Параметр = СоздатьОбъект("СписокЗначений");
Параметр.ДобавитьЗначение(Товар,"Товар");
Параметр.ДобавитьЗначение(ВыбДата,"ДатаНачала");
ОткрытьФорму ("Отчет.ДвиженияТМЦ", Параметр);
Пример обработки его в открывшейся форме:
Процедура ПриОткрытии()
   ПолучПараметр = Форма.Параметр;
   ВыбТовар = ПолучПараметр.Получить("Товар");
   ВыбДата = ПолучПараметр.Получить("ДатаНачала");
КонецПроцедуры // ПриОткрытии

 

Что такое контекст формы?

Контекст – это идентификатор формы, что-то вроде ее имени. Он используется для того, чтобы точно указать программе, к какой форме вы обращаетесь. То есть с помощью контекста можно обращаться к одной форме из другой.

Как работать с контекстом?

Все довольно просто. Для того, чтобы с контекстом работать, его надо сначала передать.
Передается он с помощью параметра. Например:

      ОткрытьФорму ("Отчет.ДвиженияТМЦ", Контекст);
Но правильнее будет воспользоваться такой процедурой в глобально модуле:
Функция глВзятьКонтекст(Конт) Экспорт
   Возврат Конт;
КонецФункции // глВзятьКонтекст()
использовать ее нужно так:
      ОткрытьФорму ("Отчет.ДвиженияТМЦ", глВзятьКонтекст(Контекст));
Для закрепления полученных знаний приведем практический пример.

Создадим тестовую обработку, и назовем ее Пример. Добави на нее кнопку Закрыть для закрытия формы. Теперь добавим на нее Текстовый реквизит и пропишем  ему в поле Формула ТР. Также в модуле формы пропишем:
Перем ТР;
Процедура ПриОткрытии()
   Если ПустоеЗначение(Форма.Параметр) = 0 Тогда           
        ТР = Форма.Параметр.Наименование;
   КонецЕсли;
КонецПроцедуры
Теперь откроем форму списка справочника Номенклатура и добавим туда кнопку. В формуле кнопки напишем
ОткрытьФорму("Обработка.Пример",ТекущийЭлемент());
Запустите 1С, откройте справочник номенклатуры, нажмите кнопку. Откроется форма и там будет наименование выбранной номенклатуры. Мы передали параметр.
Теперь передадим несколько значений. У кнопки поменяем формулу на ОткрытьПример(). Опишем процедуру:
Процедура ОткрытьПример()        
        Парам = СоздатьОбъект("СписокЗначений");
        Парам.ДобавитьЗначение(ТекущийЭлемент().ЭтоГруппа(),"Группа");  
        Парам.ДобавитьЗначение(ТекущийЭлемент(),"Элемент");
        ОткрытьФорму("Обработка.Пример",Парам);    
КонецПроцедуры //ОткрытьПример    
В обработке перепишем:
Процедура ПриОткрытии()      
    Если ТипЗначенияСтр(Форма.Параметр) = "СписокЗначений"Тогда           
        Если Форма.Параметр.Получить("Группа") = 1 Тогда
            ТР = Форма.Параметр.Получить("Элемент").ПолноеНаименование();
        Иначе
            ТР = Форма.Параметр.Получить("Элемент").Наименование;    
        КонецЕсли;    
    КонецЕсли;
КонецПроцедуры

Пробуем. В зависимости от того, группа или нет, текущий элемент, в обработке пишется полное наименование или обычное.

Теперь поработаем  с контекстом. Перепишем процедуру ОткрытьПример:
Процедура ОткрытьПример() 
       
    Парам = СоздатьОбъект("СписокЗначений");
    Парам.ДобавитьЗначение(Контекст,"Конт");  
    ОткрытьФорму("Обработка.Пример",Парам);
    ПримерКонт = Парам;    

КонецПроцедуры //ОткрытьПример    

Изменим и обработку:
Перем Влад;
               
Функция Надпись() 
    Возврат(?(ПустоеЗначение(Влад)=0,Влад.ТекущийЭлемент(),""));
КонецФункции //Надпись

Процедура ПриОткрытии() 
    Влад = Форма.Параметр.Получить("Конт");
КонецПроцедуры
В текстовом реквизите на обработке в формулу пропишем Надпись() и приделаем туда еще одну кнопку Обновить у которой в формулу пропишем Форма.Обновить()

Запускаем. При открытии в текстовом реквизите высвечивается текущий элемент справочника, но при его смене надпись не меняется, а меняется она только после нажатия кнопки Обновить. То есть текстовый реквизит на форме не обновляется. Незадача? Давайте решим и ее. Оказывается, при открытии формы можно получить и ее контекст из места открытия. В форме списка справочника объявим переменную ПримерКонт. Перепишем процедуру ОткрытьПример:
Процедура ОткрытьПример()        
    Парам = СоздатьОбъект("СписокЗначений");
    Парам.ДобавитьЗначение(Контекст,"Конт");  
    ОткрытьФорму("Обработка.Пример",Парам);
    ПримерКонт = Парам;    
КонецПроцедуры //ОткрытьПример
Теперь в функции какого-нить текстового реквизита (например ИнформационнаяНадпись()), пропишем такие строки:
Если ТипЗначения(ПримерКонт) = 100 Тогда
  ПримерКонт.Форма.Обновить()
КонецЕсли;
Запускаем, открываем и… О, ЧУДО! при смене элемента изменяется и надпись.
Теперь поясним: рассмотрим процедуру ОткрытьПример. После ОткрытьФорму переменная Парам имеет значение контекста открытой формы (значение передалось) и мы присваиваем его переменной ПримерКонт. А выражение  ТипЗначения(ПримерКонт) будет равно 100 пока будет открыта форма.

Интересные ветки форума

1С:Предприятие 7.7

v7: Кто видел обработку - распределёные вычисления могут быть в 1С
v7: Движения по регистру будущей датой
v7: Представление графически структуры справочников (грамотно)
v7: Связь 1С через интернет
v7: Весы CAS LP версия 1.5 как подключить?

1С:Предприятие 8.0

v8: Планы обмена
v8: Теперь в 1С-отладчике есть и трассировка
v8: Различные модули проведения для документов, какие возможны проблемы?
v8: возможно ли ИМЕЮЩИЕ в запросе с ИТОГИ ПО?
v8: Настройка построителя отчета

Информационные технологии

25 самых худших IT- продуктов
как поднять службу SKEYSRVC
Расширяем Firefox
Как определить что архивирование завершено
Как сделать чтобы постоянно работал num lock

О жизни...

OFF: сегодня - день борьбы с курением ...
OFF: Питер. 25 июня 2006 года. Прогулка на яхте по финскому заливу.
OFF: Куда податься из 1С?
OFF: Нужна ли секция "За рулём"?
OFF: Просто страшно. Недалекое будущее.


Официальный сайт рассылки - www.mista.ru
Волшебный форум -
www.forum.mista.ru
Книга знаний - www.kb.mista.ru

С уважением,
Станислав Митичкин (Волшебник)
stasmit@mail.ru



В избранное