Основная страница

Глава 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;






Перейти  к оглавлению: Описание встроенного языка