6.4 В общих модулях
❓ 6.4 В общих модулях
📚 Документация
Заголовок раздела «📚 Документация»ИТС: Руководство разработчика — 5.5.2. Общие модули — https://its.1c.ru/db/v8327doc#bookmark:dev:TI000000179
🧠 Краткая теория
Заголовок раздела «🧠 Краткая теория»Общие модули предназначены для размещения процедур и функций, которые могут использоваться в других модулях конфигурации.
Общий модуль может содержать только определения процедур и функций:
- раздела определения переменных в нём нет
- раздела основной программы в нём нет
Что определяют настройки общего модуля
Заголовок раздела «Что определяют настройки общего модуля»| Настройка | Что она определяет |
|---|---|
Экспорт | Доступен ли метод за пределами общего модуля |
Глобальный | Как обращаться к экспортируемому методу |
Клиент (обычное приложение), Клиент (управляемое приложение),Сервер, Внешнее соединение | В каких контекстах компилируется и выполняется модуль |
Вызов сервера | Может ли клиентский код вызвать экспортируемый метод серверного общего модуля |
Привилегированный | Выполняется ли код без контроля прав доступа |
Экспортируемые методы
Заголовок раздела «Экспортируемые методы»Процедуры и функции, которые должны вызываться из других модулей, объявляются с ключевым словом Экспорт.
Процедура ОбновитьДанные() Экспорт
// Код процедуры
КонецПроцедурыМетод без Экспорт доступен только внутри этого общего модуля.
Свойство Глобальный
Заголовок раздела «Свойство Глобальный»Свойство Глобальный определяет способ обращения к экспортируемым методам.
Глобальный = Истина
Заголовок раздела «Глобальный = Истина»Экспортируемые методы доступны непосредственно как методы глобального контекста:
ОбновитьДанные();Глобальный = Ложь
Заголовок раздела «Глобальный = Ложь»В глобальном контексте создаётся доступное только для чтения свойство с именем общего модуля.
Метод вызывается через имя модуля:
РаботаСТорговымОборудованием.ПодключитьСканерШтрихкодов();Общая схема вызова:
ИмяОбщегоМодуля.ИмяЭкспортируемогоМетода()Свойство Глобальный определяет способ обращения к методу, но не место его выполнения.
Контексты выполнения
Заголовок раздела «Контексты выполнения»Контекстные свойства определяют, где будут доступны методы общего модуля.
| Свойство | Где доступны методы |
|---|---|
Клиент (обычное приложение) | Толстый клиент в режиме обычного приложения |
Клиент (управляемое приложение) | Тонкий клиент, веб-клиент и толстый клиент в режиме управляемого приложения |
Сервер | Сервер |
Внешнее соединение | Внешнее соединение |
Можно установить несколько контекстных свойств одновременно.
Например:
Клиент (управляемое приложение) = ИстинаСервер = ИстинаДля такого модуля платформа создаёт отдельные варианты скомпилированного кода:
Вызов со стороны клиента → используется клиентский вариантВызов со стороны сервера → используется серверный вариантТаким образом, один общий модуль может иметь несколько вариантов скомпилированного кода для разных контекстов.
Инструкции препроцессора
Заголовок раздела «Инструкции препроцессора»Если общий модуль компилируется для нескольких контекстов, инструкции препроцессора позволяют включать в каждый вариант только подходящий код.
Процедура МетодОбщегоМодуля() Экспорт
// Код для всех контекстов
#Если ТонкийКлиент Тогда ПоказатьОповещениеПользователя("На клиенте");#КонецЕсли
КонецПроцедурыВ результате:
Тонкий клиент → общий код + код внутри #Если ТонкийКлиентСервер → только общий кодТак можно отделить интерактивный клиентский код от кода, выполняемого на сервере.
Если общий модуль доступен для нескольких видов клиентов, его код должен учитывать ограничения каждого из них. Специфичные участки также разделяются инструкциями препроцессора.
Передача управления с клиента на сервер
Заголовок раздела «Передача управления с клиента на сервер»Для выполнения кода на сервере из клиентского кода можно:
- вызвать экспортируемый метод серверного общего модуля
- вызвать в модуле формы или команды метод с директивой
&НаСервере - вызвать метод с директивой
&НаСервереБезКонтекста
Из серверного кода нельзя вызвать методы клиентского общего модуля, если у него не установлено свойство Сервер.
После завершения внешнего серверного вызова управление возвращается на клиент.
Свойство Вызов сервера
Заголовок раздела «Свойство Вызов сервера»Свойство Вызов сервера управляет доступностью экспортируемых методов серверного общего модуля для клиентского кода.
Вызов сервера = Истина
Заголовок раздела «Вызов сервера = Истина»Клиентский код может вызвать экспортируемый метод серверного общего модуля:
Клиентский код ↓экспортируемый метод общего модуля ↓выполнение на сервереРаботаСДаннымиСервер.ОбновитьДанные();Для такого вызова необходимо:
- свойство общего модуля
Сервер - свойство
Вызов сервера - ключевое слово
Экспорту вызываемого метода
Вызов сервера = Ложь
Заголовок раздела «Вызов сервера = Ложь»Экспортируемые методы серверного общего модуля можно вызывать только из серверных методов:
- серверных общих модулей
- серверных методов модулей форм
- серверных методов модулей команд
Из клиентского кода такие методы непосредственно недоступны.
Документация рекомендует устанавливать Вызов сервера = Ложь, если методы серверного общего модуля нежелательно вызывать с клиента, например по соображениям безопасности.
Взаимодействие свойств
Заголовок раздела «Взаимодействие свойств»Если одновременно установлены все три свойства:
Клиент (обычное приложение)Клиент (управляемое приложение)Внешнее соединение
то свойство Вызов сервера автоматически сбрасывается.
Если при одновременно установленных этих трёх свойствах включить Вызов сервера, платформа автоматически сбросит:
Клиент (обычное приложение)Клиент (управляемое приложение)Внешнее соединение
Это правило относится именно к одновременному сочетанию всех трёх перечисленных свойств.
Свойство Привилегированный
Заголовок раздела «Свойство Привилегированный»Свойство Привилегированный отключает контроль прав доступа при выполнении методов общего модуля.
При его установке платформа:
- автоматически устанавливает
Сервер - сбрасывает
Клиент (обычное приложение) - сбрасывает
Клиент (управляемое приложение) - сбрасывает
Внешнее соединение
Привилегированный общий модуль ↓выполнение только на сервере ↓без контроля прав доступаПривилегированный общий модуль может выполняться только на сервере.
🧠 Ключевая мысль
Заголовок раздела «🧠 Ключевая мысль»При работе с общим модулем нужно последовательно определить:
- Какие методы доступны извне —
Экспорт. - Как к ним обращаться — свойство
Глобальный. - В каких контекстах компилируется модуль — клиентские свойства,
СервериВнешнее соединение. - Может ли клиент вызвать серверный метод —
Вызов сервера. - Проверяются ли права пользователя —
Привилегированный.
Если общий модуль доступен в нескольких контекстах, платформа создаёт для него отдельные варианты скомпилированного кода. При вызове используется вариант, соответствующий контексту вызывающего кода.