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