BSL254 — Передача параметров между клиентом и сервером¶
Кратко¶
Передача параметров между клиентом и сервером
Идентификаторы¶
| Поле | Значение |
|---|---|
| Код правила | BSL254 |
| Совместимый псевдоним | TransferringParametersBetweenClientAndServer |
| Серьёзность | WARNING |
| Включено по умолчанию | Да |
| Реализовано | Да |
| Теги | performance, design |
Поведение¶
- Публичный идентификатор
BSL254и псевдонимTransferringParametersBetweenClientAndServerстабильны. - Правило сообщает о случаях, описанных на этой странице.
- Подавления и проектная конфигурация применяются до публикации результата.
- Для выполнения правила не требуется внешний анализатор или сетевой доступ.
Настройка и подавление¶
Код BSL### — основной стабильный идентификатор. Совместимый псевдоним
принимается в select, ignore и совместимых блоковых комментариях.
Все три семейства подавлений работают для текущей строки и диапазона. Если открывающий комментарий стоит после кода, он действует только на эту строку. Используйте любой один вариант:
noqa:
bsl-disable(совместимый вариант):
- совместимый
BSLLS-вариант:
Если тот же открывающий комментарий стоит на отдельной строке, он начинает диапазон. Закройте его парным маркером того же семейства:
// 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"; ПарамСоЗнач = "Изменено2"; Коллекция.Вставить("Ключ1", "Изменено1"); КоллекцияСоЗнач.Вставить("Ключ2", "Изменено2"); КонецПроцедуры &НаКлиенте Процедура ПередачаПараметров(Команда) Парам1 = "Исходное1"; ПарамСоЗнач = "Исходное2"; Коллекция = Новый Структура("Ключ1", "Исходное1"); КоллекцияСоЗнач = Новый Структура("Ключ2", "Исходное2"); ПередачаПараметровНаСервер(Парам1, ПарамСоЗнач, Коллекция, КоллекцияСоЗнач); Шаблон = "после сервера %1 = <%2>"; Сообщить(СтрШаблон(Шаблон, "Парам1", Парам1)); Сообщить(СтрШаблон(Шаблон, "ПарамСоЗнач", ПарамСоЗнач)); Сообщить(СтрШаблон(Шаблон, "Коллекция.Ключ1", Коллекция.Ключ1)); Сообщить(СтрШаблон(Шаблон, "КоллекцияСоЗнач.Ключ2", КоллекцияСоЗнач.Ключ2)); КонецПроцедуры -
Пример неточной передачи параметров
&НаКлиенте Процедура ГруппыПользователейПеретаскиваниеЗавершение(Ответ, ДополнительныеПараметры) Экспорт Если Ответ = КодВозвратаДиалога.Нет Тогда Возврат; КонецЕсли; СообщениеПользователю = ПеремещениеПользователяВНовуюГруппу( ДополнительныеПараметры.ПараметрыПеретаскивания, ДополнительныеПараметры.Строка, ДополнительныеПараметры.Перемещение); КонецПроцедуры // входные параметры МассивПользователей и остальные параметры не меняются // и поэтому нет смысла дополнительно возвращать их с сервера &НаСервере Функция ПеремещениеПользователяВНовуюГруппу(МассивПользователей, НоваяГруппаВладелец, Перемещение) Если НоваяГруппаВладелец = Неопределено Тогда Возврат Неопределено; КонецЕсли; ТекущаяГруппаВладелец = Элементы.ГруппыПользователей.ТекущаяСтрока; СообщениеПользователю = ПользователиСлужебный.ПеремещениеПользователяВНовуюГруппу( МассивПользователей, ТекущаяГруппаВладелец, НоваяГруппаВладелец, Перемещение); Элементы.ПользователиСписок.Обновить(); Элементы.ГруппыПользователей.Обновить(); Возврат СообщениеПользователю; КонецФункции
Параметры¶
cachedValueNames¶
Тип: Строка
Значение по умолчанию: `` (пустая строка)
Список имен параметров, разделенных запятыми, которые должны игнорироваться диагностикой, если в модуле существует переменная с таким же именем и директивой компиляции &НаКлиенте.
Это полезно для кэшируемых значений, которые специально передаются с сервера на клиент для хранения в переменных модуля формы.
Пример:
{
"TransferringParametersBetweenClientAndServer": {
"cachedValueNames": "КэшированныеЗначения,КэшДанных"
}
}
Если в коде есть объявление:
То следующий код не будет генерировать замечание:
&НаКлиенте
Процедура ПриИзмененииРеквизита()
ОбновитьКэш(КэшированныеЗначения);
КонецПроцедуры
&НаСервере
Процедура ОбновитьКэш(КэшированныеЗначения)
КэшированныеЗначения = ПолучитьДанныеНаСервере();
КонецПроцедуры