Эту и другие технические статьи написали наши программисты 1С и получили за них премии. Если вы тоже работаете с 1С и любите делиться опытом, приходите разработчиком в Neti →

 

Цель данной статьи показать, как работать со строкой табличной части на сервере без контекста.

Все знают, что серверные без контекстные вызовы намного «легче» серверных вызовов и их использование является оптимальным решением задач. Но иногда программист, не задумываясь о последствиях использует серверный вызов в тех случаях, когда можно было использовать серверный без контекстный вызов, уменьшив тем самым нагрузку на сервер и увеличив производительность системы. Если на форме содержится мало данных, то разница будет почти не заметна и в таком случае неверное нет смысла усложнять код. Но в случае, когда данных много, разница будет очевидна и написанный серверный код нужно будет переделывать.

Как заполнить строку табличной части на сервере без контекста

Разберем случай, когда для решения поставленной задачи нам нужно на сервере обратиться к данным текущей строки. При этом мы будем использовать серверный без контекстный вызов, а потом результаты сравним с серверным вызовом. В качестве демонстрации возьмем простой пример: при изменении номенклатуры получим ее единицу измерения.

Передача типа ДанныеФормыЭлементКоллекции на сервер невозможна:

Как заполнить строку табличной части на сервере без контекста

Оптимальным решением передать текущую строку на сервер будет преобразовать ее в структуру и уже структуру передать на сервер, а уже после выполнения действий со структурой перезаполнить данные текущей строки. Программный код будет выглядеть так:

////////
&НаКлиенте
Процедура ТоварыНоменклатураПриИзменении(Элемент)
	
	ИндексСтроки = Элементы.Товары.ТекущаяСтрока;
	
	// Преобразуем данные текущей строки в структуру
	ДанныеТекущейСтроки = ПреобразоватьДанныеТекущейСтрокиВСтруктуру();
	
	// Получим интересующее нас значение
	ЗаполнитьЕдиницуИзмеренияНоменклатуры(ДанныеТекущейСтроки);
	
	// Изменим значения реквизитов текущей строки
	ЗаполнитьЗначенияСвойств(Объект.Товары[ИндексСтроки], ДанныеТекущейСтроки, "Упаковка");
	
КонецПроцедуры

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

&НаСервереБезКонтекста
Процедура ЗаполнитьЕдиницуИзмеренияНоменклатуры(ДанныеТекущейСтроки)

	ДанныеТекущейСтроки.Упаковка = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ДанныеТекущейСтроки.Номенклатура, "ЕдиницаИзмерения");	

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

• ПреобразоватьДанныеТекущейСтрокиВСтруктуру() – на основании данных текущей строки создается и заполняется структура с теми реквизитами табличной части, которые нам понадобятся для решения задачи.

• ИндексСтроки = Элементы.Товары.ТекущаяСтрока; – получаем идентификатор текущей строки таблицы

• ЗаполнитьЕдиницуИзмеренияНоменклатуры(ДанныеТекущейСтроки); – серверный без контекстный вызов, обращение к БД, поиск единицы измерения номенклатуры. Найденное значение помещается в структуру.

• ЗаполнитьЗначенияСвойств(Объект.Товары[ИндексСтроки], ДанныеТекущейСтроки, “Упаковка”); – изменяем значение «Упаковка» в текущей строке табличной части

А теперь с помощью замера производительности сравним время выполнения данной задачи и сравним время выполнения через серверный вызов. Чтобы увидеть разницу заполняем табличную часть формы данными.

Первый замер – серверный без контекстный вызов: 0,013694, второй замер – серверный вызов: 0,047071.

Как заполнить строку табличной части на сервере без контекста