Зачем нужны общие модули в 1с
Перейти к содержимому

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

  • автор:

Программные модули в «1С:Предприятии 8»

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

Общие модули Общие модули принадлежат всей конфигурации в целом, но, в отличие от модуля приложения (см. ниже), их может быть несколько, например, модули РасчетНалогов , ОбработкаДокументов . Общие модули не могут содержать объявлений переменных, и в них нет раздела основной программы, таким образом, они состоят только из процедур и функций
Модуль приложения Это модуль, который относится ко всей конфигурации в целом и может быть только один. Модуль приложения является аналогом глобального модуля в версии 7.7. Он отвечает за пользовательскую сессию (сеанс) работы с «1С:Предприятием 8»
Модуль внешнего соединения Если конфигурация запускается не в режиме клиентской сессии, а через COM-соединение, то вместо модуля приложения используется модуль внешнего соединения, который в конфигурации может быть только один
Модули объектов У некоторых прикладных объектов конфигурации могут быть собственные модули, например, модуль документа РасходнаяНакладная , модуль справочника Номенклатура . Не следует их путать с модулями форм этих объектов
Модули форм У каждой формы есть модуль, в котором определяется поведение формы и действия, выполняемые из нее, например, открытие других форм

На следующем рисунке показано расположение всех этих модулей:

Разделы программного модуля

Любой программный модуль, за исключением общих модулей, состоит из следующих разделов:

  • раздел объявления переменных,
  • раздел процедур и функций,
  • раздел основной программы.

Внимание! У общих модулей есть только раздел процедур и функций.

Контекст

Контекст — очень важное понятие при программировании на любом языке. В «1С:Предприятии 8» контекст обозначает окружение модуля, т. е. какие ему будут доступны переменные, объекты, свойства, методы и события.

Можно выделить следующие виды контекстов, существующих в «1С:Предприятии 8»:

Глобальный контекст , доступный во всех остальных контекстах, состоит из следующих частей:

  • свойства, методы и события глобального контекста (например, свойство РабочаяДата ),
  • системные перечисления и системные наборы значений (например, КодВозвратаДиалога и Символы ).

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

В контексте общего модуля доступны экспортируемые процедуры и функции других общих модулей. В этом контексте недоступны экспортируемые переменные, процедуры и функции модуля приложения.

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

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

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

  1. В общем модуле недоступны экспортируемые переменные, процедуры и функции модуля приложения (модуля внешнего соединения).
  2. В модуле приложения (модуле внешнего соединения) доступны экспортируемые процедуры и функции общих модулей.
  3. В общих модулях доступны экспортируемые процедуры и функции других общих модулей.
  4. В модулях прикладных объектов и модулях форм доступны экспортируемые переменные, процедуры и функции модуля приложения (модуля внешнего соединения), а также экспортируемые процедуры и функции общих модулей.
  5. Если у формы назначен основной реквизит, то контекст модуля формы содержит дополнительные свойства и методы, связанные с основным реквизитом. Например, в модуле формы элемента справочника Номенклатура доступны свойства и методы объекта СправочникОбъект.Номенклатура .

Проиллюстрируем применение первых четырех правил на следующей схеме:

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

Структура модуля

Область применения: управляемое приложение, мобильное приложение, обычное приложение.

1.1. В программном модуле (общие модули, модули объектов, модули менеджеров объектов, модули форм, команд и т.п.) в общем случае могут присутствовать следующие разделы в приведенной ниже последовательности:

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

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

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

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

1.3. Разделы и подразделы оформляются в виде областей. При этом имена областей должны удовлетворять требованиям стандарта Правила образования имен переменных

1.4. Шаблон (заготовка для копирования) разделов для общих модулей:

#Область ПрограммныйИнтерфейс // Код процедур и функций #КонецОбласти #Область СлужебныйПрограммныйИнтерфейс // Код процедур и функций #КонецОбласти #Область СлужебныеПроцедурыИФункции // Код процедур и функций #КонецОбласти
#Region Public // Enter code here. #EndRegion #Region Internal // Enter code here. #EndRegion #Region Private // Enter code here. #EndRegion

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

#Область ОбновлениеИнформационнойБазы // Код процедур и функций #КонецОбласти
#Region InfobaseUpdate // Enter code here. #EndRegion

1.5. Шаблон оформления разделов для модулей объектов, менеджеров, наборов записей, обработок, отчетов и т.п.:

#Область ОписаниеПеременных #КонецОбласти #Область ПрограммныйИнтерфейс // Код процедур и функций #КонецОбласти #Область ОбработчикиСобытий // Код процедур и функций #КонецОбласти #Область СлужебныйПрограммныйИнтерфейс // Код процедур и функций #КонецОбласти #Область СлужебныеПроцедурыИФункции // Код процедур и функций #КонецОбласти #Область Инициализация #КонецОбласти
#Region Variables #EndRegion #Region Public // Enter code here. #EndRegion #Region EventHandlers // Enter code here. #EndRegion #Region Internal // Enter code here. #EndRegion #Region Private // Enter code here. #EndRegion #Region Initialize #EndRegion

  • Раздел «Программный интерфейс» содержит экспортные процедуры и функции, предназначенные для использования в других модулях конфигурации или другими программами (например, через внешнее соединение). Не следует в этот раздел помещать экспортные функции и процедуры, которые предназначены для вызова исключительно из модулей самого объекта, его форм и команд. Например, процедуры заполнения табличной части документа, которые вызываются из обработки заполнения в модуле объекта и из формы документа в обработчике команды формы не являются программным интерфейсом модуля объекта, т.к. вызываются только в самом модуле и из форм этого же объекта. Их следует размещать в разделе «Служебные процедуры и функции».
  • Раздел «Обработчики событий» содержит обработчики событий модуля объекта ( ПриЗаписи , ПриПроведении и др.)
  • Раздел « Служебный программный интерфейс » имеет такое же предназначение, как и в общих модулях.
  • Раздел «Служебные процедуры и функции» имеет такое же предназначение, как и в общих модулях.

1.6. Шаблон оформления разделов для модулей форм:

#Область ОписаниеПеременных #КонецОбласти #Область ОбработчикиСобытийФормы // Код процедур и функций #КонецОбласти #Область ОбработчикиСобытийЭлементовШапкиФормы // Код процедур и функций #КонецОбласти #Область ОбработчикиСобытийЭлементовТаблицыФормы // Код процедур и функций #КонецОбласти #Область ОбработчикиКомандФормы // Код процедур и функций #КонецОбласти #Область СлужебныеПроцедурыИФункции // Код процедур и функций #КонецОбласти
#Region Variables #EndRegion #Region FormEventHandlers // Enter code here. #EndRegion #Region FormHeaderItemsEventHandlers // Enter code here. #EndRegion #Region FormTableItemsEventHandlers // Enter code here. #EndRegion #Region FormCommandsEventHandlers // Enter code here. #EndRegion #Region Private // Enter code here. #EndRegion

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

1.7. Шаблон оформления разделов для модулей команд:

#Область ОбработчикиСобытий // Код процедур и функций #КонецОбласти #Область СлужебныеПроцедурыИФункции // Код процедур и функций #КонецОбласти
#Region EventHandlers // Enter code here. #EndRegion #Region Private // Enter code here. #EndRegion

  • Раздел «Обработчики событий» содержит процедуру-обработчик команды ОбработкаКоманды .
  • Раздел «Служебные процедуры и функции» имеет такое же предназначение, что и в общих модулях.

1.8. В модуле не должно быть пустых областей.

2. Общие требования к разделам программных модулей.

2.1. Заголовок модуля представляет собой комментарий в самом начале модуля. В заголовке модуля приводится его краткое описание и условия применения.
Например:

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

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

2.2. Раздел описания переменных . Имена переменных назначаются согласно общим правилам образования имен переменных, а их использование описывается в статье Использование глобальных переменных в программных модулях.

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

#Область ОписаниеПеременных Перем ВалютаУчета; Перем АдресПоддержки; . #КонецОбласти
#Region Variables Var PresentationCurrency; Var SupportEmail; . #EndRegion

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

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

Методическая рекомендация (полезный совет)

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

2.4.3. У каждого события должна быть назначена своя процедура-обработчик. Если одинаковые действия должны выполняться при возникновении событий в разных элементах формы следует:

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

&НаКлиенте Процедура ПоИсполнителюПриИзменении(Элемент) ПараметрыОтбора = Новый Соответствие(); ПараметрыОтбора.Вставить("ПоАвтору", ПоАвтору); ПараметрыОтбора.Вставить("ПоИсполнителю", ПоИсполнителю); УстановитьОтборСписка(Список, ПараметрыОтбора); КонецПроцедуры &НаКлиенте Процедура ПоАвторуПриИзменении(Элемент) ПоИсполнителюПриИзменении(Неопределено); КонецПроцедуры
&НаКлиенте Процедура ПоИсполнителюПриИзменении(Элемент) УстановитьОтбор(); КонецПроцедуры &НаКлиенте Процедура ПоАвторуПриИзменении(Элемент) УстановитьОтбор(); КонецПроцедуры &НаСервере Процедура УстановитьОтбор() ПараметрыОтбора = Новый Соответствие(); ПараметрыОтбора.Вставить("ПоАвтору", ПоАвтору); ПараметрыОтбора.Вставить("ПоИсполнителю", ПоИсполнителю); УстановитьОтборСписка(Список, ПараметрыОтбора); КонецПроцедуры

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

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

Методическая рекомендация (полезный совет)

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

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

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

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

2.7. Раздел инициализации содержит операторы, инициализирующие переменные модуля или объект (форму).
Например:

#Область Инициализация АдресПоддержки = "v8@1c.ru"; ВыполнитьИнициализацию(); . #КонецОбласти
#Region Initialize SupportEmail = "v8@1c.ru"; Ctor(); . #EndRegion

Для оформления разделов кода в виде областей рекомендуется воспользоваться приложенной обработкой.

1С. Свойства общего модуля: «Сервер» и «Вызов сервера».

В конфигурации 1С:Предприятие у общего модуля есть свойства «Сервер» и «Вызов сервера». Как же они работают?

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

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

  • Общий модуль
  • Программирование 1С

Свойства общего модуля

У общего модуля есть свойства:
Клиент, Сервер, Вызов сервера.
Если одновременно поставить Клиент и Сервер, процедуры можно будет вызвать как с клиента, так и сервера.
Если одновременно поставить Сервер и Вызов сервера, процедуры также можно будет вызвать как с клиента, так и сервера.
В чём отличие?

По теме из базы знаний

  • [Общий модуль] Динамическое формирование интерфейса
  • Свойства общих модулей
  • Онлайн просмотр текстов модулей
  • Полезный код для программистов 1С (часть 4). Работа с файловой системой Асинх (аналог общего модуля БСП)
  • Общий модуль расчета суммы
  • Дата
  • Дата
  • Рейтинг всех уровней
  • Рейтинг 1-го уровня
  • Древо развёрнутое
  • Древо свернутое

Свернуть все
2. user5300 993 28.07.21 15:35 Сейчас в теме
Прикрепленные файлы:
6. Дон Кихот 29.07.21 10:15 Сейчас в теме

(2) Разобрался, получается если поставить Клиент и Сервер, тогда в общем модуле можно будет разделить процедуры и функции на директивы:
&НаКлиенте,
&НаСервере.
И вызываться они будут соответственно. Если не делить, они будут вызываться и с клиентских процедур и с серверных.
А если поставить Сервер и Вызов сервера, то в таком общем модуле процедуры и функции будут работать под директивой &НаСервере, а вызываться будут и с клиентских и с серверных процедур и функций.
Может к этому нужно что-то добавить?

7. FatPanzer 29.07.21 10:19 Сейчас в теме

(6) Не совсем так. На Клиент-Сервере разделять конечно можно, но смысла нет ВООБЩЕ. Обычно там размещают процедуры, которые могут работать как на клиенте, так и на сервере (смотря откуда вызвать) — это работы с коллекциями, с общими объектами, с COM, и т.д.

8. Дон Кихот 29.07.21 10:27 Сейчас в теме

(7)Модуль со свойствами Сервер и Вызов сервера получается тоже подойдёт для этих целей (работы с коллекциями, с общими объектами, с COM, и т.д. )?

9. FatPanzer 29.07.21 10:30 Сейчас в теме

(8) Нет, это чисто серверный модуль. Но доступный для вызова с клиента. Выполняется всегда на сервере, соответственно все параметры передаются на с клиента на сервер (и обратно потом), поэтому есть ограничения.

11. Дон Кихот 29.07.21 10:39 Сейчас в теме

(9) Получается если общий модуль со свойствами Клиент и Сервер будет вызываться с клиентской процедуры или функции, и данные сервера в коде общего модуля получаться не будут, тогда вызова сервера не будет, правильно?

12. FatPanzer 29.07.21 10:42 Сейчас в теме

(11) Именно так. При вызове из клиентской процедуры — код будет выполняться на клиенте же (без вызова сервера). При вызове этого же метода с сервера — ровно этот же код будет выполняться на сервере.

3. Sashares 34 28.07.21 15:58 Сейчас в теме
В чём отличие?

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

4. DJ_Codebase 28.07.21 21:50 Сейчас в теме

(1) Клиент — модуль компилируется на клиенте. Вызов сервера — можно вызывать с клиента, без этой опции — только «сервер-сервер»

5. user856012 13 28.07.21 22:00 Сейчас в теме
У общего модуля есть свойства:
Клиент, Сервер, Вызов сервера.

. и очень похоже, что по мнению автора, эти свойства работают только в среде Windows и в государстве Россия?

Иначе зачем было лепить эти теги в оформлении ветки?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *