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

BSL254 - Передача параметров между клиентом и сервером

Кратко

Передача параметров между клиентом и сервером

Идентификаторы

Поле Значение
Код правила BSL254
Совместимый псевдоним TransferringParametersBetweenClientAndServer
Серьёзность WARNING
Без конфигурации Да
BSLLS JSON, режим ON без переопределений Да
Флаг реестра implemented Да
Теги performance, design

Флаг implemented отражает реестр и не подтверждает проверенное совпадение с BSLLS.

Поведение

  • Публичный идентификатор BSL254 и псевдоним TransferringParametersBetweenClientAndServer стабильны.
  • Правило сообщает о случаях, описанных на этой странице.
  • Подавления и проектная конфигурация применяются до публикации результата.
  • Для выполнения правила не требуется внешний анализатор или сетевой доступ.

Настройка и подавление

Код BSL### - основной стабильный идентификатор. Совместимый псевдоним принимается в select, ignore и совместимых блоковых комментариях.

[tool.onec-hbk-bsl]
select = ["BSL254"]
ignore = ["TransferringParametersBetweenClientAndServer"]

Все три семейства подавлений работают для текущей строки и диапазона. Если открывающий комментарий стоит после кода, он действует только на эту строку. Используйте любой один вариант:

  • noqa:
Значение = "пример";  // noqa: BSL254
  • bsl-disable (совместимый вариант):
Значение = "пример";  // bsl-disable: BSL254
  • совместимый BSLLS-вариант:
Значение = "пример";  // BSLLS:TransferringParametersBetweenClientAndServer-off

Если тот же открывающий комментарий стоит на отдельной строке, он начинает диапазон. Закройте его парным маркером того же семейства:

// noqa: BSL254
// код без этой диагностики
// noqa-enable: BSL254

// bsl-disable: BSL254
// код без этой диагностики
// bsl-enable: BSL254

// BSLLS:TransferringParametersBetweenClientAndServer-off
// код без этой диагностики
// BSLLS:TransferringParametersBetweenClientAndServer-on

Чтобы отключить правило до конца файла, не добавляйте закрывающий noqa-enable, bsl-enable или BSLLS:…-on.

Открывающий и закрывающий маркеры должны принадлежать одному семейству.

Описание диагностики

При передаче управления с клиента на сервер (и обратно) всегда передаются копии параметров.

  • При вызове серверной процедуры или функции с клиента происходит создание копии фактического параметра и передача этой копии на сторону сервера.
  • При возврате управления с сервера на клиента также происходит создание копии формального параметра (с которым происходила работы в вызванной процедуре или функции) для передачи обратно на клиента.

Если формальный параметр указан с модификатором Знач, то значение параметра будет передаваться только при вызове процедуры или функции и не будет передаваться обратно при возврате управления на клиента.

Возможные сценарии:

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

В итоге отсутствие модификатора Знач при клиент-серверном взаимодействии может привести к ухудшению производительности и выполнению лишней\ненужной нагрузки как клиентом, так и сервером.

Текущее правило находит серверные методы, выполняемые из клиентских методов, и выдает замечания на параметры без модификатора Знач, для которых не выполняется установка значения.

Примеры

  1. Пример с передачей параметров с клиента на сервер без "Знач" и со "Знач"

    &НаСервереБезКонтекста
    Процедура ПередачаПараметровНаСервер(Парам1, Знач ПарамСоЗнач, Коллекция, Знач КоллекцияСоЗнач)
        Парам1 = "Изменено1";
        ПарамСоЗнач = "Изменено2";
        Коллекция.Вставить("Ключ1", "Изменено1");
        КоллекцияСоЗнач.Вставить("Ключ2", "Изменено2");
    КонецПроцедуры
    
    &НаКлиенте
    Процедура ПередачаПараметров(Команда)
        Парам1 = "Исходное1";
        ПарамСоЗнач = "Исходное2";
        Коллекция = Новый Структура("Ключ1", "Исходное1");
        КоллекцияСоЗнач = Новый Структура("Ключ2", "Исходное2");
    
        ПередачаПараметровНаСервер(Парам1, ПарамСоЗнач, Коллекция, КоллекцияСоЗнач);
    
        Шаблон = "после сервера %1 = <%2>";
        Сообщить(СтрШаблон(Шаблон, "Парам1", Парам1));
        Сообщить(СтрШаблон(Шаблон, "ПарамСоЗнач", ПарамСоЗнач));
        Сообщить(СтрШаблон(Шаблон, "Коллекция.Ключ1", Коллекция.Ключ1));
        Сообщить(СтрШаблон(Шаблон, "КоллекцияСоЗнач.Ключ2", КоллекцияСоЗнач.Ключ2));
    КонецПроцедуры
    
    Этот код при выполнении покажет следующий результат
    после сервера Парам1 = <Изменено1>
    после сервера ПарамСоЗнач = <Исходное2>
    после сервера Коллекция.Ключ1 = <Изменено1>
    после сервера КоллекцияСоЗнач.Ключ2 = <Исходное2>
    
    Видно, что все параметры, передаваемые через Знач, после выполнения не меняют свои значения, в т.ч. и значения внутри коллекций.

  2. Пример неточной передачи параметров

    &НаКлиенте
    Процедура ГруппыПользователейПеретаскиваниеЗавершение(Ответ, ДополнительныеПараметры) Экспорт
    
        Если Ответ = КодВозвратаДиалога.Нет Тогда
            Возврат;
        КонецЕсли;
    
        СообщениеПользователю = ПеремещениеПользователяВНовуюГруппу(
            ДополнительныеПараметры.ПараметрыПеретаскивания,
            ДополнительныеПараметры.Строка,
            ДополнительныеПараметры.Перемещение);
    
    КонецПроцедуры
    
    // входные параметры МассивПользователей и остальные параметры не меняются
    // и поэтому нет смысла дополнительно возвращать их с сервера
    &НаСервере
    Функция ПеремещениеПользователяВНовуюГруппу(МассивПользователей, НоваяГруппаВладелец, Перемещение)
    
        Если НоваяГруппаВладелец = Неопределено Тогда
            Возврат Неопределено;
        КонецЕсли;
    
        ТекущаяГруппаВладелец = Элементы.ГруппыПользователей.ТекущаяСтрока;
        СообщениеПользователю = ПользователиСлужебный.ПеремещениеПользователяВНовуюГруппу(
            МассивПользователей, ТекущаяГруппаВладелец, НоваяГруппаВладелец, Перемещение);
    
        Элементы.ПользователиСписок.Обновить();
        Элементы.ГруппыПользователей.Обновить();
    
        Возврат СообщениеПользователю;
    
    КонецФункции
    

Параметры

cachedValueNames

Тип: Строка Значение по умолчанию: `` (пустая строка)

Список имен параметров, разделенных запятыми, которые должны игнорироваться диагностикой, если в модуле существует переменная с таким же именем и директивой компиляции &НаКлиенте.

Это полезно для кэшируемых значений, которые специально передаются с сервера на клиент для хранения в переменных модуля формы.

Пример:

{
  "TransferringParametersBetweenClientAndServer": {
    "cachedValueNames": "КэшированныеЗначения,КэшДанных"
  }
}

Если в коде есть объявление:

&НаКлиенте
Перем КэшированныеЗначения; // используется механизмом обработки изменения реквизитов ТЧ

То следующий код не будет генерировать замечание:

&НаКлиенте
Процедура ПриИзмененииРеквизита()
    ОбновитьКэш(КэшированныеЗначения);
КонецПроцедуры

&НаСервере
Процедура ОбновитьКэш(КэшированныеЗначения)
    КэшированныеЗначения = ПолучитьДанныеНаСервере();
КонецПроцедуры

Источники