Перейти к содержанию

Количество необязательных параметров процедуры/функции более 3

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

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

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

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

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

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

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

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

4 . Не рекомендуется объявлять в функциях много параметров (нужно ориентироваться на количество не более семи параметров), при этом не должно быть много параметров со значениями по умолчанию (нужно ориентироваться на количество не более трех таких параметров). В противном случае, читаемость вызывающего кода сильно снижается. Например, можно легко ошибиться в количестве запятых при передаче необязательных параметров. При необходимости передавать в функцию большое число параметров рекомендуется: - группировать однотипные параметры в один или несколько составных параметров типа Структура. Например, в структуры могут быть объединены параметры, описывающие состав и значения полей некоторого объекта (ДанныеЗаполнения, ПараметрыПроведения, ДанныеФайла и т.п.); - либо полностью пересмотреть логику работы функции, например, разделив ее на несколько разных, более простых функций. Например, неправильно: // Добавляет новое поле на форму, инициализирует его значениями по умолчанию.

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

// вызывающий код

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

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

    Функция НовоеПолеФормы(ИмяПоля) 
    …
    КонецФункции

// вызывающий код

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

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

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

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

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

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

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

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

    ЗаполнитьЦены(
    Объект.Товары, // Табличная часть

, // Массив строк или структура отбора

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

Новый Структура( // Структура действий с измененными строками

    "ПересчитатьСумму, ПересчитатьСуммуСНДС, ПересчитатьСуммуНДС, ПересчитатьСуммуРучнойСкидки, ОчиститьАвтоматическуюСкидку, ОчиститьСуммуВзаиморасчетов",
    "КоличествоУпаковок", СтруктураПересчетаСуммы, СтруктураПересчетаСуммы, "КоличествоУпаковок", Неопределено, Неопределено
    )
    );

Правильно:

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

См. также

  • Передача параметров по ссылке и по значению при вызове процедур и функций (статья на ИТС)

Экранирование кода

// sonar:QuantityOptionalArguments:off
// sonar:QuantityOptionalArguments:on