Контекст модуля формы
страницаКонтекст модуля формы
Каждый модуль связан с остальной частью конфигурации. Эта связь называется контекстом модуля.
Контекст модуля определяет набор доступных во время выполнения модуля объектов, переменных, процедур и функций.
Поскольку дальше речь пойдет о том обработчике, который мы написали в модуле формы, рассмотрим подробнее, из чего складывается контекст модуля формы.
Контекст модуля формы образуется:
- локальным контекстом самого модуля формы;
- реквизитами формы, которой «принадлежит» модуль;
- свойствами и методами объекта УправляемаяФорма встроенного языка;
- свойствами и методами расширения формы, определяемого типом того объекта, данные которого содержатся в основном реквизите формы;
- глобальным контекстом, в том числе неглобальными общими модулями и экспортируемыми функциями и процедурами глобальных общих модулей;
- экспортируемыми переменными, процедурами и функциями модуля управляемого приложения.
Рассмотрим подробнее, что собой представляет каждая из перечисленных составляющих.
- Локальный контекст модуля формы.
Локальный контекст модуля формы — это переменные, процедуры и функции, объявленные в этом модуле.
Например, внутри модуля формы можно непосредственно обращаться по имени к процедуре ПолучитьСумму(), объявленной в этом же модуле (листинг 5.2):
Листинг 5.2. Модуль формы
&НаКлиенте
Процедура Команда1()
ПолучитьСумму();
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ПолучитьСумму()
…
КонецПроцедуры
Или внутри модуля формы можно непосредственно обращаться по имени к переменной СлужебнаяПеременная, объявленной в этом модуле (листинг 5.3):
Листинг 5.3. Модуль формы
&НаКлиенте
Перем СлужебнаяПеременная;
&НаКлиенте
Процедура Команда1()
СлужебнаяПеременная = 3;
КонецПроцедуры
- Реквизиты формы, которой «принадлежит» модуль.
Например, если у формы существует реквизит СлужебныйРеквизит (рис. 5.8), то к нему можно непосредственно обращаться по имени (листинг 5.4):

Рис. 5.8. Реквизит формы — «Служебный реквизит»
Листинг 5.4. Модуль формы
&НаКлиенте
Процедура Команда1()
СлужебныйРеквизит = 3;
КонецПроцедуры
- Свойства и методы объекта «УправляемаяФорма».
Свойства и методы объекта встроенного языка УправляемаяФорма описаны в синтакс-помощнике: Интерфейс (управляемый) > УправляемаяФорма (рис. 5.9).

Рис. 5.9. Свойства управляемой формы в синтакс-помощнике
К ним можно обращаться непосредственно по имени. Например, можно задать заголовок формы (листинг 5.5).
Листинг 5.5. Модуль формы
&НаКлиенте
Процедура Команда1()
Заголовок = "Новый заголовок формы";
КонецПроцедуры
Или можно закрыть форму (листинг 5.6).
Листинг 5.6. Модуль формы
&НаКлиенте
Процедура Команда1()
Закрыть();
КонецПроцедуры
- Свойства и методы расширения формы, определяемого типом того объекта, данные которого содержатся в основном реквизите формы.
Один из реквизитов формы может быть основным, в списке реквизитов он выделяется жирным. Как правило, основной реквизит формы содержит данные того объекта, который отображается в форме. Например, если это форма справочника, то основной реквизит будет содержать данные объекта СправочникОбъект.<имя> (рис. 5.10).

Рис. 5.10. Основной реквизит формы
А если это форма документа, то основной реквизит формы будет содержать данные объекта ДокументОбъект.<имя> (рис. 5.11).

Рис. 5.11. Основной реквизит формы
Тут следует пояснить, почему в списке реквизитов тип основного реквизита указан в скобках: (ДокументОбъект.Документ1). Дело в том, что это «ненастоящий» тип реквизита формы. Настоящий тип в данном случае будет ДанныеФормыСтруктура (рис. 5.12).

Рис. 5.12. Тип объекта основного реквизита формы
Но ДанныеФормыСтруктура — это универсальный тип, который может содержать данные различных прикладных объектов. Поэтому, чтобы в редакторе формы можно было «ориентироваться», данные какого же именно прикладного объекта отображает эта форма, в колонке Тип редактора показывается не тип реквизита формы (ДанныеФормыСтруктура), а тип того объекта, данные которого содержатся в этом реквизите. И этот «ненастоящий» тип показывается в скобках.
От типа объекта, данные которого содержатся в основном реквизите формы, зависят некоторые особенности в поведении формы.
Например, если основной реквизит формы будет содержать данные документа, то при закрытии такой формы система будет запрашивать подтверждение записи и проведения этого документа. Если же основной реквизит формы будет содержать данные справочника, то подобного запроса подтверждения при закрытии формы возникать не будет.
В зависимости от того, какой тип имеет объект, данные которого содержатся в основном реквизите, к контексту программного объекта УправляемаяФорма добавляется контекст соответствующего расширения.
Например, если основной реквизит — СправочникОбъект.<имя>, то в модуле формы становятся доступны свойства, методы объекта встроенного языка Расширение управляемой формы для справочника (синтакс-помощник — Интерфейс (управляемый) > Управляемая форма > Расширение справочника), рис. 5.13.

Рис. 5.13. Описание объектов в синтакс-помощнике
А если основной реквизит — ДинамическийСписок (рис. 5.14), то в модуле формы становятся доступны свойства, методы объекта встроенного языка Расширение управляемой формы для динамического списка (синтакс-помощник — Интерфейс (управляемый) > Управляемая форма > Расширение динамического списка), рис. 5.15.

Рис. 5.14. Основной реквизит формы

Рис. 5.15. Описание объектов в синтакс-помощнике
Таким образом, в модуле формы, где основной реквизит содержит данные документа (рис. 5.16), можно обратиться к свойству расширения управляемой формы для документа АвтоВремя (листинг 5.7).

Рис. 5.16. Основной реквизит формы
Листинг 5.7. Модуль формы
&НаКлиенте
Процедура Команда1()
АвтоВремя = РежимАвтоВремя.Первым;
КонецПроцедуры
Или записать документ с помощью метода расширения управляемой формы для документа Записать(), листинг 5.8:
Листинг 5.8. Модуль формы
&НаКлиенте
Процедура Команда1()
Записать(РежимЗаписиДокумента.Проведение);
КонецПроцедуры
- Глобальный контекст, в том числе неглобальные общие модули и экспортируемые функции и процедуры глобальных общих модулей.
В модуле формы можно получить системную дату, обратившись к встроенной функции ТекущаяДата(), листинг 5.9.
Листинг 5.9. Модуль формы
&НаКлиенте
Процедура Команда1()
Сообщить(ТекущаяДата(****));
КонецПроцедуры
Или получить историю работы пользователя, обратившись к свойству глобального контекста ИсторияРаботыПользователя (листинг 5.10).
Листинг 5.10. Модуль формы
&НаКлиенте
Процедура Команда1()
История = ИсторияРаботыПользователя.Получить();
КонецПроцедуры
Если в глобальном общем модуле (например, ОбменДанными) определена экспортная процедура ПолучитьПрефиксНомера() (листинг 5.11), то в модуле формы можно обращаться к ней по имени (листинг 5.12).
Листинг 5.11. Глобальный общий модуль
Функция ПолучитьПрефиксНомера() Экспорт
Возврат Константы.ПрефиксНумерации.Получить();
КонецФункции
Листинг 5.12. Модуль формы
&НаКлиенте
Процедура Команда1(Префикс)
Префикс = ПолучитьПрефиксНомера();
КонецПроцедуры
Если такой общий модуль — неглобальный (например, РаботаСДокументами), то при обращении к процедуре ее имя нужно указывать через точку от имени модуля (листинг 5.13).
Листинг 5.13. Модуль формы
&НаКлиенте
Процедура КоличествоПриИзменении(Элемент)
РаботаСДокументами.РассчитатьСумму(СтрокаТабличнойЧасти);
КонецПроцедуры
Второй способ предпочтительнее, так как неглобальные общие модули компилируются по мере обращения к ним, а не при запуске системы, как глобальные.
Естественно, при этом нужно обеспечивать согласованность того, как описана процедура в модуле формы (&НаКлиенте, &НаСервере и т. д.), и того, какие флажки проставлены у общего модуля (клиент (управляемое приложение), сервер и т. д.).
- Экспортируемые переменные, процедуры и функции модуля управляемого приложения.
Если в модуле приложения определена экспортная процедура ТестовоеСообщение() (листинг 5.14), то в модуле формы можно обращаться к ней по имени (листинг 5.15).
Листинг 5.14. Модуль приложения
Процедура ТестовоеСообщение() Экспорт
Сообщить("Тестовое сообщение");
КонецПроцедуры
Листинг 5.15. Модуль формы
&НаКлиенте
Процедура Команда1()
ТестовоеСообщение();
КонецПроцедуры