d9e5a92d

Глава 1 Формат исходных текстов программных модулей

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


вызываемых системой во время исполнения задачи в определенные моменты работы. Поэтому программный модуль не имеет формальных границ своего описания типа: «Начало модуля» — «Конец модуля».

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

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

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

Каждый программный модуль связан с остальной частью конфигурации за­дачи. Эта связь называется контекстом выполнения модуля. Следует различать два вида контекста:

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

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

Глобальный контекст образуется:

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

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

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

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

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

Виды программных модулей

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

Размещение Момент запуска Контекст выполнения

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

Размещается в корне­вом разделе конфигу­рации: Метаданные. Запускается при стар­те всей прикладной задачи. Глобальный модуль оп­ределяет глобальный контекст всей задачи.

Модуль Формы списка справочника

Размещается в разделе конфигурации: Мета­данные — Справочник — Форма списка. Запускается при вызо­ве формы списка справочника. В модуле доступны: глобальный контекст, контекст Модуля формы списка справочника, в котором непосредствен­но доступен выбранный в списке элемент спра­вочника и реквизиты формы списка справоч­ника.

Модуль Формы группы справочника

Размещается в разделе конфигурации: Мета­данные — Справочник — Форма группы. Запускается при от­крытии формы группы справочника. В модуле доступны: глобальный контекст, контекст Модуля формы группы справочника, в котором непосредствен­но доступны реквизиты текущей группы спра­вочника и реквизиты формы.

Модуль Формы элемента справочника

Размещается в разделе конфигурации: Мета­данные — Справочник — Форма элемента. Запускается при от­крытии формы эле­мента справочника. В модуле доступны: глобальный контекст, контекст Модуля формы элемента справочника, в котором непосредствен­но доступны реквизиты текущего элемента спра­вочника и реквизиты формы.

 Модуль Формы документа

Размещается в разделе конфигурации: Мета­данные — Документ — Форма. Запускается при от­крытии формы доку­мента. В модуле доступны: глобальный контекст, контекст Модуля формы документа, в котором непосредственно дос­тупны реквизиты теку­щего документа и рек­визиты формы докумен­та.

Модуль документа

Размещается в разделе

конфигурации: Мета­данные — Документ — Модуль документа.
Запускается при про­ведении документа, при удалении прове­денного документа, при снятии проведе­ния, при выполнении архивации записей журнала расчетов, по­рожденных докумен­том. В модуле доступны: глобальный контекст, контекст Модуля доку­мента, в котором непо­средственно доступны реквизиты текущего документа.

Модуль Формы журнала документов

Размещается в разделе конфигурации: Мета­данные — Журнал — Форма. Запускается при вызо­ве формы журнала документов. В модуле доступны: глобальный контекст, контекст Модуля формы журнала документов, в котором непосредствен­но доступен выбранный в журнале документ и реквизиты формы жур­нала.

Модуль Формы журнала расчетов

Размещается в разделе конфигурации: Мета­данные — Журнал расчетов — Форма. Запускается при вызо­ве формы журнала расчетов. В модуле доступны: глобальный контекст, контекст Модуля формы журнала расчетов, в котором непосредствен­но доступны реквизиты журнала расчетов и рек­визиты формы.

Модуль Формы списка счетов

Размещается в разделе конфигурации: Мета­данные — План сче­тов. Запускается при вызо­ве формы списка сче­тов. В модуле доступны: глобальный контекст, контекст Модуля формы списка счетов, в котором непосредственно досту­пен выбранный в списке счет и реквизиты формы списка счетов.

Модуль Формы счета

Размещается в разделе конфигурации: Мета­данные — Справочник

— счет.
Запускается при от­крытии формы счета. В модуле доступны: глобальный контекст, контекст Модуля формы счета, в котором непо­средственно доступны реквизиты текущего счета и реквизиты фор­мы.

Модуль Формы журнала операций

Размещается в разделе конфигурации: Мета­данные — Журнал операций — Форма. Запускается при вызо­ве формы журнала операций. В модуле доступны: глобальный контекст, контекст Модуля формы журнала операций, в котором непосредствен­но доступны реквизиты журнала операций и реквизиты формы.

Модуль Формы операции

Размещается в разделе конфигурации: Мета­данные — Операция. Запускается при от­крытии формы опера­ции. В модуле доступны: глобальный контекст, контекст Модуля формы операции, в котором непосредственно дос­тупны реквизиты теку­щей операции и рекви­зиты формы операции.

 Модуль Формы журнала проводок

Размещается в разделе конфигурации: Мета­данные — Журнал проводок — Форма. Запускается при вызо­ве формы журнала проводок. В модуле доступны: глобальный контекст, контекст Модуля формы журнала проводок, в котором непосредствен­но доступны реквизиты журнала проводок и реквизиты формы.

Модуль Формы отчета

Размещается в разделе конфигуратора: Мета­данные — Отчет — Форма. Запускается при от­крытии диалоговой формы подготовки отчета. В модуле доступны: глобальный контекст, контекст Модуля формы отчета, в котором непо­средственно доступны реквизиты формы.

Модуль Формы обработки

Размещается в разделе конфигуратора: Мета­данные — Обработка — Форма. Запускается при от­крытии диалоговой формы обработки. В модуле доступны: глобальный контекст, контекст Модуля формы обработки, в котором непосредственно дос­тупны реквизиты фор­мы.

Модуль вида расчета

Размещается в разделе конфигуратора: Метаданные — Вид расчета — Модуль вида расчета. Запускается при рас­чете соответствующих записей журнала рас­четов. В модуле доступны: глобальный контекст, контекст Модуля вида расчета, в котором дос­тупны реквизиты жур­нала расчетов.
Формат программного модуля Исходный текст программного модуля может состоять из операторов и комментариев.

Комментарии

Комментарий используется для размещения в исходном тексте программно­го модуля всякого рода пояснений к работе модуля. Хорошим тоном програм­мирования считается, когда исходный текст содержит исчерпывающий коммен­тарий с описанием алгоритма. В режиме исполнения программы комментарии пропускаются. В тексте программного модуля комментарий начинается парой символов // и заканчивается концом строки. Это значит, что комментарий можно начинать с начала строки или записывать его после оператора на той же строке. После начала комментария писать оператор на той же строке нельзя, необходимо закончить комментарий концом строки.

Пример:

А=В; // Это – комментарий

// Это тоже комментарий

Формат операторов

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

Операторы языка в программном модуле можно подразделить на две кате­гории: операторы объявления переменных и исполняемые операторы.

Операторы объявления переменных создают имена переменных, которыми манипулируют исполняемые операторы.

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

В общем случае формат оператора языка следующий:

~метка:Оператор[(параметры)] [ДобКлючевоеСлово];

В качестве меток используются специальные идентификаторы, начинаю­щиеся с символа '~' (тильда) и состоящие из последовательности букв, цифр и символов '_'. Чтобы пометить оператор, надо поместить перед ним метку и сле­дующий за ней символ :.

Пример:

~метка:А=В;

Имена переменных, процедур и функций

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

Зарезервированные слова

Приведенные далее ключевые слова являются зарезервированными и не могут использоваться в качестве создаваемых имен переменных и объявляе­мых процедур и функций. В данном варианте языка каждое из ключевых слов имеет два представления — русское и английское. Английское представление является традиционным для языков программирования. Ключевые слова в русском и английском представлении могут свободно смешиваться в одном исходном тексте. Регистр букв ключевых слов не имеет значения. Ниже приведен список ключевых слов в обоих вариантах представления.

Если If He Not Дата Date
Тогда Then Знач Val Формат Format
ИначеЕсли Elsif СтрДлина StrLen Разм Dim
Иначе Else СокрЛ TrimL Вопрос Do Query Box
КонецЕсли Endlf СокрП TrimR Контекст Context
Цикл Do Лев Left Перем Var
Для For Прав Right Перейти Goto
По To Сред Mid Возврат Return
Пока While Цел Int Продолжить Continue
Функция Function Окр Round Прервать Break
КонецПроцедуры EndProcedure Число Number И And
КонецФункции EndFunction Строка String Или Or
Предупреждение DoMessageBox КонецЦикла EndDo Процедура Procedure

Структура программного модуля

Структуру программного модуля можно подразделить на следующие разде­лы:

· раздел определения переменных;

· раздел процедур и функций;

· раздел основной программы.

В конкретном программном модуле любой из разделов может отсутствовать.

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

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

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

Специальные символы, используемые в исходном тексте
// Двумя знаками «косая черта» начинается комментарий. Коммен­тарием считается весь текст от знака // до конца текущей стро­ки.
| Вертикальная черта в начале строки используется только в стро­ковых константах и означает, что данная строка является про­должением предыдущей (перенос строки), (см. «Строковые кон­станты»).
~ Знаком тильда начинается метка оператора.
: Двоеточием заканчивается метка оператора.
; Точка с запятой является символом разделения операторов.
( ) В круглые скобки заключается список параметров методов, про­цедур и функций.
[ ] В квадратные скобки заключается размерность массивов.
, Запятая разделяет параметры в списке параметров методов, про­цедур и функций.
В двойные кавычки заключаются строковые константы.
' ' В одинарные кавычки заключаются константы даты.
. Десятичная точка в числовых константах. Разделитель, используемый в описаниях агрегатных типов данных.
+ Символ «плюс» обозначает операцию сложения.
- Символ «минус» обозначает операцию вычитания.
* Символ «звездочка» обозначает операцию умножения.
/ Символ «косая черта» обозначает операцию деления.
Правая угловая скобка обозначает логическую операцию «боль­ше».
= Логическая операция «больше или равно».
Левая угловая скобка обозначает логическую операцию «мень­ше».
= Логическая операция «меньше или равно».
= Знак равенства обозначает присвоение или логическую операцию «равно».
Две угловые скобки обозначают логическую операцию «не рав­но».
Процедуры и функции программного модуля

Процедура

Секция описания процедуры.

Синтаксис:

Процедура Имя_проц([[Знач] Парам1[=ДефЗнач],

... , [Знач] ПapaмN[=ДeфЗнaч]]) [Экспорт]

//Объявления локальных переменных;

//Операторы;

...

[Возврат;]

//Операторы;

...

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

Англоязычный Синтаксис:

Procedure Имя_проц([[Val] Парам1[=ДефЗнач],

... , [Val] ПарамN[=ДефЗнач]]) [Export]

//Объявления локальных переменных;

//Операторы;

...

[Return;]

//Операторы;

...

EndProcedure

Параметры:

Имя_проц Назначает имя процедуры.
Знач Необязательное ключевое слово, которое указывает на то, что следующий за ним параметр передается по значению, т. е. изменение значения формального параметра при выполнении процедуры никак не повлияет на фактический параметр, переданный при вызове процедуры. Если это ключевое слово не указано, то параметр процедуры передается по ссылке, то есть изменение внутри процедуры зна­чения формального параметра приведет к измене­нию значения соответствующего фактического па­раметра.
Парам1, ..., ПарамN Необязательный список формальных параметров, разделяемых запятыми. Значения формальных па­раметров должны соответсвовать значениям пере­даваемых при вызове процедуры фактических па­раметров. В этом списке определяются имена каж­дого из параметров так, как они используются в тексте процедуры. Список формальных параметров может быть пуст. См. также: «Передача парамет­ров».
=ДефЗнач Необязательная установка значения параметра по умолчанию. Параметры с установленными значе­ниями по умолчанию можно располагать в любом месте списка формальных параметров.

Если параметр при вызове процедуры опущен, то он принимает либо установленное по умолчанию значение (если оно есть) либо принимает «пустое» значение (значение неопределенного типа).

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

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

Если параметру не задано значения по умолча­нию, то при вызове процедуры его можно опускать в списке передаваемых фактических параметров, но разделительную запятую надо ставить.
Экспорт Необязательное ключевое слово, которое указывает на то, что данная процедура является доступной из других программных модулей. Имеет смысл только в глобальном программном модуле.
//Объявления локальных переменных Объявляются локальные переменные, на которые можно ссылаться только в рамках этой процедуры (см. оператор Перем).
//Операторы Исполняемые операторы процедуры.
Возврат Необязательное ключевое слово, которое завершает выполнение процедуры и осуществляет возврат в точку программы, из которой было обращение к процедуре. Использование данного оператора в процедуре не обязательно.
КонецПроцедуры Обязательное ключевое слово, обозначающее конец исходного текста процедуры, завершение выполне­ния процедуры. Возврат в точку, из которой было обращение к процедуре.
Описание:

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

При выполнении оператора Возврат процедура заканчивается и возвраща­ет управление в точку вызова. Если в тексте процедуры не встретился оператор Возврат, то после выполнения последнего исполняемого оператора происхо­дит выполнение неявного оператора Возврат. Конец программной секции процедуры определяется по оператору КонецПроцедуры.

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

Замечание: ключевые слова Процедура, КонецПроцедуры, являются не операторами, а операторными скобками, поэтому не должны заканчивать­ся точкой с запятой (это может приводить к ошибкам выполнения моду­ля).

См. также: «Передача параметров»

Пример:

Перем Глоб;

// Описание процедуры

Процедура МояПроцедура(Пар1, Пар2, ПарЗ) Экспорт

Глоб = Глоб + Пар1 + Пар2 + ПарЗ;

Возврат;

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

Глоб = 123;

МояПроцедура(5, 6, 7);   // Вызов процедуры

Функция

Секция описания функции.

Синтаксис:

Функция Имя_функции([[Знач] Парам1[=ДефЗнач], ...

, [Знач] ПарамN [=ДефЗнач]])[Экспорт]

//Объявления локальных переменных;

// Операторы;

...

Возврат ВозвращаемоеЗначение;

// Операторы;

...

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

Англоязычный Синтаксис:

Function Имя_функции ([[Val] Парам1[=ДефЗнач], ...

, [Val] ПapaмN [=ДефЗнач]])[Export]

//Объявления локальных переменных;

// Операторы;

...

Return ВозвращаемоеЗначение;

// Операторы;

...

EndFunction

Параметры:

Имя_функции Назначает имя функции.
Знач Необязательное ключевое слово, которое указывает на то, что следующий за ним параметр передается по значению, т. е. изменение значения формального па­раметра при выполнении функции никак не повлия­ет на значение фактического параметра, переданного при вызове функции. Если это ключевое слово не указано, то параметр функции передается по ссылке, то есть изменение внутри функции значения фор­мального параметра приведет к изменению значения соответствующего фактического параметра.
Парам1, ..., ПарамN Необязательный список формальных параметров, разделяемых запятыми. Значения формальных пара­метров должны соответсвовать значениям передавае­мых при вызове функции фактических параметров. В этом списке определяются имена каждого из пара­метров так, как они используются в тексте функции. Список формальных параметров может быть пуст. См. также: «Передача параметров».
=ДефЗнач Необязательная установка значения параметра по умолчанию. Параметры с установленными значения­ми по умолчанию можно располагать в любом месте списка формальных параметров.

Если параметр при вызове процедуры опущен, то он принимает либо установленное по умолчанию значение (если оно есть) либо принимает «пустое» значение (значение неопределенного типа).

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

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

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

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

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

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

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

Замечание: ключевые слова Функция, КонецФункции являются не операто­рами, а операторными скобками, поэтому не должны заканчиваться точ­кой с запятой (это может приводить к ошибкам выполнения модуля).

См. также: «Передача параметров»

Пример:

Перем Глоб;

// Описание функции

Функция МояФункция(Парам1, Парам2, ПарамЗ) Экспорт

Лок = Глоб + Парам1 + Парам2 + ПарамЗ;

Возврат Лок;

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

Глоб = 123;

Рез = МояФункция(5, 6, 7);      // Вызов функции

Предварительное описание процедур и функций

В тексте программного модуля допускается предварительное описание про­цедур и функций без их определения.

Пример:

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

Процедура А(Парам1, Парам2) Далее

Процедура Б()

   Перем АА, ББ;

   ...

   А(АА, ББ);

   ...

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

Процедура А(Парам1, Парам2)

   ...

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

В приведенном фрагменте видно, что обращение к процедуре А (из проце­дуры Б) предшествует по тексту ее фактическому определению, но перед про­цедурой Б имеется предварительное описание процедуры А.

Процедура А(Парам1, Парам2) Далее

На то, что это предварительное описание указывает наличие ключевого сло­ва Далее (англоязычный синоним — Forward), которое замещает в случае предварительного описания тело процедуры и ключевое слово КонецПроцедуры. Предварительное описание процедуры/функции может со­держаться в любом месте текста модуля, где допускается фактическое опреде­ление процедуры или функции, а сам заголовок процедуры/функции должен в точности соответствовать заголовку в фактическом определении, включая на­личие, если необходимо, ключевого слова Экспорт и имен формальных пара­метров.

Передача параметров

По умолчанию параметры методов, процедур и функций передаются по ссылке, то есть изменение внутри процедуры или функции значения формаль­ного параметра ведет к изменению значения соответствующего фактического параметра. При передаче параметра по значению изменение значения формаль­ного параметра никак не влияет на фактический параметр вызова процедуры. Для указания того, что тот или иной параметр следует передавать по значению, следует в исходном тексте процедуры или функции перед именем параметра записать ключевое слово Знач (англоязычный синоним — Val).

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

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

Если параметр при вызове процедуры опущен, то он принимает либо уста­новленное по умолчанию значение (если оно есть) либо принимает «пустое» значение (значение неопределенного типа).

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

Пример:

Перем Глоб;

// Описание функции

Функция МояФункция(Знач Пар1, Пар2, Пар3) Экспорт

   Лок = Глоб + Пар1 + Пар2 + Пар3;

   Пар1 = 40;

   Возврат Лок;

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

Глоб = 123;

А = 10;

Рез = МояФункция(А, 6, 7); // Вызов функции

// Здесь Рез = 146, а переменная А = 10, несмотря на то, что в теле

// функции значение параметра Пар1 изменено на 40

Передача локального контекста программного модуля в качестве параметра

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

Пример:

· Допустим, у нас есть несколько различных документов, причем у всех есть реквизит Склад. В каждом программном модуле формы редактирования документа нужна процедура выбора склада. В глобальном программном модуле напишем процедуру:

Процедура УстСклада(Конт) Экспорт

   // создаем объект типа справочник

   Скл = СоздатьОбъект(Справочник.Склады);

   // вызываем диалог для выбора элемента Справочника

   Скл.Выбрать(Выберите Склад, );

   Если Скл.Выбран() = 1 Тогда

      // если в диалоге элемент Справочника был выбран,

      // то присваиваем его значение реквизиту Документа,

      // который доступен по локальному контексту

      Конт.Склад = Скл.ТекущийЭлемент();

   КонецЕсли;

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

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

Конт.Склад = Скл.ТекущийЭлемент();

· Теперь в любом программном модуле конфигурации (в данном примере в любом Модуле формы документа) для выбора склада можно вызвать про­цедуру, передав ей свой локальный контекст в качестве параметра:

УстСклад(Контекст);

Пример исходного текста программного модуля Перем ФлагПроводки; // Флаг проведения Документа

Перем ФлагИзменения; // Флаг изменения Документа

//————————————————————————————————————————————————

Функция КонтрольОстатка()

   // Функция возвращает текущее значение остатка товара на складе

   Ост = Регистр.ОстаткиТоваров.Остаток(Склад, Товар, ОстатокТовара);

   Возврат Ост;

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

//————————————————————————————————————————————————

Процедура УстФлагИзм()

   ФлагИзменения = 1;

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

//————————————————————————————————————————————————

Процедура ВводНового()

   // предопределенная процедура, вызываемая при вводе нового документа

   // установим дату Документа

   ДатаДок = РабочаяДата();

   // установим реквизиты Документа (по умолчанию)

   ТипНакладной = Перечисление.ТипыНакладных.Перемещение;

   Фирма = Константа.ДефФирма;

   Склад = Константа.ДефСклад;

   СкладПолучатель = Константа.ДефСклад;

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

//————————————————————————————————————————————————

Процедура ВыходноеСообщение()

   // процедура, которую мы будем вызывать при нажатии кнопки ОК

   Если (ФлагПроводки = 1) И (ФлагИзменения = 1) Тогда

      Предупреждение(Проведенный Документ был изменен! При

            | сохранении обязательно проведите Документ снова!);

   КонецЕсли;

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

//————————————————————————————————————————————————

// При входе в Форму запомним промежуточные переменные

ФлагПроводки = Проведен();

ФлагИзменения = 0;


Содержание раздела