Синтаксис и применение Передача параметров процедур и функций в платформе 1С:Предприятие. Описание и примеры кода.
Полное описание, параметры и ограничения
Передача параметров процедур и функций
По умолчанию параметры методов, процедур и функций передаются по ссылке, то есть изменение внутри процедуры или функции значения формального параметра ведет к изменению значения соответствующего фактического параметра. При передаче параметра по значению изменение значения формального параметра никак не влияет на фактический параметр вызова процедуры. Для указания того, что тот или иной параметр следует передавать по значению, следует в исходном тексте процедуры или функции перед именем параметра записать ключевое слово Знач.
Если параметру задано значение по умолчанию, и он является последним в списке, то при вызове процедуры его можно опускать в списке передаваемых фактических параметров и не ставить запятую перед опущенным параметром.
Если параметру не задано значения по умолчанию, то при вызове процедуры его можно опускать в списке передаваемых фактических параметров, но разделительную запятую надо ставить.
Если параметр при вызове процедуры опущен, то он принимает либо установленное по умолчанию значение (если оно есть) либо значение Неопределено.
Если при вызове метода, процедуры или функции параметры не передаются (пустой список параметров), то, тем не менее, круглые скобки обязательно требуется ставить.
Пример:
Перем Глоб;
// Описание функции
Функция МояФункция(Знач Пар1, Пар2, Пар3) Экспорт
Лок = Глоб + Пар1 + Пар2 + Пар3;
Пар1 = 40;
Возврат Лок;
КонецФункции;
// Описание процедуры
Процедура МояПроцедура(Пар1, Пар2, Пар3) Экспорт
Лок = Глоб + Пар1 + Пар2 + Пар3;
Пар1 = 40;
КонецПроцедуры;
Глоб = 100;
А = 10;
Рез = МояФункция(А, 10, 10); // Вызов функции
// Здесь Рез = 130, а переменная А = 10, несмотря на то, что в теле
// функции значение параметра Пар1 изменено на 40.
МояПроцедура(А, 10, 10); // Вызов процедуры
// Здесь переменная А = 40, поскольку в теле
// процедуры значение параметра Пар1 изменено на 40.
Практические примеры
Параметры: отличить изменение переменной от изменения объекта
Собственные числовые переменные показывают передачу по ссылке и Знач. Свой массив показывает, почему Знач не равен глубокой копии коллекции.
Где и как запускать
Полный серверный общий модуль учебной базы. Собственные значения в памяти, без чтения или записи рабочих данных.
Подготовка
Используйте отдельную учебную базу без рабочих данных. Создайте серверный общий модуль УчебныйЯзык с флагом Сервер, без Привилегированный.
Вставьте весь модуль выбранного примера, а не одну процедуру внутрь другой. Из своей серверной команды учебной обработки вызовите УчебныйЯзык.ВыполнитьПример().
Все числа, строки и коллекции созданы в самом примере. Документы, регистры, файловая система и сеть не используются; никаких зависимостей от КА2/УНФ/УТ/БП нет.
Браузер показывает код, но не исполняет BSL. Проверки результата нужно выполнить вручную на платформе 8.5.1.1343 в учебной базе.
Процедура ВыполнитьПример() Экспорт
Количество = 3;
ИзменитьКопиюЧисла(Количество);
Сообщить(Количество = 3);
ИзменитьСамоЧисло(Количество);
Сообщить(Количество = 4);
Книги = Новый Массив;
Книги.Добавить("Азбука");
ДобавитьВСобственныйМассив(Книги);
Сообщить(Книги.Количество() = 2);
Сообщить(Книги[1] = "Букварь");
ПодменитьКопиюСсылки(Книги);
Сообщить(Книги.Количество() = 2);
Сообщить(Книги[0] = "Азбука");
КонецПроцедуры
Процедура ИзменитьКопиюЧисла(Знач ЧислоКниг)
ЧислоКниг = ЧислоКниг + 1;
КонецПроцедуры
Процедура ИзменитьСамоЧисло(ЧислоКниг)
ЧислоКниг = ЧислоКниг + 1;
КонецПроцедуры
Процедура ДобавитьВСобственныйМассив(Знач Данные)
Данные.Добавить("Букварь");
КонецПроцедуры
Процедура ПодменитьКопиюСсылки(Знач Данные)
Данные = Новый Массив;
Данные.Добавить("Другой локальный массив");
КонецПроцедурыРазбор по шагам
Для числа с Знач передать копию значения 3. Присваивание 4 локальному параметру не меняет переменную вызывающей процедуры.
Без Знач формальный параметр связан с переданной переменной: присваивание внутри изменяет исходное Количество на 4.
Создать собственный массив с Азбука. В параметр Знач передаётся значение ссылки на тот же массив, а не независимая глубокая копия.
Вызов Добавить меняет объект массива, поэтому Букварь виден вызывающему коду несмотря на Знач.
Присваивание параметру другого Нового Массив с Знач заменяет только локальную ссылку. Исходные два элемента остаются в прежнем объекте.
Как проверить результат
Шесть сообщений Истина. После первого вызова число 3, после второго 4; исходный массив по завершении содержит Азбука/Букварь.
Поставьте точку останова перед каждым вызовом и сравните переменную и состав массива после возврата. Не переносите эту проверку на рабочие объекты документов.
Ожидаемый результат
Передача по значению показана отдельно для примитива и собственного изменяемого объекта, без заявления о несуществующей глубокой копии.
На что обратить внимание
Знач защищает от переприсваивания параметра вызывающей переменной, но не делает переданный изменяемый объект неизменяемым.
Отличайте Данные.Добавить от Данные = Новый Массив: первое меняет объект, второе — значение переменной ссылки.
Асинхронные функции имеют свои правила: их параметры всегда передаются по значению. Этот урок использует обычные синхронные процедуры.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Значения по умолчанию: пропустить количество, сохранив место скидки
Собственная функция рассчитывает стоимость книг со скидкой. Пропущенный средний аргумент и явно переданное Неопределено разобраны отдельно.
Где и как запускать
Полный серверный общий модуль учебной базы. Собственные значения в памяти, без чтения или записи рабочих данных.
Подготовка
Используйте отдельную учебную базу без рабочих данных. Создайте серверный общий модуль УчебныйЯзык с флагом Сервер, без Привилегированный.
Вставьте весь модуль выбранного примера, а не одну процедуру внутрь другой. Из своей серверной команды учебной обработки вызовите УчебныйЯзык.ВыполнитьПример().
Все числа, строки и коллекции созданы в самом примере. Документы, регистры, файловая система и сеть не используются; никаких зависимостей от КА2/УНФ/УТ/БП нет.
Браузер показывает код, но не исполняет BSL. Проверки результата нужно выполнить вручную на платформе 8.5.1.1343 в учебной базе.
Процедура ВыполнитьПример() Экспорт
Сообщить(УчебнаяСуммаСоСкидкой(100, 3) = 300);
Сообщить(УчебнаяСуммаСоСкидкой(100) = 100);
Сообщить(УчебнаяСуммаСоСкидкой(100, , 10) = 90);
Сообщить(УчебнаяСуммаСоСкидкой(100, Неопределено, 10) = 90);
Сообщить(УчебнаяСуммаСоСкидкой(100, 3, 10) = 270);
ОшибкаОбработана = Ложь;
Попытка
Сообщить(УчебнаяСуммаСоСкидкой(100, 0, 10));
Исключение
ОшибкаОбработана = Истина;
КонецПопытки;
Сообщить(ОшибкаОбработана);
КонецПроцедуры
Функция УчебнаяСуммаСоСкидкой(Знач Цена, Знач Количество = 1, Знач Скидка = 0)
Если Количество = Неопределено Тогда
Количество = 1;
КонецЕсли;
Если ТипЗнч(Цена) <> Тип("Число") Или ТипЗнч(Количество) <> Тип("Число") Или ТипЗнч(Скидка) <> Тип("Число") Тогда
ВызватьИсключение "Цена, количество и скидка должны быть числами";
КонецЕсли;
Если Цена < 0 Или Количество < 1 Или Количество <> Цел(Количество) Или Скидка < 0 Или Скидка > 100 Тогда
ВызватьИсключение "Неверные параметры собственного учебного расчёта";
КонецЕсли;
Возврат Цена * Количество * (100 - Скидка) / 100;
КонецФункцииРазбор по шагам
Цена обязательна. Количество по умолчанию 1, скидка по умолчанию 0 процентов: вызов с одной ценой даёт 100.
В вызове (100, , 10) пустое второе место сохраняет позицию третьего аргумента. Для количества действует его заданное значение по умолчанию 1.
Явное Неопределено не считается пропущенным аргументом. Собственная функция отдельно обрабатывает его, присваивая 1.
Проверить числовые типы до сравнений. Затем отклонить нулевое/дробное количество, отрицательную цену и скидку вне 0–100.
Для 100×3 со скидкой 10% вычислить 270. Последний вызов с количеством 0 должен перейти в обработчик, а не вернуть 0 как успешную сумму.
Как проверить результат
Шесть сообщений Истина, включая обработку недопустимого нулевого количества.
Сравните (100, 10) и (100, , 10): первое — десять книг без скидки, итог 1000; второе — одна книга со скидкой 10%, итог 90.
Ожидаемый результат
Полный расчёт раскрывает порядок аргументов, значения по умолчанию, пропуск средней позиции и явную обработку Неопределено.
На что обратить внимание
Не удаляйте разделительную запятую, если требуется пропустить аргумент перед следующим: иначе скидка попадёт в количество.
Значение по умолчанию — часть сигнатуры. Оно не исправляет явный 0, строку или другое ошибочное значение.
Учебная цена и проценты не определяют правила бухгалтерского округления. Для настоящих документов нужна политика конкретной конфигурации.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.