Контексты встроенного языка

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

Наиболее крупными контекстами являются клиентский контекст и серверный контекст. Причина их существования заключается в том, что в самом общем случае прикладные решения работают в клиент-серверном варианте.

В этом варианте работы пользователь взаимодействует с клиентским приложением. В клиентском приложении в определенные моменты времени (события) выполняется программный код, написанный в модулях. Этот код исполняется в клиентском контексте.

Клиентское приложение, в свою очередь, взаимодействует с кластером серверов «1С:Предприятия 8». В кластере серверов также, в определенные моменты времени (события) или в определенной ситуации (вызов серверного метода), выполняется программный код, написанный в модулях. Этот код исполняется в серверном контексте.

Так как система программ «1С:Предприятие 8» позволяет работать с прикладными решениями через Интернет, клиентское приложение и кластер серверов могут находиться и исполняться не просто на разных компьютерах, а в разных городах, странах, частях света.

Конечно, в более простых случаях клиентское приложение и кластер серверов могут находиться на одном компьютере, или кластер серверов может вообще не использоваться (в файловом варианте работы). Но это не влияет на то, как пишутся модули: они пишутся один раз и сразу для работы в самом общем, клиент-серверном варианте. А если в реальной ситуации используется более простой вариант развертывания системы, то платформа просто эмулирует нужные контексты при выполнении тех или иных модулей.

Условия, в которых исполняется код клиентских приложений, значительно отличаются от условий, в которых исполняется код кластера серверов. Например, там, где есть клиентское приложение, там есть пользователь, есть возможность интерактивного взаимодействия с ним. Для этого встроенный язык может использовать большой набор интерфейсных типов, которые входят в клиентский контекст.

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

Самое очевидное место, где вы можете увидеть использование клиентского и серверного контекстов – это модули форм. Эти модули могут исполняться и клиентскими приложениями и кластером серверов. Поэтому, как правило, перед каждым методом таких модулей указана директива компиляции. Она определяет, в каком контексте будет существовать этот метод в этом модуле:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

Директива &НаСервере значит, что эта процедура будет существовать в модуле, когда он исполняется на сервере. Когда он исполняется на клиенте, в нем этой процедуры не будет.

&НаКлиенте
Процедура КомандаОткрыть(Команда)

Директива &НаКлиенте значит, что эта процедура будет существовать в модуле, когда он исполняется на клиенте. Когда он исполняется на сервере, в нем этой процедуры не будет.

Помимо клиентского и серверного контекстов существуют и более «узкие» контексты. Это связано с тем, что клиентских приложений существует несколько (тонкий клиент, веб-клиент, толстый клиент, мобильный клиент), а серверная часть бывает не только у «настольных» приложений, но и у мобильных. Каждое из клиентских приложений, каждая серверная часть имеют свои особенности исполнения программного кода, имеют свой контекст. Эти контексты вы можете увидеть в синтакс-помощнике, в описании всех типов, их методов, свойств и событий. Они перечисляются в разделе Доступность.

Например, для типа HTTPСервисЗапрос указано:

Доступность: Сервер, толстый клиент.

Это значит, что тип HTTPСервисЗапрос вы можете использовать в серверном контексте, а также и в клиентском, но только тогда, когда работает толстый клиент. Если вы попробуете исполнить этот же код в тонком клиенте, вы получите ошибку, т. к. в контексте тонкого клиента этот тип отсутствует.

Для типа Массив указано:

Доступность: Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент,
внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер).

Это значит, что тип Массив вы можете использовать практически во всех клиентских и серверных контекстах. В том числе и на мобильных устройствах.