#std636¶
Контекстная и внеконтекстная передача управления на сервер¶
1.¶
Платформа 1С:Предприятие поддерживает два способа передачи управления из клиентского кода формы на сервер:
- контекстный;
- внеконтекстный.
При внеконтекстной передаче (&НаСервереБезКонтекста) на сервер передаются только параметры процедуры или функции.
При контекстной передаче (&НаСервере) кроме параметров передаются и измененные данные формы.
Дополнительно выполняется инициализация контекста формы на сервере, что увеличивает время обработки вызова.
2.1.¶
Контекстную передачу используйте, когда одновременно выполняются условия:
- платформа сама оптимизирует объем обмена между клиентом и сервером (в первую очередь для реквизитов формы с табличными документами и коллекциями
ДанныеФормыКоллекция,ДанныеФормыСтруктураСКоллекцией,ДанныеФормыДерево); - затраты на инициализацию контекста оправданы снижением трафика и числа серверных вызовов.
См. также:¶
- #std628: Использование объекта ДанныеФормыКоллекция
- #std487: Минимизация количества серверных вызовов и трафика
Учитывайте ограничения: в ряде клиентских обработчиков формы (ПередЗаписью, ПослеЗаписи, ПередЗакрытием, ПриЗакрытии и др.) контекстные серверные вызовы недопустимы.
Подробности: документация платформы.
Чтобы убрать контекстный вызов, используйте один из подходов:
- замените серверный вызов на внеконтекстный (
&НаСервереБезКонтекста) и передавайте минимум данных; - перенесите часть логики с сервера на клиент;
- в клиентском обработчике применяйте обработчик ожидания, который выполнит вызов после завершения обработчика.
Неправильно
Правильно
&НаКлиенте
Процедура Подключаемый_ДоступныеПоляПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования)
ПодключитьОбработчикОжидания("ПриИзмененииОбразца", 0.1, Истина);
КонецПроцедуры
&НаКлиенте
Процедура ПриИзмененииОбразца()
ПриИзмененииОбразцаНаСервере();
КонецПроцедуры
&НаСервере
Процедура ПриИзмененииОбразцаНаСервере()
...
КонецПроцедуры
2.2.¶
Если на форме есть таблица, при активизации строки которой нужно перестраивать форму (например, выводить детали по текущей строке), в обработчике ПриАктивизацииСтроки подключайте однократный обработчик ожидания.
В обработчике ожидания выполняйте действия, которые перестраивают форму: контекстные вызовы, изменение свойств элементов и т.п.
Чтобы избежать повторных срабатываний ПриАктивизацииСтроки, запоминайте текущую строку (ИдентификаторТекущейСтроки) и не выполняйте перестроение, если строка не изменилась.
В остальных случаях рекомендуется использовать внеконтекстную передачу управления с клиента на сервер.
3.¶
При передаче управления с клиента на сервер не передавайте по значению параметры типов:
ДанныеФормыСтруктура;ДанныеФормыКоллекция;ДанныеФормыСтруктураСКоллекцией;ДанныеФормыДерево;ТабличныйДокумент.
Для этих типов при передаче по значению всегда уходит полная копия объекта, а не только изменения.
Работайте с такими данными на сервере через явный контекстный вызов.
Неправильно
// Модуль формы
&НаКлиенте
Процедура КоличествоОтмененныхСтрокЗаказа()
КоличествоСтрок = ОбщийМодульВызовСервера.КоличествоОтмененныхСтрок(Объект.Товары);
// Неоптимальная передача табличной части "Товары" на сервер.
КонецПроцедуры
// Общий серверный модуль ОбщийМодульВызовСервера
Функция КоличествоОтмененныхСтрок(ТабличнаяЧасть)
НайденныеСтроки = ТабличнаяЧасть.НайтиСтроки(Новый Структура("Отменено", Истина));
Возврат НайденныеСтроки.Количество();
КонецФункции
Правильно
// Модуль формы
&НаКлиенте
Процедура КоличествоОтмененныхСтрокЗаказа()
КоличествоСтрок = КоличествоОтмененныхСтрок();
// Табличная часть "Товары" передается платформой неявно и оптимально.
КонецПроцедуры
&НаСервере
Функция КоличествоОтмененныхСтрок()
Возврат ОбщийМодульВызовСервера.КоличествоОтмененныхСтрок(Объект.Товары);
// Вызов "сервер-сервер" без дополнительных накладных расходов.
КонецФункции
// Общий серверный модуль ОбщийМодульВызовСервера
Функция КоличествоОтмененныхСтрок(ТабличнаяЧасть)
НайденныеСтроки = ТабличнаяЧасть.НайтиСтроки(Новый Структура("Отменено", Истина));
Возврат НайденныеСтроки.Количество();
КонецФункции
Приложение¶
При контекстной передаче на сервер действуют правила:
- реквизиты формы типа
ДанныеФормыСтруктурапередаются целиком, если изменился хотя бы один реквизит; - для типов
ДанныеФормыКоллекция,ДанныеФормыСтруктураСКоллекцией,ДанныеФормыДеревопередаются только измененные элементы, но каждый измененный элемент передается целиком; - для
ТабличныйДокументпередаются только измененные области; - объекты типа
ДинамическийСписокне передаются.