При изучении чужого программного кода или при написании собственных процедур и функций у начинающих разработчиков часто возникает вопрос: почему имя параметра внутри метода не совпадает с именем переменной, которую мы передаем в этот метод при вызове? Давайте разберем эту ситуацию подробно, чтобы понять, как устроена передача данных в платформе 1С:Предприятие.
Для того чтобы разобраться в сути проблемы, необходимо ввести два ключевых термина, принятых в программировании:
Платформа 1С при вызове метода просто берет значение (или ссылку на объект) из фактического параметра и «кладет» его в область памяти, отведенную под формальный параметр. Процедуре абсолютно не важно, как переменная называлась «снаружи». Она будет работать с ней по тому имени, которое вы прописали внутри самого метода.
Представим, что у нас есть универсальная процедура для обработки информации о сотруднике. Рассмотрим, как это выглядит в коде:
Процедура ОбработатьСотрудника(Сотрудник)
// Внутри метода мы всегда работаем с переменной Сотрудник
Сообщить("Обработка данных: " + Сотрудник.Наименование);
КонецПроцедуры
// Место вызова 1
ВыбранныйСотрудник = Справочники.Сотрудники.НайтиПоКоду("001");
ОбработатьСотрудника(ВыбранныйСотрудник);
// Место вызова 2
ТекСотрудник = Объект.Руководитель;
ОбработатьСотрудника(ТекСотрудник);
В данном примере мы видим, что процедура ОбработатьСотрудника написана максимально обобщенно. Она ожидает на вход некоего Сотрудника. В первом случае мы передаем в нее ВыбранныйСотрудник, во втором — ТекСотрудник. Это позволяет использовать один и тот же алгоритм в разных контекстах, что является важным принципом чистого кода.
Важно помнить, что формальные параметры создают свою собственную область видимости, ограниченную телом метода. Имена переменных внутри разных методов никак не взаимодействуют друг с другом. Однако здесь есть нюанс, который стоит учитывать — затенение переменных (Shadowing).
Если внутри процедуры вы назовете параметр точно так же, как глобальную переменную модуля или реквизит формы, то внутри этой процедуры приоритет будет у локального параметра. Это не считается ошибкой платформы, но часто приводит к логическим ошибкам в коде, так как вы можете случайно «перекрыть» доступ к глобальным данным.
Посмотрим, к чему это может привести:
Перем Сотрудник Экспорт; // Глобальная переменная модуля
Процедура ВыполнитьДействие(Сотрудник)
// Здесь Сотрудник — это параметр, а не глобальная переменная
// Любые изменения переменной Сотрудник не затронут глобальную область
КонецПроцедуры
Рекомендуется выбирать такие имена для параметров, которые не конфликтуют с глобальными данными, чтобы код был предсказуемым и легко читаемым.
При анализе параметров нельзя забывать про то, как именно передаются данные в 1С:
Сотрудник.Наименование = "Новое Имя") будут видны и «снаружи», так как вы работаете с тем же самым объектом в оперативной памяти.В профессиональной разработке использование разных имен для параметров и переменных — это скорее плюс, чем минус. Это позволяет писать более универсальный и «говорящий» код. Придерживайтесь следующих правил при именовании:
ДатаНачала, СуммаДокумента).Теперь, когда вы видите, что имена различаются, вы можете быть уверены: это абсолютно нормальная практика, направленная на удобство сопровождения и гибкость вашего программного кода.