О чем эта статья
Эта статья продолжает цикл «Первые шаги в разработке на 1С», в ней рассмотрены следующие вопросы:
- Что такое контекст и почему его важно определять при написании программного кода?
- Чем образуется глобальный контекст? Как научиться определять, что к нему относится?
- Чем отличаются клиентский и серверный контекст? В чем тут вся соль?
Применимость
В статье рассматривается платформа «1C:Предприятие» 8.3.4.496. Материал актуален и для текущих релизов платформы.
Понятие контекста программного кода
Контекст – это определенное окружение доступных свойств и методов в данном конкретном программном модуле, в данной конкретной строке.
Т.е. это те процедуры и функции, те свойства и методы, которые доступны в данной конкретной точке.
В другой точке контекст может измениться. Даже в одном модуле в разных процедурах может быть совершенно разный контекст.
Именно поэтому важно представлять контекст данной точки, где мы ведем разработку, чтобы понимать: какие свойства и методы мы можем использовать.
Выделяют несколько видов контекста. Во-первых, контекст глобальный, который доступен в любой точке конфигурации (в принципе, нужно еще делить контекст на Сервер и на Клиент).
Глобальный контекст доступен во всех местах конфигурации.
Глобальный контекст образуется прежде всего процедурами и функциями глобального контекста Платформы.
В синтакс-помощнике есть отдельная ветка “Глобальный контекст”, в которой видно, что существуют различные функции, которые будут доступны при вызове.
Конечно же, в глобальный контекст также входят и встроенные функции работы со строкой, числом, датой и т.д. Все это тоже образует глобальный контекст.
Обратите внимание, что существуют не только методы глобального контекста, но и свойства. К ним можно обращаться.
Также в глобальный контекст входят системные перечисления и системные значения.
Например, перечисление ОбходРезультатаЗапроса имеет три фиксированных значения. Мы можем обращаться к этому перечислению в любой точке конфигурации.
Системные наборы имеют похожее назначение с перечислениями. Указывается набор значений и выбор одного из значений.
Кроме того, в глобальный контекст также входят экспортные методы общих модулей. Существуют модули для описания общих алгоритмов, и некоторые их методы можно делать экспортными, тогда они могут вызываться из других программных модулей.
Помимо Глобального контекста существует локальный контекст модуля. Это в конкретном модуле какие существуют переменные, процедуры и функции.
Если спуститься еще на уровень ниже, существует локальный контекст процедуры. В процедуре можно объявлять свои собственные переменные.
В модуле, например, могут существовать две переменные с одинаковым названием: одна объявлена на уровне контекста модуля, а вторая на уровне самой процедуры. Это две разные переменные.
Контекст – это первое, на что нужно обращать внимание при написании программного кода. На контекст влияет то, где процедура скомпилирована.
Контекст выполнения программного кода в платформе 8.3 может делиться на Клиентский и Серверный. По сути это означает, что программный код выполняется либо на стороне клиентской машины, либо на стороне Сервера приложений.
Всякий раз, когда мы пишем программный код на 8.3, нам нужно думать, где этот код должен выполняться: на стороне Клиента или на стороне Сервера. На Клиенте существуют свои поддерживаемые типы данных, а на Сервере – свои.
Существуют типы данных, которые поддерживаются и на Клиенте и на Сервере (т.е. их можно спокойно использовать в любом программном коде).
Важно понимать, что программный код, который скомпилирован на Клиенте, является независимым от программного кода, который скомпилирован на Сервере. Если речь идет о Клиенте, то в основном это какие-то легкие действия.
Например, показ какого-то диалогового сообщения, задание вопроса пользователю. На клиенте можно использовать лишь ограниченное количество типов данных.
Клиент – это обычно слабая по мощности машина, поэтому нагружать его не стоит. На Сервере же должны выполняться обработки различных данных.
Важно понимать, какое возможно взаимодействие между Клиентом и Сервером.
Существует возможность из процедур клиентских обращаться к процедурам серверным. Система, после обработки соответствующего серверного кода вернет управление назад на точку вызова.
Следует обратить внимание, что обратный вызов невозможен, т.е. со стороны Сервера клиентский метод мы вызвать не можем ни при каких условиях.
Клиентские процедуры могут вызывать как другие клиентские процедуры, так и серверные процедуры.
Таким образом, при разработке в Платформе 1С:Предприятие 8.3 важно понимать, где будет скомпилирована процедура: на Клиенте или на Сервере, поскольку от этого будет зависеть текущий контекст модуля.
Если в модуле могут присутствовать как те, так и другие процедуры (например, модуль управляемой формы), то при создании процедуры необходимо указывать, где она будет скомпилирована: на Сервере или на Клиенте.
Для этого есть определенные директивы, которые четко указывают, где будет использоваться данная процедура. Исходя из этого в процедуре будут доступны соответствующие типы данных.
Ниже представлены примеры клиентской и серверной процедуры модуля формы.
Когда мы описываем некую переменную, то мы также должны указывать (как для процедуры или функции место компиляции), где эта переменная будет находиться: на Клиенте или на Сервере.
Т.е. если указать, что переменная будет доступна на Сервере, то ее можно будет использовать в серверных процедурах.
В целях оптимизации кода следует в большинстве случаев с Клиента обращаться к контексту &НаСервереБезКонтекста, а не к контексту &НаСервере.
Дело в том, что при втором варианте на Сервер передаются еще все данные формы.
Обратите внимание, что для каждого объекта в синтакс-помощнике указывается доступность данного свойства или метода (сервер, тонкий клиент, толстый клиент, внешнее соединение).
В заключение отметим, что уже после публикации выше представленного материала у нас появилась новая статья, которую мы, прямо настоятельно рекомендуем прочитать сейчас, пока мы не перешли к следующей теме! Маст хэв для любого, кто хочет разобраться «на пальцах» во всей этой кухне клиент-серверного взаимодействия.
Ну а мы идем дальше, и теперь, когда базовые понятия о контексте уже получены, вспоминаем, где мы писали весь наш программный код? Как правило, в одном модуле – модуле формы. А какие-то другие модули еще существуют? Конечно, существуют, и в следующей статье мы все подробно разъясним. :)
PDF-версия статьи для участников группы ВКонтакте
Мы ведем группу ВКонтакте – http://vk.com/kursypo1c.
Если Вы еще не вступили в группу – сделайте это сейчас и в блоке ниже (на этой странице) появятся ссылка на скачивание материалов.
Статья в PDF-формате
Вы можете скачать эту статью в формате PDF по следующей ссылке:
Ссылка доступна для зарегистрированных пользователей)
Ссылка доступна для зарегистрированных пользователей)
Ссылка доступна для зарегистрированных пользователей)
Ссылка доступна для зарегистрированных пользователей)
Правильно ли понимаю, что когда идет речь о контексте выполнения программного кода на клиенте или на сервере, то эти высказывания относится не к платформе 8.3, а относится к Управляемому приложению в котором работает платформа?
Спасибо.
Правильнее сказать так:
1. Часть программного кода конфигурации выполняется платформой на стороне клиента
2. Часть кода конфигурации выполняется на серверной стороне
3. Платформа 1С содержит серверную и клиентскую части.
Напомню, что в случае использования файлового режима работы ИБ серверная часть платформы эмулируется.
Спасибо за статью!
Вот везде пишут, как Вы: “Клиент – это обычно слабая по мощности машина, поэтому нагружать его не стоит. На Сервере же должны выполняться обработки различных данных.”
Достаточно много организаций работают с базой в файловом варианте, зачастую на своем ноутбуке. То есть у них совмещается аппаратная часть “клиента” и “сервера”. Не знаете ли Вы, происходит ли потеря производительности в таком случае?
Для небольших баз можно использовать файловый вариант. Но тема статьи несколько иная.
Доброе время суток.
А чем контекст отличается от понятия Глобальных и Локальных переменных/процедур/функций и т.д., зачем было вводить ещё одну сущность?
Добрый день!
Контекст – это общее понятие, означающее окружение.
Используется в программировании в целом, не только в 1С.
Все полезно.
“Контекст – это определенное окружение…” – возможно, уточнить редакцию.
Добрый день! Самое простое определение “контекст – набор доступных свойств, методов и событий в данной конкретной точке”. Что Вы понимаете под “редакцией”. Если у Вас есть что добавить, пожалуйста добавьте.
Для новичков очень полезно, т.к. введение такой простой в понимании вещи как контекста в 1С-8.2 привело к глобальному пересмотру методологии программирования на языке платформы 1С-Предприятие.
Я-бы ещё добавил один момент: в целях оптимизации кода следует по возможности чаще с клиента обращаться к контексту &НаСервереБезКонтекста чем к контексту &НаСервере (второй вариант отличается от первого тем, что при его вызове все данные формы неявно передаются на сервер).
Да, все верно, спасибо.