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

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

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

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

метод РассчитатьИтог(): Строка
пер Сумма = ПолучитьСумму()
возврат "Всего потрачено: $Сумма"
;

метод ПолучитьСумму(): Число
пер МассивТрат = [1500, 3000, 2500, 700]
пер Сумма = 0

для Индекс = 0 по МассивТрат.Размер() - 1
Сумма += МассивТрат[Индекс]
;

возврат Сумма
;

В данном примере обратим внимание на переменные Сумма, объявленные в обоих методах. Область видимости каждой из них — это только тот метод, в котором они объявлены. Если переменная Сумма будет объявлена в одном методе несколько раз, это вызовет ошибку:

метод РассчитатьИтог(Сумма: Число): Строка
// Переменная с именем Сумма уже определена в параметрах метода
пер Сумма = ПолучитьСумму()
возврат "Всего потрачено: $Сумма"
;

Типы области видимости

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

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

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

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

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

метод ОпределитьПроизведения(Фамилия: Строка): Массив<Строка>
// Область видимости переменной Автор распространяется до конца метода
пер Автор = Фамилия
если Автор == "Пушкин"
пер Книги: Массив<Строка> = ["Евгений Онегин", "Капитанская дочка", "Руслан и Людмила"]
// Видимые переменные: Автор, Книги
возврат Книги
иначе если Автор == "Бетховен"
пер Сонаты: Массив<Строка> = ["Лунная", "Патетическая", "Аппассионата"]
// Видимые переменные: Автор, Сонаты
возврат Сонаты
иначе
область
пер СписокКомпозиторов: Массив<Строка> = ["Моцарт", "Бах", "Чайковский"]
// Видимые переменные: Автор, СписокКомпозиторов
для Индекс = 0 по СписокКомпозиторов.Размер() - 1
// Видимые переменные: Автор, СписокКомпозиторов, Индекс
;
// Видимые переменные: Автор, СписокКомпозиторов
;
область
пер СписокХудожников: Массив<Строка> = ["Репин", "Айвазовский", "Шишкин"]
// Видимые переменные: Автор, СписокХудожников
возврат СписокХудожников
;
// Видимые переменные: Автор
;
;

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

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

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