Область видимости имен
Область видимости — это часть исходного текста программы, в пределах которой имя некоторой программной сущности (обычно переменной, типа данных или метода) остается связанным с этой сущностью. Другими словами, это та часть программы, где какое-либо имя однозначно связано с типом «1С:Шины». В рамках одной области видимости не может существовать нескольких одинаковых имен. Область видимости — это свойство времени компиляции программы.
Рассмотрим пример:
метод Скрипт()
пер А = Метод1()
;
метод Метод1(): Число
пер Б: Число
Б = 1
возврат Б
;
В данном примере обратим внимание на переменную Б
, объявленную в методе Метод1
. Область видимости этой переменной — это метод Метод1
, и только он. Если переменная Б
будет объявлена где-то еще, это будет другая переменная, в другой области видимости.
В языке существует несколько типов областей видимости:
- Глобальная область видимости. Переменные с глобальной областью видимости доступны из любой точки программы в любом модуле. К глобальной области видимости относятся свойства глобального контекста и перечисления. В рамках этой области видимости действуют приоритеты пространства имен.
- Область видимости модуля. К этой области видимости относятся константы, объявленные в начале модуля. Имя перем енной модуля не должно совпадать с именем ранее объявленной переменной в том же модуле или с именем глобальной переменной.
- Область видимости блока кода. К данной области видимости относятся переменные, объявленные в теле метода в пределах блока кода. Переменная, объявленная в блоке кода, имеет видимость от места объявления и до конца блока. Метод является блоком кода, параметры метода включены в его область видимости. Может быть вложенной в другую область видимости блока кода. Блоки кода образуются как различными секциями блочных инструкций (
если
,для
и т. д.), так и ключевым словомобласть
.
Области видимости образуют иерархию. На верху иерархии находится глобальная область видимости, затем область видимости модуля, затем область видимости блока, затем область видимости вложенного блока и т. д. В каждой области видимости доступны переменные, которые объявлены в самой области и во всех родительских областях. При этом, так как блоки кода могут иметь произвольную степень вложенности, области видимости блоков кода также могут иметь произвольную степен ь вложенности.
Ключевое слово область
предназначено для того, чтобы явным образом выделить некоторый блок кода. Области могут быть вложенными.
В качестве демонстрации различных областей видимости можно привести следующий пример:
метод Скрипт()
пер Фамилия: Строка
Фамилия = Консоль.СчитатьСтроку("Введите фамилию: ")
// Область видимости переменной "Фамилия" распространяется до конца метода
если Фамилия == "Пушкин"
пер Книги: Массив<Строка>
// Видимые переменные: Фамилия, Книги
иначе если Фамилия == "Бетховен"
пер Сонаты: Массив<Строка>
// Видимые переменные: Фамилия, Сонаты
иначе
область
пер СписокКомпозиторов: Массив<Строка>
// Видимые переменные: Фамилия, СписокКомпозиторов
для Композитор из СписокКомпозиторов
// Видимые переменные: Фамилия, СписокКомпозиторов, Композитор
;
// Видимые переменные: Фамилия, СписокКомпозиторов
;
область
пер СписокКонтактов: Массив<Строка>
// Видимые переменные: Фамилия, СписокКонтактов
;
// Видимые переменные: Фамилия
;
;
В рамках одного типа областей видимости запрещено иметь объявления, отличающиеся только регистром. В рамках разных типов областей видимости допустимы объявления с одинаковыми именами, а также именами, отличающимися только регистром. Приоритет имеет более вложенное (с точки зрения областей видимости) объявление. Таким образом, становится возможным перекрытие имен: имя в более вложенной области может перекрыть имя, объявленное в родительской области другого типа.
конст СтроковаяКонстанта = "Значение инициализации"
метод Скрипт()
пер СтроковаяКонстанта = "Перекрытие в методе возможно"
область
пер СтроковаяКонстанта = "Перекрытие в области уже невозможно"
;
;