В новых версиях конфигураций системы 1С:Предприятие многие функции и процедуры переместились из модулей объектов (документов, справочников и т.д.) в модули менеджера. Рассмотрим различия между этими двумя модулями.

Согласно теории объектно-ориентированного программирования, методы объектов делятся на две группы: статические и простые. Простые методы имеют доступ только к конкретному экземпляру класса. Статические методы не имеют доступа к данным объектов, а работают с классом в целом.

Если перевести все это в термины системы 1С:Предприятие, то Модуль объекта содержит простые методы. Для их использования необходимо сначала получить конкретный объект: элемент справочника, документа и т.п. Модуль менеджера содержит статические методы. Для его использования нет необходимости отдельно получать каждый конкретный объект, он позволяет работать со всей коллекцией сразу.

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

Функция НоваяФункция () Экспорт

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



Пер= Объект. НоваяФункция() ;

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

Перем НоваяПеременная Экспорт

ЭлементСправочника= Справочники. Номенклатура. НайтиПоКоду("000000001" ) ;
Объект= ЭлементСправочника. ПолучитьОбъект() ;
Объект. НоваяПеременная= ) ;

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

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

Процедура НоваяПроцедура () Экспорт

ЭлементСправочника= Справочники. Номенклатура. НоваяПроцедура() ;

Или для переменной:

Перем НоваяПеременная Экспорт

ЭлементСправочника= Справочники. Номенклатура. НоваяПеременная;

Рассмотрим отличия в применении модуля объекта и модуля менеджера на примере процедуры создания печатной формы документа.

При использовании модуля объекта код будет выглядеть следующим образом:

Функция ПечатьДокумента (Ссылка) Экспорт
//В эту функцию необходимо передать ссылку на конкретный документ
Возврат ТабДок;
КонецФункции

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

&НаКлиенте
Процедура Печать(Команда)
ТабДок = ПечатьНаСервере() ;
ТабДок. Показать() ;
КонецПроцедуры
&НаСервере
Функция ПечатьНаСервере()
Док = РеквизитФормыВЗначение("Объект" ) ;
Возврат Док. ПечатьДокумента(Объект. Ссылка) ;
КонецФункции

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

С точки зрения производительности гораздо лучше использовать модуль менеджера, когда это возможно. В нашем примере решение задачи будет выглядеть следующим образом.
Функция ПечатьНаСервере()
Возврат Документы. НашДокумент. ПечатьДокумента(МассивСсылок) ;
КонецФункции

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

Так когда же использовать модуль объекта, а когда модуль менеджера?

Все зависит от задачи. Если для ее выполнения достаточно ссылки на объект (например задача печати), то лучше использовать модуль менеджера. Если же стоит задача изменения данных, например заполнения документа, то необходимо его получить и использовать модуль объекта.

Программные модули в конфигурации не являются самостоятельными программами. Это связано с тем, что они только часть всей конфигурации задачи. Но нам и не нужно писать самостоятельные программы, надо только настраивать определенные алгоритмы функционирования системы. То есть программный модуль – это своего рода «контейнер» для размещения текстов процедур и функций, вызываемых системой только во время возникновения тех или иных событий, вызванных со стороны пользователя (значит» только в строго определенные моменты времени). Поэтому программный модуль не имеет формальных границ своего описания типа «начало модуля» – «конец модуля». Его границами фактически являются границы того текстового документа, в котором размещен модуль.

Место размещения программного модуля предоставляется Конфигураторомв тех местах конфигурации прикладной задачи, которые могут потребовать описания специфических алгоритмов функционирования. Важное следствие отсюда – мы не можем создавать какие-либо произвольные модули. Все алгоритмы следует оформлять в виде процедур или функций, которые будут вызваны системой в заранее предусмотренных ситуациях (например, при нажатии кнопки, при открытии формы документа, при вводе нового элемента справочника и т.д.).

Каждый отдельный программный модуль воспринимается системой как единое целое, поэтому все его процедуры и функции принадлежат единому контексту.

На рис. 3.1 показан пример программного модуля. Сразу видно, что в нем описаны процедуры, например, начало описания предопределенной процедуры ПриОткрытии(), также с первого взгляда заметны элементы работы с объектами (обращение к методам через точку). Стоит обратить внимание на закладки внизу окна, при их помощи можно выбирать режим работы с документом; работа с формой, программным модулем формы или таблицами.

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

Принято различать два контекста:

Глобальный контекст задачи;

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

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

Глобальный контекст составляют:

Значения системных атрибутов, общесистемные процедуры и функции;

Значения заданных в Конфигураторе констант, перечислений, регистров, видов расчета, групп видов расчета;

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

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

Локальный контекст любого программного модуля (кроме глобального) определяется тем местом в дереве метаданных, где расположен модуль. Важно обратить внимание на то, что каждый вид модуля (см. таблицу 3.1 ниже) предназначен для настройки, условно говоря, своего набора действий объекта в ответ на некоторые предопределенные события. Например, на рис. 3.1 был изображен модуль формы документа. Он обычно используется для вывода табличного представления документа на печать, организации взаимодействия формы документа с пользователем (т.е. обработки щелчков по кнопкам, обработки ввода новых строк в табличную часть документа и т.д.). Модуль проведения документа настраивает совершенно другие аспекты его работы. Он в общем случае предназначен для осуществления движений по счетам, регистрам учета и т.д.

Локальный контекст «виден» только определенному программному модулю и устанавливает для модуля набор непосредственно доступных ему значений агрегатных типов данных, а также их методов и атрибутов. Однако имеется возможность передачи контекста модуля как объекта в виде параметра при вызове процедур и функций. Контекст модуля определяет тот набор методов, которые являются доступными только в данном контексте. Например, на рис. 3.1 был дан краткий фрагмент модуля формы, в котором описывается процедура, выполняемая при открытии окна отдельно взятого документа. Другие модули работают с иными контекстами и выполняют иные функции.

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

Таблица 3.1 – Виды программных модулей 1С: Предприятие


Продолжение таблицы 3.1

Наименование модуля Расположение Запуск
Модуль формы элемента справочника Метаданные ® Справочник ® Форма Запускается при открытии формы элемента справочника
Модуль формы документа Метаданные ® Документ ®Форма Запускается при открытии формы документа
Модуль документа Метаданные ® Документ ® Модуль документа Запускается при проведении документа, при удалении проведенного документа из журнала, при снятии проведения, при выполнении архивации записей журнала расчетов, порожденных этим документом
Модуль формы журнала документов Метаданные ® Журнал документов ® Форма Запускается при открытии формы журнала документов
Модуль формы журнала расчетов Метаданные ® Журнал расчетов ® Форма Запускается при вызове формы журнала расчетов
Модуль формы списка счетов (плана счетов) Метаданные ® План счетов Запускается при вызове формы списка счетов
Модуль формы счета Метаданные ® Планы счетов ® Форма счета Запускается при открытии формы счета
Модуль формы журнала операций Метаданные ® Журнал операций ® Форма
Модуль формы операции Метаданные ® Операция Запускается при вызове формы журнала операций
Модуль формы журнала проводок Метаданные ® Журнал проводок ® Форма Запускается, при вызове формы журнала проводок
Модуль формы отчета Метаданные ® Отчет ® Форма Запускается при открытии диалоговой формы подготовки отчета
Модуль формы обработки Метаданные ® Обработка ® Форма Запускается при открытии диалоговой формы обработки
Модуль вида расчета Метаданные ® Вид расчета ® Модуль вида расчета Запускается при расчете соответствующих записей журнала расчетов

Из таблицы следует, что фактически существуют два типа модулей: модуль формы объекта и модуль объекта. Глобальный модуль уже был рассмотрен.

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

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


Модуль управляемого приложения

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

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

Модуль обычного приложения

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

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

Модуль внешнего соединения

Модуль внешнего соединения предназначен для обработки события входа (не интерактивного, а в режиме COM-соединения) и выхода из системы. Имеются соответствующие обработчики. При COM-соединении не происходит открытие интерактивного окна, поэтому функции для диалога с пользователем не сработают. В модуле возможно описывать экспортные переменные и методы. Модуль внешнего соединения компилируется на сервере. Т.е. возможно обращение к соответствующим объектам конфигурации, например к справочникам.

Модулем сеанса

Существует такой общий объект конфигурации как «Параметры сеанса». Модуль сеансов создан для инициализации параметров сеанса (для этого существует определенное событие, при запуске приложения оно стартует самое первое).

Запускается в привилегированном режиме (не выполняется проверка прав доступа при обращении к БД). Модуль сеанса компилируется на сервере. Нет раздела описания переменных и раздела основной программы, нельзя описывать экспортные методы, используется только для установки параметров сеанса. Как видно у модуля сеанса очень узкое предназначение.

Общие модули

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

В общих модулях доступен ТОЛЬКО раздел описания процедур и функций. Если необходимо использовать глобальную переменную то можно использовать, либо параметры сеанса, либо экспортную переменную модуля управляемого приложения.

В общем модуле можно задавать некоторые параметры, которые будут влиять на его поведение. Если в общем модуле установлена галочка «Глобальный» то его экспортные функции будут участвовать в формировании глобального контекста. И к ним можно будет обратиться из другого контекста напрямую (без упоминания имени общего модуля) : МетодОбщегоМодуля();

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

Модуль объекта

У многих объектов конфигурации (справочники, документы и т.д.) существует модуль объекта. В него можно вводить стандартные события, такие как создание нового элемента справочника, запись нового объекта, удаление, обработка проведения документа и т.д. Событие записи существует и в модуле формы (возникает в процессе интерактивной записи, когда пользователь нажимает на кнопку «записать») и в модуле объекта.

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

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

Модуль формы

Модуль формы предназначен для обработки действий пользователя (обработка события нажатия кнопки и т.д.). Так же существуют события связанные непосредственно с самой формой (например событие её открытия, закрытия). Модули управляемых и обычных форм различаются прежде всего тем, что модуль управляемой формы четко разделяется на контекст. Каждая процедура должна иметь директиву компиляции. В обычной форме весь код исполняется на клиенте.

Структура управляемой формы содержит раздел описания переменных, раздел процедур и функций и раздел основной программы (выполняется в момент инициализации формы). К стандартным событиям формы можем обратиться через список процедур и функций (Ctrl+Alt+P) либо в палитре свойств самой формы. Так же в управляемой форме можно обработать событие записи элемента (это событие присутствует только для объектов: справочников, документов).

Модуль менеджера объекта

Модуль менеджера появился только в 1С 8.2,существует у многих объектов конфигурации. Основное предназначение модуля менеджера объекта это переопределить стандартное событие «ОбработкаПолученияДанныхВыбора», а так же в нем можем

Модуль менеджера значений

У объекта конфигурации константы не существует модуля объекта, а существует очень похожий модуль – модуль менеджера значений. В модуле менеджера значения константы можно описать различные процедуры (в том числе и экспортные), а также обработать 3 события: ПередЗаписью, ПриЗаписи, ОбработкаПроверкиЗаполнения. Этот модуль компилируется на сервере.

Модули наборов записей

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

  • Перед записью
  • При записи
  • Обработка проверки заполнения

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

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

Понимание в различии их назначения позволяет писать более правильный по структуре программный код, а в некоторых случаях сэкономить ресурсы сервера 1С и увеличить производительность прикладного решения.

В статье рассмотрим принципиальные различия между этими модулями как с теоретической стороны, так и на конкретном практическом примере.

Теория

Обратимся к основам объектно-ориентированного программирования (ООП) и проведем аналогию с нашим примером. В ООП методы для объектов можно разделить на статические (static) и простые . Простые методы могут быть вызваны только для конкретного объекта, доступ к которому мы имеем в текущем контексте программного кода. Статические методы не имеют непосредственного доступа к данным объектов. Для обращения к объекту первоначально нужно создать его экзмемпляр. То же самое относится к платформе 1С:Предприятие 8.x.

В модуле объекта платформа хранит процедуры и функции, которые могут быть вызваны только при работе с конкретным объектом, например, с объектом элемента справочника "Номенклатура". В модуле менеджера содержатся процедуры и функции, которые могут быть применены ко всем объектам данного типа, но с первоначальным созданием экземпляра этого объекта. То есть для изменения элемента номенклатуры из этого модуля первоначально для ссылки на элемент выполнить метод "ПолучитьОбъект()" и в дальнейшем уже работать с ним.

От теории перейдем к практике.

Практика

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

Процедура печати в модуле объекта

В модуле объекта справочника добавим следующую функцию:

// В функцию передаем ссылку на элемент справочника Функция ПечатьВыбранныхТоваров(Ссылка) Экспорт ТабДок = Новый ТабличныйДокумент; Макет = Справочники. Товары. ПолучитьМакет(" Макет " ) ; Запрос = Новый Запрос; Запрос. Текст = " ВЫБРАТЬ | Товары. Представление КАК Товар, | Товары. ПометкаУдаления, | Товары. Артикул |ИЗ | Справочник. Товары КАК Товары |ГДЕ | Товары. Ссылка В(& МассивТоваров) " ; Запрос. УстановитьПараметр(" МассивТоваров " , Ссылка) ; //Ставим отбор по ссылке

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

Программный код для вызова метода объекта "ПечатьВыбранныхТоваров" по команде формы "Печать" представлен на следующем листинге:

& НаКлиенте Процедура Печать(Команда) // Обращаемся к серверной процедуре для получения сформированного табличного документа ТабДок = ПечатьСервер() ; // Показываем сформированный табличный документ ТабДок. Показать() ; КонецПроцедуры & НаСервере Функция ПечатьСервер() // Конвертируем объект формы в объект справочника "Товары" для вызова функции из модуля объекта ОбъектТовар = РеквизитФормыВЗначение(" Объект " ) ; // Вызываем процедуру модуля объекта, передав туда ссылку на текущий элемент справочника. Результат // возвращаем на клиентскую часть Возврат ОбъектТовар. ПечатьВыбранныхТоваров(Объект. Ссылка) ; КонецФункции

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

Процедура печати в модуле менеджера

В модуль менеджера справочника добавим следующую экспортную процедуру:

// Передаем массив ссылок на товары Функция ПечатьВыбранныхТоваров(МассивТоваров) Экспорт ТабДок = Новый ТабличныйДокумент; Макет = Справочники. Товары. ПолучитьМакет(" Макет " ) ; Запрос = Новый Запрос; Запрос. Текст = " ВЫБРАТЬ | Товары. Представление КАК Товар, | Товары. ПометкаУдаления, | Товары. Артикул |ИЗ | Справочник. Товары КАК Товары |ГДЕ | Товары. Ссылка В(& МассивТоваров) " ; Запрос. УстановитьПараметр(" МассивТоваров " , МассивТоваров) ; // Устанавливаем отбор по массиву Результат = Запрос. Выполнить () ; ОбластьЗаголовок = Макет. ПолучитьОбласть(" Заголовок " ) ; ОбластьПодвал = Макет. ПолучитьОбласть(" Подвал " ) ; ОбластьШапкаТаблицы = Макет. ПолучитьОбласть(" ШапкаТаблицы " ) ; ОбластьПодвалТаблицы = Макет. ПолучитьОбласть(" ПодвалТаблицы " ) ; ОбластьДетальныхЗаписей = Макет. ПолучитьОбласть(" Детали " ) ; ТабДок. Очистить() ; ТабДок. Вывести(ОбластьЗаголовок) ; ТабДок. Вывести(ОбластьШапкаТаблицы) ; ТабДок. НачатьАвтогруппировкуСтрок() ; ВыборкаДетальныеЗаписи = Результат. Выбрать() ; Пока ВыборкаДетальныеЗаписи. Следующий() Цикл ОбластьДетальныхЗаписей. Параметры. Заполнить(ВыборкаДетальныеЗаписи) ; ТабДок. Вывести(ОбластьДетальныхЗаписей, ВыборкаДетальныеЗаписи. Уровень() ) ; КонецЦикла ; ТабДок. ЗакончитьАвтогруппировкуСтрок() ; ТабДок. Вывести(ОбластьПодвалТаблицы) ; ТабДок. Вывести(ОбластьПодвал) ; Возврат ТабДок; КонецФункции

Главное отличие от функции в модуле объекта - это параметр функции. Теперь в качестве параметра передается массив с ссылками на товары, которые необходимо распечатать.

Программный код модуля команды формы "Печать" выглядит следующим образом:

& НаКлиенте Процедура Печать(Команда) ТабДок = ПечатьСервер() ; ТабДок. Показать() ; КонецПроцедуры & НаСервере Функция ПечатьСервер() // Передаем массив ссылок выделенных товаров в списке справочника // в функцию модуля менеджера "ПечатьВыбранныхТоваров" Возврат Справочники. Товары. ПечатьВыбранныхТоваров(Элементы. Список. ВыделенныеСтроки) ; КонецФункции

При этом результат выполнения команды в режиме 1С:Предприятия будет следующим:

В случае использования метода из модуля менеджера мы можем обращаться к данным справончника "Товары" без получения объекта для каждой ссылки. Поскольку получения объекта означает получение всех данных из базы данных по элементу справочника и помещение полученных данных в оперативную память, то реализация задачи вторым способом положительно повлияет на производительность. Ведь в таком случае мы будем использовать минимум ресурсов (оперативной памяти) серверной машины.

Что же использовать?

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

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

Конфигурация с примерами из статьи.

Печать (Ctrl+P)

Объекты, расположенные в ветви дерева конфигурации Общие модули, предназначены для размещения в них текстов функций и процедур, которые могут вызываться из любого другого модуля конфигурации.
ВНИМАНИЕ! Общий модуль может содержать только определения процедур и функций .
Процедуры и функции общего модуля, для которых в заголовках указано ключевое слово Экспорт, являются одними из составных частей глобального контекста. Подробнее о написании процедур в общем модуле можно узнать в разделах «Формат исходных текстов программных модулей» и «Операторы» справки по встроенному языку.
Для редактирования общего модуля необходимо в палитре свойств объекта типа Общие модули окна Конфигурация в свойстве Модуль щелкнуть мышью ссылку Открыть. Текст общего модуля будет выдан для редактирования в редакторе текстов системы «1С:Предприятие» в режиме редактирования текста программного модуля.
Общий модуль, являясь частью конфигурации, сохраняется только в составе конфигурации.
Свойство Глобальный определяет, являются ли экспортируемые методы общего модуля частью глобального контекста.
Если свойство Глобальный установлено в значение Истина, то экспортируемые методы общего модуля доступны как методы глобального контекста.
Если свойство Глобальный установлено в значение Ложь, то в глобальном контексте создается свойство с именем, соответствующим имени общего модуля в метаданных. Данное свойство доступно только для чтения. Значением данного свойства является объект ОбщийМодуль . Через данный объект доступны экспортируемые методы данного общего модуля. Таким образом, обращение к методам неглобальных общих модулей выглядит как XXXXX.YYYYY, где XXXXX – это имя свойства, соответствующее контексту общего модуля, а YYYYY – имя экспортируемого метода общего модуля.
Пример:

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

Различные контекст и общие модули

С помощью свойств общих модулей и инструкций препроцессора можно организовать выполнение различных методов общих модулей в нужном контексте.
Каждое свойство общего модуля отвечает за возможность компиляции (и исполнения) общего модуля в том или ином контексте.
Доступны следующие свойства, отвечающие за контекст, в котором доступны методы общего модуля:
Клиент (обычное приложение) – методы общего модуля будут доступны для толстого клиента в режиме обычного приложения;
● – методы общего модуля будут доступны для тонкого клиента, веб-клиента, а также для толстого клиента в
режиме управляемого приложения;
● Сервер – методы общего модуля будут доступны на сервере;
Внешнее соединение – методы общего модуля будут доступны во внешнем соединении.
Если устанавливаются одновременно несколько свойств, то это означает, что методы общего модуля будут доступны в нескольких контекстах.
Если у общего модуля установлено свойство Сервер и еще какое-либо свойство, то это означает, что общий модуль будет доступен одновременно на сервере и в выбранном клиенте. При этом необходимо понимать, что фактически это будет несколько вариантов скомпилированного кода (по числу выбранных клиентов и собственно для сервера).
При этом если метод, расположенный в таком общем модуле, вызывается со стороны клиента, то будет использована клиентская копия общего модуля, а если с сервера – серверная. В этом случае с помощью директив препроцессора (подробнее см. здесь) можно «оградить» сервер от того кода, который на нем не может исполняться.
Рассмотрим пример. В общем модуле (который может исполняться на тонком клиенте и на сервере) есть метод, который имеет несколько различное поведение на стороне тонкого клиента и на стороне сервера. Посмотрим, как это можно сделать:



#Если ТонкийКлиент Тогда
// Покажем предупреждение
ПоказатьОповещениеПользователя (“На клиенте”);
#КонецЕсли
КонецПроцедуры
Тогда на стороне сервера код приобретет следующий вид:
Процедура МетодОбщегоМодуля() Экспорт
// Тут размещается различный важный код
КонецПроцедуры
А на стороне тонкого клиента код будет иметь следующий вид:
Процедура МетодОбщегоМодуля() Экспорт
// Тут размещается различный важный код
// Покажем предупреждение
ПоказатьОповещениеПользователя(“На клиенте”);
КонецПроцедуры

Для передачи управления с клиента на сервер существует несколько способов:
● вызвать метод серверного общего модуля;
● в модуле формы или команды вызвать метод, который предваряется директивами компиляции &НаСервере, &НаСервереБезКонтекста

При этом из серверных процедур невозможно вызвать методы клиентских общих модулей (у которых не установлено свойство Сервер) и клиентские методы модуля формы или модуля команды. Управление вернется на клиента после того, как будет завершен самый внешний вызов серверного метода.
Исключение составляют методы модуля формы и модуля команды, которые предваряются директивами компиляции &НаКлиентеНаСервере , &НаКлиентеНаСервереБезКонтекста
Также следует упомянуть следующие моменты:
● Если общий модуль доступен более чем для одного клиента, то при написании программного кода следует учитывать максимальные ограничения, которые могут накладываться клиентами, либо использовать инструкции препроцессора для «изоляции» кода, специфичного для того или иного клиента.
● Инструкции препроцессора также имеют смысл тогда, когда один общий модуль имеет несколько контекстов исполнения, например, внешнее соединение и тонкий клиент или (что встречается значительно чаще) какой-либо клиент и сервер. В этом случае инструкции препроцессора будут обрамлять интерактивный код, который невозможно использовать на сервере, но возможно на клиенте (см. пример выше).
Подробнее об инструкциях препроцессора и директивах компиляции в разделе «Исполнение процедур и функций» справки по встроенному языку.
Свойство Вызов сервера предназначено для управления возможностью вызова экспортируемых методов серверного общего модуля из клиентского кода.
Если свойство установлено, то экспортируемые методы серверного общего модуля доступны для вызова со стороны клиента. Если свойство не установлено, то такие экспортируемые методы можно вызывать только из серверных методов (как методов серверных общих модулей, так и серверных методов модуля формы и модулей команд).
Совет . Рекомендуется устанавливать в значение Ложь свойство Вызов сервера в тех случаях, когда серверный общий модуль содержит методы, которые нежелательно вызывать с клиента (например, по причинам безопасности).
Примечание . Если одновременно установлены свойства Клиент (обычное приложение) , Клиент (управляемое приложение) , Внешнее соединение , то свойство Вызов сервера автоматически сбрасывается. Если устанавливается свойство Вызов сервера , то автоматически сбрасываются свойства Клиент (обычное приложение) , Клиент (управляемое приложение) и Внешнее соединение , если эти свойства были установлены одновременно.
Свойство Привилегированный предназначено для отключения контроля прав доступа при выполнении методов общего модуля.
ПРИМЕЧАНИЕ. Если свойство Привилегированный установлено, то общему модулю автоматически устанавливается свойство Сервер и сбрасываются остальные свойства (Клиент (обычное приложение) , Клиент (управляемое приложение) и Внешнее соединение ). Привилегированный общий модуль может исполняться только на сервере.

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

Если общий модуль не является глобальным, то становится доступно свойство Повторное использование возвращаемых значений. Это свойство может принимать следующие значения:
● Не использовать – повторное использование возвращаемых значений для функций этого общего модуля не используется.
● На время вызова и На время сеанса – для общего модуля используется метод определения повторного использования данных. Суть этого метода заключается в том, что в ходе выполнения кода система запоминает параметры и результат работы функций после первого вызова функции. При повторном вызове функции с такими же параметрами, происходит возврат запомненного значения (из первого вызова) без выполнения самой функции. Если функция во время своего выполнения меняет значения параметров, то повторный вызов функции не будет это делать.
Можно выделить следующие особенности сохранения результатов вызова:
● если функция выполняется на сервере и вызывается из серверного кода, то значения параметров и результат вызова запоминаются для текущего сеанса на стороне сервера;
● если функция выполняется на толстом или тонком клиенте, то значения параметров и результатов вызова запоминаются на стороне клиента;
● если функция выполняется на стороне сервера, а вызывается из клиентского кода, то значения параметров вызова запоминаются и на стороне клиента, и на стороне сервера (для текущего сеанса).
Сохраненные значения удаляются:
● если свойство установлено в значение На время вызова:
● на стороне сервера – при возврате управления с сервера;
● на стороне клиента – при завершении работы процедуры или функции встроенного языка верхнего уровня (вызванной системой из интерфейса, а не из другой процедуры или функции встроенного языка);
● если свойство общего модуля установлено в значение На время сеанса:
● на стороне сервера – при окончании сеанса;
● на стороне клиента – при закрытии клиентского приложения.
Сохраненные значения будут удалены:
● на сервере, в толстом клиенте, во внешнем соединении, в тонком клиенте и в веб-клиенте с обычной скоростью соединения – через 20 минут после вычисления сохраняемого значения или через 6 минут после последнего использования;
● в тонком клиенте и веб-клиенте с низкой скоростью соединения – через 20 минут после вычисления сохраняемого значения;
● при нехватке оперативной памяти в рабочем процессе сервера;
● при перезапуске рабочего процесса;
● при переключении клиента на другой рабочий процесс.
После удаления значений вызов экспортируемой функции выполняется как при первом вызове.
На выполнение процедур данное свойство общих модулей не влияет – процедуры выполняются всегда.

Если у общего модуля установлено повторное использование возвращаемых значений, то на типы параметров экспортируемых функции накладывается ряд ограничений. Типы параметров могут быть только:
● Примитивными типами (Неопределено, NULL, Булево, Число, Строка, Дата ).
● Любыми ссылками на объекты базы данных.
● Структурами со значениями свойств вышеперечисленных типов. В этом случае идентичность параметров контролируется «по содержимому» структур.
Если экспортируемая функция возвращает какой-либо объект, то фактически возвращается ссылка на объект, хранимый в кеше. Если после получения этой ссылки произойдет изменение состояния объекта, то последующий вызов той же самой функции приведет к возврату ссылки на уже измененный объект без фактического выполнения функции. Такое поведение будет наблюдаться до удаления сохраненного значения (по любой причине). Другими словами – изменение состояния объекта, полученного в результате вызова функции из общего модуля с повторным использованием возвращаемых значений, не является основанием для фактического вызова функции. Также следует помнить, что кеш возвращаемых объектов индифферентен к
состоянию привелигированного режима в момент вызова функции с повторным использованием возвращаемых значений. Эта особенность может привести к следующей особенности поведения:
● Фактическое выполнение вызова функции с повторным использованием возвращаемых значений (первый вызов) выполнялось при включенном привелигированном режиме.
● При выполнении функции был получен объект, который не может быть получен с отключенным привелигированным режимом.
● Последующие вызовы функции выполнялись без установки привелигированного режима.
● Однако, до момента очистки кеша возвращаемых объектов или повторного фактического вызова, функция будет возвращать формально недоступный объект.
● Также верно и обратное поведение, когда первый вызов выполняется без установки привелигированного режима, а в привелигированном режиме не возвращается объект, который мог быть получен в привелигированном режиме.

Если у общего модуля свойство Повторное использование возвращаемых значений установлено в значение На время сеанса , то в значениях, возвращаемых функциями такого модуля, нельзя использовать значения типа МенеджерВременныхТаблиц .
Если функция общего модуля, с установленным повторным использованием, вызываются из этого же самого общего модуля (например, с именем ОбщийМодуль ), то следует помнить о следующей особенности: если функция вызывается по имени МояФункция() , то исполнение функции будет происходить при каждом вызове функции. Для того чтобы использовались сохраненные значения, функция следует вызывать по полному имени:
ОбщийМодуль.МояФункция().
Метод глобального контекста удаляет все повторно используемые значения, как на стороне сервера, так и на стороне клиента, независимо от места вызова метода. После выполнения метода ОбновитьПовторноИспользуемыеЗначения() первый вызов функции будет выполнен полностью.


Close