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

Школа 1С

  Все выпуски  

1С:Школа Взаимодействие форм ч.2


Информационный Канал Subscribe.Ru

Парадокс: источник нашей мудрости - наша глупость.
Доказательство см.внизу.

1С:Школа.
Выпуск 44.
"Работа с формами. Контекст (ч.2) ".

В этом выпуске мы продолжим изучение взаимодействия форм и на этом примере познакомимся с одним из самых сложных понятий в конфигурировании 1С. Это понятие "Контекст".  С помощью контекста можно творить чудеса, если разобраться что это такое.  Попробую объяснить своими словами.

Когда Вы находитесь в модуле, то имеете доступ к свойствам формы, к реквизитам формы, к определенным методам, доступным в данном модуле.  Например, если Вы находитесь в модуле формы документа, то можете обращаться к реквизитам документа (ДатаДок, НомерДок, реквизиты шапки и табличной части). Кроме этого, доступен ряд методов, которые можно применять только в этом модуле! Это методы: ПриЗаписиПерепроводить(),  ПроводитьПослеТА(), ИзменениеПорядкаСтрок(), Модифицированность(), Записать(). Вся совокупность атрибутов и методов, доступных в данный момент называется контекстом.   К текущему контексту Вы всегда обращаетесь напрямую и не надо использовать для этого какие-то ухищрения.  Но текущий контекст можно передать в любой другой модуль! И из этого модуля-приемника можно будет получить доступ к атрибутам и методам переданного контекста. Например, можно управлять формой: прятать и показывать реквизиты формы, управлять закладками и т.д. Текущий контекст находится в служебной переменной "Контекст". Вы можете обращаться с ней как с переменной.

Важные дополнения:

  • Через контекст не доступны Ваши процедуры и функции, а также переменные контекста.
  • Контексты нельзя "складывать", "вычитать", "умножать", делить".
  • Контекст нельзя "увидеть". Если Вы напишете Сообщить(Контекст);, то увидите сообщение "ГрупповойКонтекст".

Все это  не кажется простым, но это только на первый взгляд. Рассмотрим на примере использование контекста. Задача такая: форма "А" открывает форму "Б" и устанавливает необходимые значения в открытой форме.  В данном случае все необходимые действия выполняются в форме "А". Форма "Б" - вообще не требует доработок. Пусть Форма "А" и Форма "Б" это формы отчетов: "ОтчетА" и "отчетБ". Но могут быть любые другие формы.

Мы должны открыть "отчетБ" с помощью метода "ОткрытьФорму(, );" В описании метода (см.Синтаксис-помошник) сказано, что во второй параметр после открытия передается контекст  открытой формы. Это означает, что мы можем установить необходимые значения в форме и выполнить с открытой формой Б какие-то действия их формы А. Пусть в форме "отчетБ" есть несколько реквизитов: р1 (число), р2 (строка), р3 (дата). Как установить значения этих реквизитов из формы отчета А.  Процедура Сформировать -  открывает форму отчетаБ . Она может быть вызвана, например, по кнопке.

Процедура Сформировать()
к="";
//переменная, куда поступит контекст
ОткрытьФорму("Отчет.ОтчетБ", к );
Если типЗначения(к)=100 Тогда //надо проверить открыта ли форма.
    к.р1=32.1;
    к.р2="Привет";
    к.р3='01.02.2002';
    к.форма.Обновить(1);
КонецЕсли;
КонецПроцедуры

После выполнения метода "ОткрытьФорму" - в переменную К, должен поступить контекст открытой формы.  Но это надо проверить - ведь форма может и не открыться по каким-то причинам (ошибка при открытии, нет открываемого объекта и т.д.).  Если контекст поступил, то мы можем работать с ним. Мы через переменную К, обращаемся к реквизитам р1,  р2, р3 и присваиваем им значения. После этого, снова через переменную К, мы обращаемся к форме, чтобы она обновилась и показала нам новые значения реквизитов. Это самый простой пример. В данном случае, мы "насильно" устанавливаем в открываемой форме необходимые значения.

Исследовательская задача для самостоятельной работы: как вы думаете, если в открываемой форме написать процедуру приОткрытии(), будут ли к этому моменту известны значения реквизитов р1, р2,р3? Другими словами - что раньше случается: Процедура приОткрытии (в форме Б) или присваивание значений реквизитам (в форме А).

Вариант №2. Еще один пример использования контекста. И опять с формами А и Б. Только теперь наоборот - не форма А установит значения в форме Б, а форма Б  возьмет из формы А необходимые ей (форме Б) значения. Для этого из формы А необходимо передать контекст формы А в форму Б. Вот как будет выглядеть процедура открытия формы Б из формы А.

Процедура Сформировать()
    ОткрытьФорму("Отчет.ОтчетБ", Контекст );
КонецПроцедуры

Что же происходит в отчетеБ? Через атрибут форма.Параметр - мы получаем доступ к контексту формы А и записываем его в переменную КонтА. После этого, обращаемся к реквизитам формы зн1, зн2, зн3 для получения значений. После этого, закроем форму А из формы Б.

Процедура ПриОткрытии()
    КонтА=Форма.Параметр;
   
Если типЗначения(контА)=100 Тогда
        р1=КонтА.зн1;
        р2=КонтА.зн2;
        р3=КонтА.зн3;
        контА.Форма.Закрыть(0);
//закрываем форму А
   
КонецЕсли;
КонецПроцедуры

Вот и все секреты. С помощью этой методики можно организовать много интересных механизмов. Такие механизмы как "Подбор" и "Ввод на основании" являются всего лишь частными случаями механизма ОткрытьФорму+Контекст. В качестве самостоятельной работы, Вы можете попробовать реализовать ввод на основании и подбор с помощью метода ОткрытьФорму и передачи контекста в открываемую форму.


А Вы знаете, что на сайте 1С:Школы пока еще есть Учебный курс
"План Счетов. Проводки. Бухгалтерские Итоги"?


Источник нашей мудрости - наш опыт.
Источник нашего опыта - наши ошибки.
Источник наших ошибок - наша глупость


Алексей Колосов.



http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное