Цель данной статьи показать, как работать со строкой табличной части на сервере без контекста.
Все знают, что серверные без контекстные вызовы намного «легче» серверных вызовов и их использование является оптимальным решением задач. Но иногда программист, не задумываясь о последствиях использует серверный вызов в тех случаях, когда можно было использовать серверный без контекстный вызов, уменьшив тем самым нагрузку на сервер и увеличив производительность системы. Если на форме содержится мало данных, то разница будет почти не заметна и в таком случае неверное нет смысла усложнять код. Но в случае, когда данных много, разница будет очевидна и написанный серверный код нужно будет переделывать.
Разберем случай, когда для решения поставленной задачи нам нужно на сервере обратиться к данным текущей строки. При этом мы будем использовать серверный без контекстный вызов, а потом результаты сравним с серверным вызовом. В качестве демонстрации возьмем простой пример: при изменении номенклатуры получим ее единицу измерения.
Передача типа ДанныеФормыЭлементКоллекции на сервер невозможна:
Оптимальным решением передать текущую строку на сервер будет преобразовать ее в структуру и уже структуру передать на сервер, а уже после выполнения действий со структурой перезаполнить данные текущей строки. Программный код будет выглядеть так:
//////// &НаКлиенте Процедура ТоварыНоменклатураПриИзменении(Элемент) ИндексСтроки = Элементы.Товары.ТекущаяСтрока; // Преобразуем данные текущей строки в структуру ДанныеТекущейСтроки = ПреобразоватьДанныеТекущейСтрокиВСтруктуру(); // Получим интересующее нас значение ЗаполнитьЕдиницуИзмеренияНоменклатуры(ДанныеТекущейСтроки); // Изменим значения реквизитов текущей строки ЗаполнитьЗначенияСвойств(Объект.Товары[ИндексСтроки], ДанныеТекущейСтроки, "Упаковка"); КонецПроцедуры &НаКлиенте Функция ПреобразоватьДанныеТекущейСтрокиВСтруктуру() Экспорт Результат = Новый Структура("Номенклатура, Упаковка"); ТекущиеДанные = Элементы.Товары.ТекущиеДанные; Если НЕ ТекущиеДанные = Неопределено Тогда ЗаполнитьЗначенияСвойств(Результат, ТекущиеДанные); КонецЕсли; Возврат Результат; КонецФункции &НаСервереБезКонтекста Процедура ЗаполнитьЕдиницуИзмеренияНоменклатуры(ДанныеТекущейСтроки) ДанныеТекущейСтроки.Упаковка = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ДанныеТекущейСтроки.Номенклатура, "ЕдиницаИзмерения"); КонецПроцедуры ////////
• ПреобразоватьДанныеТекущейСтрокиВСтруктуру() – на основании данных текущей строки создается и заполняется структура с теми реквизитами табличной части, которые нам понадобятся для решения задачи.
• ИндексСтроки = Элементы.Товары.ТекущаяСтрока; – получаем идентификатор текущей строки таблицы
• ЗаполнитьЕдиницуИзмеренияНоменклатуры(ДанныеТекущейСтроки); — серверный без контекстный вызов, обращение к БД, поиск единицы измерения номенклатуры. Найденное значение помещается в структуру.
• ЗаполнитьЗначенияСвойств(Объект.Товары[ИндексСтроки], ДанныеТекущейСтроки, «Упаковка»); — изменяем значение «Упаковка» в текущей строке табличной части
А теперь с помощью замера производительности сравним время выполнения данной задачи и сравним время выполнения через серверный вызов. Чтобы увидеть разницу заполняем табличную часть формы данными.
Первый замер — серверный без контекстный вызов: 0,013694, второй замер – серверный вызов: 0,047071.