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

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

Кратко

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

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

Поле Значение
Код правила BSL254
Совместимый псевдоним TransferringParametersBetweenClientAndServer
Серьёзность WARNING
Включено по умолчанию Да
Реализовано Да
Теги performance, design

Поведение

  • Публичный идентификатор 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": "КэшированныеЗначения,КэшДанных"
  }
}

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

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

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

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

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

Источники