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