Общий модуль в 1С 8.3

Mar 27, 2022 20:54

Зачем нужны общие модули

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

Процедура РассчитатьСуммуСтроки(Строка)
Строка.СуммаСтроки = Строка.КоличествоСтроки * Строка.ЦенаСтроки;
КонецПроцедуры

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

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

//обработчик вызываемый при изменении количества в строке табличной части
Процедура ТабЧастьКолвоПриИзменении(Элемент)
Строка = Элементы.ТабЧасть.ТекущиеДанные();
ОбщийМодуль1.РассчитатьСуммуСтроки(Строка);
КонецПроцедуры

Вызов общего модуля

Вызов общего модуля выполняется через имя общего модуля. После имени общего модуля нужно указать точку, а потом имя метода. Метод должен быть экспортным, иначе при вызове возникнет ошибка «Метод объекта не обнаружен».

Для примера добавим в конфигурацию новый общий модуль. Общие модули расположены в узле Общие - Общие модули:

В свойствах общего модуля установим флаг Клиент:

В самом модуле добавим следующий код:

Процедура ТестОдин() Экспорт

КонецПроцедуры

Процедура ТестДва()

КонецПроцедуры

В модуле обработки вызовем оба метода общего модуля:

&НаКлиенте
Процедура КомандаОдин(Команда)
ОбщийМодуль1.ТестОдин();
ОбщийМодуль1.ТестДва();
КонецПроцедуры

Вызов метода ТестОдин отработает корректно, а при вызове метода ТестДва возникнет ошибка «Метод объекта не обнаружен», потому что у процедуры нет ключевого слова Экспорт.

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

Клиентский общий модуль

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

Серверный общий модуль

Если установлен только флаг Сервер, то к методам такого модуля можно будет обращаться только на сервер.

Вызов сервера

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

Клиент-серверный общий модуль

У такого общего модуля в свойствах нужно установить и флаг Клиент и флаг Сервер.

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

#Если Клиент Тогда
//скомпилируется только на клиенте
Процедура ТестОдин() Экспорт
ПоказатьПредупреждение(, "Только на клиенте");
КонецПроцедуры
#КонецЕсли

#Если Сервер Тогда
//скомпилируется только на сервере
Процедура ТестДва() Экспорт
НовыйСпр = Справочники.Товары.СоздатьЭлемент();
КонецПроцедуры
#КонецЕсли

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

&НаКлиенте
Процедура Команда1(Команда)
ОбщийМодуль1.ТестОдин();
//чтобы вызвать серверный метод нужно перейти на сервер
Команда1НаСервере()
КонецПроцедуры

&НаСервере
Процедура Команда1НаСервере()
//теперь можно вызывать
ОбщийМодуль1.ТестДва();
КонецПроцедуры

Глобальный общий модуль

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

//процедура общего модуля
Процедура ТестОдин() Экспорт
ПоказатьПредупреждение(, "Глобальный");
КонецПроцедуры

//процедура модуля формы
&НаКлиенте
Процедура КомандаОдин(Команда)
ТестОдин();
КонецПроцедуры

Глобальные общие модули будут скомпилированы при запуске конфигурации.

Привилегированный общий модуль

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

Повторное использование возвращаемых значений

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

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

Есть два варианта повторного использования возвращаемых значений:

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

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

*Если в рабочем процессе сервера 1С не хватает оперативной памяти
*Рабочий процесс был перезапущен
*Клиент был переключен на другой рабочий процесс
*Прошло 20 минут после сохранения или 6 минут после последнего использования
*Если вызвать метод ОбновитьПовторноИспользуемыеЗначения

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

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

*Дата
*Булево
*Строка
*Число
*Неопределено
*Null
*Ссылка
*Структура, только со значениями примитивных типов или ссылок.

Смотрите также:
Электронный учебник по по программированию в 1С
Рекомендации по изучению программирования 1С с нуля
Программное решение для сдачи и подготовки к экзаменам
Программирование в 1С 8.3 с нуля - краткий самоучитель
Комплексная подготовка программистов 1С:Предприятие 8.2
Сайты с уроками программирования и со справочниками
Youtube-каналы с уроками программирования
Сайты для обучения программированию
Лекции и уроки

#Если, программирование, #КонецЕсли

Previous post Next post
Up