Перейти к основному содержимому

Область видимости имен

Область видимости — это часть исходного текста программы, в пределах которой имя некоторой программной сущности (обычно переменной, типа данных или метода) остается связанным с этой сущностью. Другими словами, это та часть программы, где какое-либо имя однозначно связано с типом «1С:Шины». В рамках одной области видимости не может существовать нескольких одинаковых имен. Область видимости — это свойство времени компиляции программы.

Рассмотрим пример:

метод Скрипт()
пер А = Метод1()
;

метод Метод1(): Число
пер Б: Число
Б = 1
возврат Б
;

В данном примере обратим внимание на переменную Б, объявленную в методе Метод1. Область видимости этой переменной — это метод Метод1, и только он. Если переменная Б будет объявлена где-то еще, это будет другая переменная, в другой области видимости.

В языке существует несколько типов областей видимости:

  • Глобальная область видимости. Переменные с глобальной областью видимости доступны из любой точки программы в любом модуле. К глобальной области видимости относятся свойства глобального контекста и перечисления. В рамках этой области видимости действуют приоритеты пространства имен.
  • Область видимости модуля. К этой области видимости относятся константы, объявленные в начале модуля. Имя переменной модуля не должно совпадать с именем ранее объявленной переменной в том же модуле или с именем глобальной переменной.
  • Область видимости блока кода. К данной области видимости относятся переменные, объявленные в теле метода в пределах блока кода. Переменная, объявленная в блоке кода, имеет видимость от места объявления и до конца блока. Метод является блоком кода, параметры метода включены в его область видимости. Может быть вложенной в другую область видимости блока кода. Блоки кода образуются как различными секциями блочных инструкций (если, для и т. д.), так и ключевым словом область.

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

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

В качестве демонстрации различных областей видимости можно привести следующий пример:

метод Скрипт()
пер Фамилия: Строка
Фамилия = Консоль.СчитатьСтроку("Введите фамилию: ")
// Область видимости переменной "Фамилия" распространяется до конца метода
если Фамилия == "Пушкин"
пер Книги: Массив<Строка>
// Видимые переменные: Фамилия, Книги
иначе если Фамилия == "Бетховен"
пер Сонаты: Массив<Строка>
// Видимые переменные: Фамилия, Сонаты
иначе
область
пер СписокКомпозиторов: Массив<Строка>
// Видимые переменные: Фамилия, СписокКомпозиторов
для Композитор из СписокКомпозиторов
// Видимые переменные: Фамилия, СписокКомпозиторов, Композитор
;
// Видимые переменные: Фамилия, СписокКомпозиторов
;
область
пер СписокКонтактов: Массив<Строка>
// Видимые переменные: Фамилия, СписокКонтактов
;
// Видимые переменные: Фамилия
;
;

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

конст СтроковаяКонстанта = "Значение инициализации"

метод Скрипт()
пер СтроковаяКонстанта = "Перекрытие в методе возможно"
область
пер СтроковаяКонстанта = "Перекрытие в области уже невозможно"
;
;