Главная Материалы Язык 1С: виды и структура программных модулей

Язык 1С: виды и структура программных модулей

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

Обычно программный модуль состоит  из трех разделов:

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

 

Пример структуры программного модуля:

//***************** ОБЛАСТЬ ОБЪЯВЛЕНИЯ ПЕРЕМЕННЫХ **********************

Перем Фамилия Экспорт; //это глобальная переменная
Перем Имя, Отчество    //это переменная модуля
Перем ФИО;       //это тоже переменная модуля и к ней можно обращаться

                          //из любой процедуры и функции нашего модуля 

                      

//*************** ОБЛАСТЬ ОПИСАНИЯ ПРОЦЕДУР И ФУНКЦИЙ ****************

Процедура Процедура1( )
    Перем Итог;    //Итог это локальная переменная (переменная процедуры)

Итог = Фамилия+" "+Имя+" "+Отчество;
   
КонецПроцедуры

Функция Функция1( )

    // операторы функции

Возврат(Фамилия + " "+ Имя);

КонецФункции


//******************* ОСНОВНОЙ ТЕКСТ ПРОГРАММЫ ***********************

Фамилия ="Иванов";
Имя = "Иван";
Отчество = "Иванович";

//******************************************************************************

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

Область описания процедур и функций размещается от первого оператора Процедура или оператора Функция до любого исполняемого оператора вне тела описания процедур или функций.

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

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

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

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

 

Модуль приложения (управляемого или обычного)

  • может содержать все 3 области
  • выполняется на стороне клиента
  • располагается в корневом разделе конфигурации

В модуле приложения описываются процедуры (обработчики) событий, которые инициализируются при старте и окончании работы системы. Например, при начале работы приложения можно обновить какие-либо данные конфигурации, а при завершении работы  - поинтересоваться, стоит ли вообще выходить из программы. Кроме того, в данном модуле перехватываются события от внешнего оборудования, например, торгового или фискального. Стоит отметить, что модуль приложения выполняется  только в случае интерактивного запуска приложения, то есть когда запускается окно программы. Этого не происходит, если приложение запускается в режиме com- соединения.
В платформе 1С 8 существует два различных модуля приложения. Это модуль Обычного приложения и модуль Управляемого приложения. Они срабатывают  при запуске различных клиентов. Так, модуль Управляемого приложения срабатывает при запуске веб-клиента, тонкого клиента и толстого клиента в режиме управляемого приложения. А модуль обычного приложения срабатывает при запуске толстого клиента в режиме обычного приложения. Настройка режима запуска приложения задается в свойстве конфигурации "Основной режим запуска".

В модуле приложения могут располагаться все 3 раздела – объявления переменных, описания процедур и функций, а так же основной текст программы. Модуль приложения компилируется на стороне клиента, что сильно ограничивает нас в использовании многих типов данных. Расширить контекст модуля приложения можно за счет методов общих модулей, для которых установлено свойство «Вызов сервера». Все переменные и методы программного модуля приложения, помеченные как экспортные, будут доступны в любом модуле конфигурации, работающем на стороне клиента. Однако, как бы ни было это заманчиво, не следует размещать здесь большое количество процедур и функций. Чем больше в данном модуле находится кода, тем длительнее время компиляции, а, следовательно, и время запуска приложения.

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

 

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

  • может содержать все 3 области
  • выполняется на стороне сервера
  • располагается в корневом разделе конфигурации

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

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

 

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

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

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

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

 

Общие модули

  • может содержать область описания процедур и функций
  • выполняется на стороне сервера или клиента (зависит от настроек модуля)
  • располагается в ветке дерева объектов конфигурации «Общие» - «Общие модули»

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

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

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

 

Модуль формы

  • может содержать все 3 области
  • выполняется на стороне сервера и клиента

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

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

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

 

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

  • может содержать все 3 области
  • выполняется на стороне сервера

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

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

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

  • может содержать все 3 области
  • выполняется на стороне сервера

Модуль менеджера объектов появился только начиная с версии 1С 8.2. Модуль менеджера существует у всех прикладных объектов и предназначен для управления этим объектом как объектом конфигурации. Модуль менеджера позволяет расширить функциональность объекта за счет введения (написания) процедур и функций, которые относятся не к конкретному экземпляру объекта базы данных, а к самому объекту конфигурации. Модуль менеджера объектов позволяет размещать общие процедуры и функции для данного объекта и обращаться к ним из вне, например, из обработки (конечно, если эта процедура или функция будет с ключевым словом Экспорт). Что это нам дает нового? В общем-то, ничего, кроме упорядочивания процедур по объектам и хранения их в отдельных местах - Модулях менеджеров объектов. Мы можем с таким же успехом эти процедуры и функции помещать в общих модулях, но 1С советует общие процедуры и функции объектов размещать в Модуле менеджера объектов. Примеры использования процедур и функций Модуля менеджеров объектов: первоначальное заполнение отдельных реквизитов справочника или документа по определенным условиям, проверка заполнения реквизитов справочника или документа по определенным условиям и т.д.

 

Модуль команды

  • может содержать раздел описания процедур и функций
  • выполняется на стороне клиента

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

Количество просмотров: 52728

Комментарии

  • <p>Влад, Добрый день. Про модуль менеджера: &quot;<span style="font-family: 'Lucida Sans Unicode', 'Lucida Sans', 'Lucida Grande', Verdana, Geneva, sans-serif; text-align: justify; font-size: 1em; line-height: 1.5;">Модуль менеджера объектов появился только начиная с версии 1С 8.2. Основное предназначение данного модуля &ndash; это переопределение стандартного события выбора, которое возникает в момент ввода по строке или расширение функционала менеджера. Модуль компилируется на стороне сервера.&quot; Можно подробнее или с примерами? Так в РУКОВОДСТВАХ пишут.</span></p><p><span style="font-family: 'Lucida Sans Unicode', 'Lucida Sans', 'Lucida Grande', Verdana, Geneva, sans-serif; text-align: justify; font-size: 1em; line-height: 1.5;">Я вот понять не могу: 1.</span><u style="font-size: 1em; line-height: 1.5;">Переопределение&nbsp;</u><span style="font-size: 1em; line-height: 1.5; font-family: 'Lucida Sans Unicode', 'Lucida Sans', 'Lucida Grande', Verdana, Geneva, sans-serif; text-align: justify;">стандартного события выбора; 2.</span><u style="font-size: 1em; line-height: 1.5;"><span style="font-size: 9.5pt; line-height: 115%; font-family: 'Lucida Sans Unicode', sans-serif; background-position: initial initial; background-repeat: initial initial;">момент</span></u><span class="apple-converted-space" style="font-size: 1em; line-height: 1.5;"><span style="font-size: 9.5pt; line-height: 115%; font-family: 'Lucida Sans Unicode', sans-serif; background-position: initial initial; background-repeat: initial initial;">&nbsp;</span></span><span style="font-size: 1em; line-height: 1.5; font-family: 'Lucida Sans Unicode', 'Lucida Sans', 'Lucida Grande', Verdana, Geneva, sans-serif; text-align: justify;">ввода по строке или&nbsp;</span><u style="font-size: 1em; line-height: 1.5;">расширение функционала</u><span style="font-size: 1em; line-height: 1.5; font-family: 'Lucida Sans Unicode', 'Lucida Sans', 'Lucida Grande', Verdana, Geneva, sans-serif; text-align: justify;">&nbsp;менеджера;3.</span><u style="font-size: 1em; line-height: 1.5;"><span style="font-size: 9.5pt; line-height: 115%; font-family: 'Lucida Sans Unicode', sans-serif; background-position: initial initial; background-repeat: initial initial;">компилируется на стороне сервера</span></u><span style="font-size: 1em; line-height: 1.5; font-family: 'Lucida Sans Unicode', 'Lucida Sans', 'Lucida Grande', Verdana, Geneva, sans-serif; text-align: justify;">. Код в 1с8 компилируется в модулях как-то по разному? Я еще могу понять серверная часть и клиентская,модули-область применения кода, но компилятор в приложении один?&nbsp;</span></p><p>&nbsp;</p>
    13 ноября 2013 , 20:58
    • Очень познавательно.
      31 января 2017 , 13:04
  • <p>Игорь, спасибо за вопросы. Я постараюсь дать более подробное и подходящее определение Модулю менеджера объектов. Если сказать в 2 словах - то Модуль менеджера объектов позволяет размещать общие процедуры и функции для данного объекта и обращаться к ним из вне, например из обработки (если процедура или функция будет с ключевым словом Экспорт). Что это нам дает нового? Вобщем-то ничего, кроме упорядочивания процедур по объектам и хранение их в отдельных местах - Модулях менеджеров объектов . Мы можем с таким же успехом такие процедуры помещать в общих модулях, но 1С советует общие процедуры и функции объектов размещать в Модуле менеджера. Примеры использования процедур Модуля объектов обычно: первоначальное заполнение отдельных реквизитов справочника или документа по определенным условия, проверка заполнения по определенным условиям и т.д. Именно поэтому я в видео части урока про данный модуль ничего не говорил - это не более чем &quot;сильно надуманный&quot; модуль и любая конфигурация вполне может обойтись без него. На счет компиляции - думаю что правильнее использовать термин &quot;выполняется на стороне&quot;. Когда мы говорим про контекст (место исполнения кода) нужно представлять себе сервер и удаленный компьютер с клиентом 1С (для наглядности). Тогда действительно мы имеем 2 компилятора - 1 исполняет код на сервере, 2- на удаленном компьютере. При использовании файл-серверного варианта, а тем более при использовании толстого клиента вопросы о количестве компиляторов и месте исполнения кода носят весьма условный характер.</p>
    14 ноября 2013 , 09:53
  • А какова вообще идея разделения платформы на клиентскую и серверную часть? Такое вообще есть еще в каких-то разработках? Благодарю за развернутые ответы.Ждем продолжения.
    14 ноября 2013 , 19:21
  • <p>Игорь, я извиняюсь за задержку с ответом: отвечать второпяк не хотелось, а времени спокойно ответить не было. Разделение платформы на клиентскую и серверную часть преследует 2 цели: 1 цель - это позволить работать с программой по неустойчивым каналам (например, интернет - такие каналы могут рваться, могут быть временные сбои с подключением и т.д., но клиент должен каким-то образом комфортно работать) и 2 цель - снизить нагрузку на сервер, дабы с базой могло работать как можно пользователей одновременно. Подобные задачи давно успешно решаются. Например, большинство сайтов (все, где есть регистрация пользователей) - это база данных, серверная часть и клиентская часть (это интернет-браузер) и такие сайты способны поддерживать одновременную комфортную работу огромного количества пользователей. Вот с них пример и брали. В итоге, по моим оценкам, программирование усложнилось даже не в 2, а наверное все 4 раза :) по сравнению с версией 1С 7.7. Но это дало и новые возможности...</p><p>Вообще разделение платформы на клиента и сервер присуще большинству современным средам и СУБД... В этом смысле 1С всегда шагает в ногу со временем. Как я обычно шучу: посмотри что нового появилось в 1С и ты поймешь в какую сторону развиваются СУБД и среды разработки :)</p>
    19 ноября 2013 , 14:48
  • <p>Да, Влад, я как раз и сетовал, что программирование усложнилось. Хорошо, будем приобщаться к прекрасному...Удачи вам, и, с нетерпением, ожидаем продолжения. Без вас будет трудно во всем разобраться...</p>
    21 ноября 2013 , 18:57