Параметры процедур и функций

#std640

Область применения: управляемое приложение, мобильное приложение, обычное приложение.

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

2. Не следует использовать вместо параметров функций другие средства конфигурирования (переменные модулей, реквизиты формы и т.п.)

3. Параметры в функции должны идти в логической последовательности. Рекомендуется располагать параметры по принципу от общего к частному.
Например, неправильно:

Процедура ПересчитатьСуммуДокумента(ИмяПоляСумма, ДокументОбъект, СуммаВключаетНДС = Истина)
 
Процедура ПоменятьЦветПоляФормы(Цвет, ИмяПоля, Форма)

правильно сначала расположить основные параметры ДокументОбъект и Форма:

Процедура ПересчитатьСуммуДокумента(ДокументОбъект, ИмяПоляСумма, СуммаВключаетНДС = Истина)
 
Процедура ПоменятьЦветПоляФормы(Форма, ИмяПоля, Цвет)

4. Необязательные параметры (параметры со значениями по умолчанию) должны располагаться после обязательных параметров (без значений по умолчанию).
Например:

Функция КурсВалютыНаДату(Валюта, Дата = Неопределено) Экспорт

5. Не рекомендуется объявлять в функциях много параметров (нужно ориентироваться на количество не более семи параметров), при этом не должно быть много параметров со значениями по умолчанию (нужно ориентироваться на количество не более трех таких параметров). В противном случае, читаемость вызывающего кода сильно снижается. Например, можно легко ошибиться в количестве запятых при передаче необязательных параметров.

При необходимости передавать в функцию большое число параметров рекомендуется:

Например, неправильно:

// Добавляет новое поле на форму, инициализирует его значениями по умолчанию.
Функция ДобавитьПолеФормы(ИмяПоля, Заголовок = Неопределено, ОбработчикПриИзменении = "", ОбработчикНачалоВыбора = "", ШиринаПоля,
      ЦветФона = Неопределено, ЦветФонаЗаголовка = Неопределено, Родитель = Неопределено, КартинкаШапки = Неопределено, ПутьКДанным = Неопределено,
      ТолькоПросмотрПоля = Ложь, СвязиПараметровВыбора = Неопределено)
…
КонецФункции

// вызывающий код
НовоеПоле = ДобавитьПолеФормы("СтараяЦена", НСтр("ru='Цена'"),,, 12, ЦветФона, ЦветЗаголовка, НоваяГруппа,,,Истина);
НовоеПоле.ЦветТекста = WebЦвета.Серый;

Правильно пересмотреть логику работы функций, оставив в ней только один ключевой параметр ИмяПоля:

// Добавляет новое поле на форму, инициализирует его значениями по умолчанию.
Функция НовоеПолеФормы(ИмяПоля)  
…
КонецФункции

// вызывающий код
НовоеПоле = НовоеПолеФормы("СтараяЦена");
НовоеПоле.Заголовок  = НСтр("ru='Цена'");
НовоеПоле.ЦветФона   = ЦветФона;
НовоеПоле.ЦветТекста = WebЦвета.Серый;
НовоеПоле…. = …
…

Другой пример. Неправильно:

// Создает элемент справочника "Номенклатура"
Процедура СоздатьЭлементНоменклатуры(Наименование, ТоварУслуга, ЕдиницаИзмерения, ВесНетто, ПроверятьУникальность = Истина)
…
КонецПроцедуры

Правильно сгруппировать параметры, описывающие значения реквизитов номенклатуры, в структуру ЗначенияРеквизитов:

// Создает элемент справочника "Номенклатура"
Процедура СоздатьЭлементНоменклатуры(ЗначенияРеквизитов, ПроверятьУникальность = Истина)
…
КонецПроцедуры

6. При вызове функций необходимо избегать громоздких конструкций, которые приводят к снижению читаемости кода, увеличивают вероятность ошибок и затрудняют отладку.
В частности:

6.1. Не рекомендуется при передаче параметров в одну функцию применять вложенные вызовы других функций.
Неправильно:

СтруктураВложений.Вставить(ПрисоединенныйФайл.Наименование,
 Новый Картинка(ПолучитьИзВременногоХранилища(ПрисоединенныеФайлы.ПолучитьДанныеФайла(ПрисоединенныйФайл.Ссылка).СсылкаНаДвоичныеДанныеФайла)));

Правильно разбивать такие вызовы на отдельные операторы с помощью вспомогательных локальных переменных:

АдресФайлаИзображения = ПрисоединенныеФайлы.ПолучитьДанныеФайла(ПрисоединенныйФайл.Ссылка).СсылкаНаДвоичныеДанныеФайла;
ДанныеИзображения = Новый Картинка(ПолучитьИзВременногоХранилища(АдресФайлаИзображения));
СтруктураВложений.Вставить(ПрисоединенныйФайл.Наименование, ДанныеИзображения);

В то же время, если код с вложенными вызовами получается компактным (не требует переноса выражений) и легко читаемым, то вложенные вызовы допустимы.
Например:

Предупреждение(НСтр("ru='Для выполнения операции необходимо установить расширение работы с файлами.'"));

ПеречитатьСуммуПоКурсу(Сумма, КурсВалютыНаДату(Валюта));

6.2. Также не рекомендуется при вызове функций использовать вложенный конструктор структуры: Новый Структура(...). Вложенное объявление структуры допустимо только в тех случаях, когда количество ее свойств небольшое (нужно ориентироваться на количество свойств не более трех).

Неправильно:

ЗаполнитьЦены(Объект.Товары, , Новый Структура("Дата, Валюта, Соглашение, ПоляЗаполнения",
   Объект.Дата, Объект.Валюта, Объект.Соглашение, "Цена, СтавкаНДС, ВидЦены, СрокПоставки"),
  Новый Структура("ПересчитатьСумму, ПересчитатьСуммуСНДС, ПересчитатьСуммуНДС, ПересчитатьСуммуРучнойСкидки, ОчиститьАвтоматическуюСкидку, ОчиститьСуммуВзаиморасчетов",
   "КоличествоУпаковок", СтруктураПересчетаСуммы, СтруктураПересчетаСуммы, "КоличествоУпаковок", Неопределено, Неопределено));

Правильно:

ПараметрыЗаполнения = Новый Структура;
ПараметрыЗаполнения.Вставить("Дата", Объект.Дата);
ПараметрыЗаполнения.Вставить("Валюта", Объект.Валюта);
ПараметрыЗаполнения.Вставить("Соглашение", Объект.Соглашение);
ПараметрыЗаполнения.Вставить("ПоляЗаполнения", "Цена, СтавкаНДС, ВидЦены, СрокПоставки");
 
ДействияСИзмененнымиСтроками = Новый Структура;
ДействияСИзмененнымиСтроками.Вставить("ПересчитатьСумму","КоличествоУпаковок");
ДействияСИзмененнымиСтроками.Вставить("ПересчитатьСуммуСНДС", ПараметрыПересчетыСуммы);
ДействияСИзмененнымиСтроками.Вставить("ПересчитатьСуммуНДС", ПараметрыПересчетыСуммы);
ДействияСИзмененнымиСтроками.Вставить("ПересчитатьСуммуРучнойСкидки","КоличествоУпаковок");
ДействияСИзмененнымиСтроками.Вставить("ОчиститьАвтоматическуюСкидку");
ДействияСИзмененнымиСтроками.Вставить("ОчиститьСуммуВзаиморасчетов ");

ЗаполнитьЦены(Объект.Товары, ПараметрыЗаполнения, ДействияСИзмененнымиСтроками);

7. При вызове функций не следует пропускать обязательные параметры. В противном случае, в параметр будет передано значение Неопределено, на которое функция может быть не рассчитана. Если же значение Неопределено является допустимым, то нужно или его передавать в функцию явно, или сделать этот параметр необязательным со значением по умолчанию Неопределено.

Например, для вызова процедуры

Процедура ПоменятьЦветПоляФормы(Форма, ИмяПоля, Цвет)

неправильно:

ПоменятьЦветПоляФормы(,"РезультатПроверки", ЦветаСтиля.ПоясняющийОшибкуТекст); // пропущен первый параметр Форма
ПоменятьЦветПоляФормы(,,); // пропущены все обязательные параметры

правильно:

ПоменятьЦветПоляФормы(ЭтотОбъект, "РезультатПроверки", Цвет); // указаны все обязательные параметры

См. также