Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
1C_pr77_Lang1.doc
Скачиваний:
12
Добавлен:
20.11.2019
Размер:
2.43 Mб
Скачать

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

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

Пример:

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

Процедура А(Парам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 Тогда

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

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

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

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

КонецЕсли;

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

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

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

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

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]