Зачем нужны общие модули
Общий модуль нужен для того, чтобы вынести код процедуры или функции в одно место, откуда в дальнейшем его можно будет вызывать. Например, есть процедура для расчета суммы строки:
Процедура РассчитатьСуммуСтроки(Строка)
Строка.СуммаСтроки = Строка.КоличествоСтроки * Строка.ЦенаСтроки;
КонецПроцедуры
Если в конфигурации есть несколько видов документов с табличной частью, то данную процедуру придется расположить в модуле формы каждого вида документа. Если в дальнейшем потребуется внести изменения в эту процедуру, то придется сделать это несколько раз, в модуле формы каждого вида документа.
В этом случае целесообразно вынести данную процедуру в общий модуль, добавить ключевое слово Экспорт, чтобы данная процедура была доступна из других модулей и вызывать ее из модуля формы:
//обработчик вызываемый при изменении количества в строке табличной части
Процедура ТабЧастьКолвоПриИзменении(Элемент)
Строка = Элементы.ТабЧасть.ТекущиеДанные();
ОбщийМодуль1.РассчитатьСуммуСтроки(Строка);
КонецПроцедуры
Вызов общего модуля
Вызов общего модуля выполняется через имя общего модуля. После имени общего модуля нужно указать точку, а потом имя метода. Метод должен быть экспортным, иначе при вызове возникнет ошибка «Метод объекта не обнаружен».
Для примера добавим в конфигурацию новый общий модуль. Общие модули расположены в узле Общие - Общие модули:
В свойствах общего модуля установим флаг Клиент:
В самом модуле добавим следующий код:
Процедура ТестОдин() Экспорт
КонецПроцедуры
Процедура ТестДва()
КонецПроцедуры
В модуле обработки вызовем оба метода общего модуля:
&НаКлиенте
Процедура КомандаОдин(Команда)
ОбщийМодуль1.ТестОдин();
ОбщийМодуль1.ТестДва();
КонецПроцедуры
Вызов метода ТестОдин отработает корректно, а при вызове метода ТестДва возникнет ошибка «Метод объекта не обнаружен», потому что у процедуры нет ключевого слова Экспорт.
Переменные в общем модуле могут быть только внутри методов. Нельзя создать переменную, доступную во всем модуле или через свойства модуля.
Клиентский общий модуль
Если в свойствах общего модуля установлен только флаг Клиент, то к методам такого модуля можно будет обращаться только на клиенте. Из самого общего модуля можно выполнять вызов экспортных методов модуля приложения.
Серверный общий модуль
Если установлен только флаг Сервер, то к методам такого модуля можно будет обращаться только на сервер.
Вызов сервера
При установленных двух флагах Сервер и Вызов сервера к методам модуля можно обращаться как на клиенте, так и на сервере. Но само выполнение методов будет выполнено на сервере.
Клиент-серверный общий модуль
У такого общего модуля в свойствах нужно установить и флаг Клиент и флаг Сервер.
Чтобы при компиляции такого общего модуля не было ошибок нужно с помощью инструкций препроцессора разделить процедуры на клиентские и серверные:
#Если Клиент Тогда
//скомпилируется только на клиенте
Процедура ТестОдин() Экспорт
ПоказатьПредупреждение(, "Только на клиенте");
КонецПроцедуры
#КонецЕсли
#Если Сервер Тогда
//скомпилируется только на сервере
Процедура ТестДва() Экспорт
НовыйСпр = Справочники.Товары.СоздатьЭлемент();
КонецПроцедуры
#КонецЕсли
Вызывать серверные методы общего модуля можно только на сервере:
&НаКлиенте
Процедура Команда1(Команда)
ОбщийМодуль1.ТестОдин();
//чтобы вызвать серверный метод нужно перейти на сервер
Команда1НаСервере()
КонецПроцедуры
&НаСервере
Процедура Команда1НаСервере()
//теперь можно вызывать
ОбщийМодуль1.ТестДва();
КонецПроцедуры
Глобальный общий модуль
Если в свойствах модуля поставить флаг Глобальный, то для вызова методов общего модуля не нужно указывать имя общего модуля.
//процедура общего модуля
Процедура ТестОдин() Экспорт
ПоказатьПредупреждение(, "Глобальный");
КонецПроцедуры
//процедура модуля формы
&НаКлиенте
Процедура КомандаОдин(Команда)
ТестОдин();
КонецПроцедуры
Глобальные общие модули будут скомпилированы при запуске конфигурации.
Привилегированный общий модуль
Общий модуль с таким флагом всегда выполняется без проверки прав доступа. Такой общий модуль может быть только серверным.
Повторное использование возвращаемых значений
Использование данного свойства позволяет сохранять в кеше параметры и результат функций. Работает только для функций в неглобальных общих модулях.
При первом вызове такой функции она будет выполнена как обычно. После выполнения значения параметров и результат будут сохранены в кеше. Если снова обратиться к такой функции с теми же значениями параметров, то результат будет сразу взят из кеша, без выполнения тела функции.
Есть два варианта повторного использования возвращаемых значений:
* На время вызова - в этом случае кеширование выполняется только на время одного серверного вызова или вызова клиентского кода из интерфейса. Если в течении одного вызова несколько раз вызвать функцию с теми же параметрами, то функция будет выполнена только в первый раз, а потом результат будет взят из кеша.
* На время сеанса - значения сохраняются до конца сеанса пользователя.
Кешированный результат выполнения может быть удален в нескольких случаях:
*Если в рабочем процессе сервера 1С не хватает оперативной памяти
*Рабочий процесс был перезапущен
*Клиент был переключен на другой рабочий процесс
*Прошло 20 минут после сохранения или 6 минут после последнего использования
*Если вызвать метод ОбновитьПовторноИспользуемыеЗначения
Если выполнить вызов функции общего модуля с повторным использованием возвращаемых значений из самого общего модуля и не указать до имени функции имя общего модуля, то функция будет выполнена как в первый раз.
Для сохранения в кеше и повторного использования можно использовать параметры следующих типов:
*Дата
*Булево
*Строка
*Число
*Неопределено
*Null
*Ссылка
*Структура, только со значениями примитивных типов или ссылок.
Смотрите также:
Электронный учебник по по программированию в 1С Рекомендации по изучению программирования 1С с нуля Программное решение для сдачи и подготовки к экзаменам Программирование в 1С 8.3 с нуля - краткий самоучитель Комплексная подготовка программистов 1С:Предприятие 8.2 Сайты с уроками программирования и со справочниками Youtube-каналы с уроками программирования Сайты для обучения программированию Лекции и уроки