Каталог решений - Стоит ли использовать РеквизитФормыВЗначение

Стоит ли использовать РеквизитФормыВЗначение

Стоит ли использовать РеквизитФормыВЗначение

В наличии

В статье рассматривается вопрос производительности при использовании функции РеквизитФормыВЗначение.

Категория:

Описание

Сам вопрос возник из размышлений: «Что лучше: использовать общий код в модуле объекта для управляемых и неуправляемых формах или все-таки дублировать код для разных форм?» Путем гугления наткнулся на вот эту статью по сабжу, но к сожалению, в в ней вопрос прозводительности не затрагивался.

Итак, я подготовил код и приступил к замерам производительности. Т.к. меня интересует только дополнительные затраты времени на преобразование данных функциями РеквизитФормыВЗначение -> ЗначениеВРеквизитФормы тестовая операция будет простой: изменение текста комментария документа конкатенированием на каждой итерации строки «1». Для тестрования используется самописный документ Квотация. В документе около 40 реквизитов и присутствует ТЧ Товары, но в тестовом документе заполнена всего лишь 1 строка, т.е. объем данных самого тестового документа относительно небольшой. Для каждого варианта кода выполняется 100 итераций. Замер выполняется для тонкого клиента в рамках локальной сети. При работе через браузер картинка для конечного пользователя скорее всего получится более печальной.

Тест 1. 100 вызовов на сервере

 

// в модуле объекта документа
Процедура РасширитьКомментарий() Экспорт
	Комментарий = Комментарий + "1";
КонецПроцедуры

// в модуле управляемой формы
&НаСервере
Процедура РасширитьКомментарий()
	Объект.Комментарий = Объект.Комментарий + "1";
КонецПроцедуры

&НаСервере
Процедура ТестВМодульФормыНаСервере()	
	Объект.Комментарий = "";
	Для Инд = 0 По 99 Цикл	
		РасширитьКомментарий();
	КонецЦикла;	
КонецПроцедуры

&НаКлиенте
Процедура ТестВМодульФормы(Команда)
	ТестВМодульФормыНаСервере();	
	ПоказатьПредупреждение(, "Завершено!");
КонецПроцедуры

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

&НаКлиенте
Процедура ТестВМодульОбъекта(Команда)	
	ТестВМодульОбъектаНаСервере();
	ПоказатьПредупреждение(, "Завершено!");	
КонецПроцедуры

Замер производительности показал

Строка

Кол-во

Время

% Врем

ТестВМодульОбъектаНаСервере();

1

0.940744

89.09

Документ = РеквизитФормыВЗначение(«Объект», Тип(«ДокументОбъект.Квотация»));

100

0.741111

70.18

ТестВМодульФормыНаСервере();

1

0.082241

7.79

ЗначениеВРеквизитФормы(Документ, «Объект»);

100

0.077764

7.36

ПоказатьПредупреждение(, «Завершено!»);

1

0.026787

2.54

ПоказатьПредупреждение(, «Завершено!»);

1

0.006109

0.58

Документ.РасширитьКомментарий();

100

0.002946

0.28

РасширитьКомментарий();

100

0.001812

0.17

Объект.Комментарий = Объект.Комментарий + «1»;

100

0.000912

0.09

Комментарий = Комментарий + «1»;

100

0.000880

0.08

КонецЦикла;

100

0.000409

0.04

* здесь и далее в таблицах замеров приведена лишь шапка замера. Затраты менее 0.01 с. обрезаны

Тест 2. 100 вызовов сервера

 

// в модуле объекта документа
Процедура РасширитьКомментарий() Экспорт
	Комментарий = Комментарий + "1";
КонецПроцедуры

// в модуле управляемой формы
&НаСервере
Процедура РасширитьКомментарий()
	Объект.Комментарий = Объект.Комментарий + "1";
КонецПроцедуры

&НаСервере
Процедура ТестВМодульФормыНаСервере()
	
	РасширитьКомментарий();
	
КонецПроцедуры

&НаКлиенте
Процедура ТестВМодульФормы(Команда)
	Объект.Комментарий = "";
	Для Инд = 0 По 99 Цикл
		ТестВМодульФормыНаСервере();
	КонецЦикла;
	ПоказатьПредупреждение(, "Завершено!");
КонецПроцедуры

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

&НаКлиенте
Процедура ТестВМодульОбъекта(Команда)
	Объект.Комментарий = "";
	Для Инд = 0 По 99 Цикл
		ТестВМодульОбъектаНаСервере();
	КонецЦикла;
	ПоказатьПредупреждение(, "Завершено!");
КонецПроцедуры

Замер производительности показал

Строка

Кол-во

Время

% Врем

ТестВМодульОбъектаНаСервере();

100

7.786877

52.38

ТестВМодульФормыНаСервере();

100

6.145152

41.33

Документ = РеквизитФормыВЗначение(«Объект», Тип(«ДокументОбъект.Квотация»));

100

0.998177

6.71

КонецЦикла;

100

0.502597

3.38

КонецЦикла;

100

0.401119

2.70

ЗначениеВРеквизитФормы(Документ, «Объект»);

100

0.090248

0.61

ТекущийРежим = СоединенияИБ.ПараметрыБлокировкиСеансов();

1

0.014858

0.10

ПоказатьПредупреждение(, «Завершено!»);

1

0.009055

0.06

ПоказатьПредупреждение(, «Завершено!»);

1

0.006647

0.04

РасширитьКомментарий();

100

0.003752

0.03

Документ.РасширитьКомментарий();

100

0.003544

0.02

Объект.Комментарий = Объект.Комментарий + «1»;

100

0.002546

0.02

Комментарий = Комментарий + «1»;

100

0.001131

0.01


Т.е. в данном случае затраты на вызов РеквизитФормыВЗначение присутствуют, но значительно больше времени уходит на каждый вызов сервера с клиента.

Бонус. Тест 3. 100 вызовов на сервере для большого документа

В документе содержится 568 строк в ТЧ Товары. Результаты замеров:

 

Строка

Кол-во

Время

% Врем

ТестВМодульОбъектаНаСервере();

1

16.831681

98.45

Документ = РеквизитФормыВЗначение(«Объект», Тип(«ДокументОбъект.Квотация»));

100

10.072014

58.91

ЗначениеВРеквизитФормы(Документ, «Объект»);

100

3.866123

22.61

ТестВМодульФормыНаСервере();

1

0.228471

1.34

ТекущийРежим = СоединенияИБ.ПараметрыБлокировкиСеансов();

1

0.017236

0.10

ПоказатьПредупреждение(, «Завершено!»);

1

0.010469

0.06

ПоказатьПредупреждение(, «Завершено!»);

1

0.008086

0.05

Документ.РасширитьКомментарий();

100

0.004518

0.03

РасширитьКомментарий();

100

0.001549

0.01

Комментарий = Комментарий + «1»;

100

0.001333

0.01

Объект.Комментарий = Объект.Комментарий + «1»;

100

0.000767

0.00

КонецЦикла;

100

0.000596

0.00

 

Итоги

Разумное использование связки функций РеквизитФормыВЗначение — ЗначениеВРеквизит формы более чем уместно, т.к. позволит устранить дублирование кода при относительно малых затратах (0,007-0,009 с. за вызов). Однако, использовние этой связки лучше избегать в следующих случаях:

1. Вызов осуществляется в цикле (например, при обработке ТЧ)

2. Документ имеет очень сложную структуру с одной или несколькими ТЧ, которые могут содержать несколько десятков и более записей.

has been added to your cart:
Оформление заказа