Перейти к содержимому

❓ 6.4 В общих модулях

ИТС: Руководство разработчика — 5.5.2. Общие модули — https://its.1c.ru/db/v8327doc#bookmark:dev:TI000000179


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

Общий модуль может содержать только определения процедур и функций:

  • раздела определения переменных в нём нет
  • раздела основной программы в нём нет
НастройкаЧто она определяет
ЭкспортДоступен ли метод за пределами общего модуля
ГлобальныйКак обращаться к экспортируемому методу
Клиент (обычное приложение), Клиент (управляемое приложение),Сервер, Внешнее соединениеВ каких контекстах компилируется и выполняется модуль
Вызов сервераМожет ли клиентский код вызвать экспортируемый метод серверного общего модуля
ПривилегированныйВыполняется ли код без контроля прав доступа

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

Процедура ОбновитьДанные() Экспорт
// Код процедуры
КонецПроцедуры

Метод без Экспорт доступен только внутри этого общего модуля.


Свойство Глобальный определяет способ обращения к экспортируемым методам.

Экспортируемые методы доступны непосредственно как методы глобального контекста:

ОбновитьДанные();

В глобальном контексте создаётся доступное только для чтения свойство с именем общего модуля.

Метод вызывается через имя модуля:

РаботаСТорговымОборудованием.ПодключитьСканерШтрихкодов();

Общая схема вызова:

ИмяОбщегоМодуля.ИмяЭкспортируемогоМетода()

Свойство Глобальный определяет способ обращения к методу, но не место его выполнения.


Контекстные свойства определяют, где будут доступны методы общего модуля.

СвойствоГде доступны методы
Клиент (обычное приложение)Толстый клиент в режиме обычного приложения
Клиент (управляемое приложение)Тонкий клиент, веб-клиент и толстый клиент в режиме управляемого приложения
СерверСервер
Внешнее соединениеВнешнее соединение

Можно установить несколько контекстных свойств одновременно.

Например:

Клиент (управляемое приложение) = Истина
Сервер = Истина

Для такого модуля платформа создаёт отдельные варианты скомпилированного кода:

Вызов со стороны клиента → используется клиентский вариант
Вызов со стороны сервера → используется серверный вариант

Таким образом, один общий модуль может иметь несколько вариантов скомпилированного кода для разных контекстов.


Если общий модуль компилируется для нескольких контекстов, инструкции препроцессора позволяют включать в каждый вариант только подходящий код.

Процедура МетодОбщегоМодуля() Экспорт
// Код для всех контекстов
#Если ТонкийКлиент Тогда
ПоказатьОповещениеПользователя("На клиенте");
#КонецЕсли
КонецПроцедуры

В результате:

Тонкий клиент → общий код + код внутри #Если ТонкийКлиент
Сервер → только общий код

Так можно отделить интерактивный клиентский код от кода, выполняемого на сервере.

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


Для выполнения кода на сервере из клиентского кода можно:

  • вызвать экспортируемый метод серверного общего модуля
  • вызвать в модуле формы или команды метод с директивой &НаСервере
  • вызвать метод с директивой &НаСервереБезКонтекста

Из серверного кода нельзя вызвать методы клиентского общего модуля, если у него не установлено свойство Сервер.

После завершения внешнего серверного вызова управление возвращается на клиент.


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

Клиентский код может вызвать экспортируемый метод серверного общего модуля:

Клиентский код
экспортируемый метод общего модуля
выполнение на сервере
РаботаСДаннымиСервер.ОбновитьДанные();

Для такого вызова необходимо:

  • свойство общего модуля Сервер
  • свойство Вызов сервера
  • ключевое слово Экспорт у вызываемого метода

Экспортируемые методы серверного общего модуля можно вызывать только из серверных методов:

  • серверных общих модулей
  • серверных методов модулей форм
  • серверных методов модулей команд

Из клиентского кода такие методы непосредственно недоступны.

Документация рекомендует устанавливать Вызов сервера = Ложь, если методы серверного общего модуля нежелательно вызывать с клиента, например по соображениям безопасности.

Если одновременно установлены все три свойства:

  • Клиент (обычное приложение)
  • Клиент (управляемое приложение)
  • Внешнее соединение

то свойство Вызов сервера автоматически сбрасывается.

Если при одновременно установленных этих трёх свойствах включить Вызов сервера, платформа автоматически сбросит:

  • Клиент (обычное приложение)
  • Клиент (управляемое приложение)
  • Внешнее соединение

Это правило относится именно к одновременному сочетанию всех трёх перечисленных свойств.


Свойство Привилегированный отключает контроль прав доступа при выполнении методов общего модуля.

При его установке платформа:

  • автоматически устанавливает Сервер
  • сбрасывает Клиент (обычное приложение)
  • сбрасывает Клиент (управляемое приложение)
  • сбрасывает Внешнее соединение
Привилегированный общий модуль
выполнение только на сервере
без контроля прав доступа

Привилегированный общий модуль может выполняться только на сервере.

При работе с общим модулем нужно последовательно определить:

  1. Какие методы доступны извне — Экспорт.
  2. Как к ним обращаться — свойство Глобальный.
  3. В каких контекстах компилируется модуль — клиентские свойства, Сервер и Внешнее соединение.
  4. Может ли клиент вызвать серверный метод — Вызов сервера.
  5. Проверяются ли права пользователя — Привилегированный.

Если общий модуль доступен в нескольких контекстах, платформа создаёт для него отдельные варианты скомпилированного кода. При вызове используется вариант, соответствующий контексту вызывающего кода.