bsl-language-server icon indicating copy to clipboard operation
bsl-language-server copied to clipboard

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

Open artbear opened this issue 3 years ago • 3 comments

Описание проблемы, ошибки, которую надо диагностировать

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

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

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

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

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

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

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

Примеры

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

&НаКлиенте
Процедура ВставитьИзБуфераОбменаЗавершение(НайденныеОбъекты, ПараметрыВыполнения) Экспорт
	
	Если НайденныеОбъекты = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ВставитьИзБуфераОбменаЗавершениеСервер(НайденныеОбъекты);
	
КонецПроцедуры

&НаСервере
Процедура ВставитьИзБуфераОбменаЗавершениеСервер(НайденныеОбъекты)
	// входная коллекция НайденныеОбъекты не меняется и поэтому нет смысла дополнительно возвращать ее с клиента

	Для Каждого Значение Из НайденныеОбъекты Цикл
		ВыбранныеПользователиИГруппы.Добавить().Пользователь = Значение;
	КонецЦикла;
	Пользователи.ЗаполнитьНомераКартинокПользователей(ВыбранныеПользователиИГруппы, "Пользователь", "НомерКартинки");

КонецПроцедуры

Ссылка на источник, подтверждающее нарушение либо обоснование наличия проблемы

Параметры диагностики

Тип Статья на русском

  • [ ] :ant: Ошибка
  • [ ] :cop: Уязвимость
  • [ ] :guardsman: Потенциальная уязвимость
  • [x] :poop: Качество кода
  • [ ] :trollface: Другое

Важность Статья на русском

  • [ ] :broken_heart: Блокирующая / Blocker
  • [ ] :heart: Критическая / Critical
  • [x] :yellow_heart: Важная / Major
  • [ ] :blue_heart: Незначительная / Minor
  • [ ] :green_heart: Информационная / Info
  • [ ] :revolving_hearts: Другое

Тэги Статья на русском

  • [x] STANDARD - "Нарушение стандартов 1С"
  • [ ] LOCKINOS - "Не будет работать в другой ОС"
  • [ ] SQL - "Проблема с запросом"
  • [x] PERFORMANCE - "Проблема производительности"
  • [ ] BRAINOVERLOAD - "Непонятный код"
  • [x] BADPRACTICE - "Плохая практика программирования"
  • [ ] CLUMSY - "Излишние действия"
  • [ ] DESIGN - "Ошибка в проектировании"
  • [ ] SUSPICIOUS - "Подозрительный код"
  • [ ] UNPREDICTABLE - "Непредсказуемо работающий код"
  • [ ] DEPRECATED - "Устаревшая функциональность"
  • [ ] ERROR - "Ошибочная конструкция"
  • [ ] LOCALIZE - "Проблемы локализации"

Время на исправление (минут)

2

Дополнительная информация

artbear avatar Jul 19 '22 05:07 artbear

@nixel2007 @theshadowco закрепите за мной, правило реализовано. ПР сделаю.

artbear avatar Jul 19 '22 05:07 artbear

TODO перенесены в https://github.com/1c-syntax/bsl-language-server/issues/2972

artbear avatar Dec 24 '22 11:12 artbear