Перейти к содержанию
#std636

Контекстная и внеконтекстная передача управления на сервер

1.

Платформа 1С:Предприятие поддерживает два способа передачи управления из клиентского кода формы на сервер:

  • контекстный;
  • внеконтекстный.

При внеконтекстной передаче (&НаСервереБезКонтекста) на сервер передаются только параметры процедуры или функции.

При контекстной передаче (&НаСервере) кроме параметров передаются и измененные данные формы. Дополнительно выполняется инициализация контекста формы на сервере, что увеличивает время обработки вызова.

2.1.

Контекстную передачу используйте, когда одновременно выполняются условия:

  • платформа сама оптимизирует объем обмена между клиентом и сервером (в первую очередь для реквизитов формы с табличными документами и коллекциями ДанныеФормыКоллекция, ДанныеФормыСтруктураСКоллекцией, ДанныеФормыДерево);
  • затраты на инициализацию контекста оправданы снижением трафика и числа серверных вызовов.
См. также:

Учитывайте ограничения: в ряде клиентских обработчиков формы (ПередЗаписью, ПослеЗаписи, ПередЗакрытием, ПриЗакрытии и др.) контекстные серверные вызовы недопустимы. Подробности: документация платформы.

Чтобы убрать контекстный вызов, используйте один из подходов:

  • замените серверный вызов на внеконтекстный (&НаСервереБезКонтекста) и передавайте минимум данных;
  • перенесите часть логики с сервера на клиент;
  • в клиентском обработчике применяйте обработчик ожидания, который выполнит вызов после завершения обработчика.

Неправильно

&НаКлиенте
Процедура Подключаемый_ДоступныеПоляПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования)
    ПриИзмененииОбразцаНаСервере();
КонецПроцедуры

Правильно

&НаКлиенте
Процедура Подключаемый_ДоступныеПоляПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования)
    ПодключитьОбработчикОжидания("ПриИзмененииОбразца", 0.1, Истина);
КонецПроцедуры

&НаКлиенте
Процедура ПриИзмененииОбразца()
    ПриИзмененииОбразцаНаСервере();
КонецПроцедуры

&НаСервере
Процедура ПриИзмененииОбразцаНаСервере()
    ...
КонецПроцедуры
2.2.

Если на форме есть таблица, при активизации строки которой нужно перестраивать форму (например, выводить детали по текущей строке), в обработчике ПриАктивизацииСтроки подключайте однократный обработчик ожидания.

В обработчике ожидания выполняйте действия, которые перестраивают форму: контекстные вызовы, изменение свойств элементов и т.п.

Чтобы избежать повторных срабатываний ПриАктивизацииСтроки, запоминайте текущую строку (ИдентификаторТекущейСтроки) и не выполняйте перестроение, если строка не изменилась.

В остальных случаях рекомендуется использовать внеконтекстную передачу управления с клиента на сервер.

3.

При передаче управления с клиента на сервер не передавайте по значению параметры типов:

  • ДанныеФормыСтруктура;
  • ДанныеФормыКоллекция;
  • ДанныеФормыСтруктураСКоллекцией;
  • ДанныеФормыДерево;
  • ТабличныйДокумент.

Для этих типов при передаче по значению всегда уходит полная копия объекта, а не только изменения.

Работайте с такими данными на сервере через явный контекстный вызов.

Неправильно

// Модуль формы

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

// Общий серверный модуль ОбщийМодульВызовСервера
Функция КоличествоОтмененныхСтрок(ТабличнаяЧасть)
    НайденныеСтроки = ТабличнаяЧасть.НайтиСтроки(Новый Структура("Отменено", Истина));
    Возврат НайденныеСтроки.Количество();
КонецФункции

Правильно

// Модуль формы

&НаКлиенте
Процедура КоличествоОтмененныхСтрокЗаказа()
    КоличествоСтрок = КоличествоОтмененныхСтрок();
    // Табличная часть "Товары" передается платформой неявно и оптимально.
КонецПроцедуры

&НаСервере
Функция КоличествоОтмененныхСтрок()
    Возврат ОбщийМодульВызовСервера.КоличествоОтмененныхСтрок(Объект.Товары);
    // Вызов "сервер-сервер" без дополнительных накладных расходов.
КонецФункции

// Общий серверный модуль ОбщийМодульВызовСервера
Функция КоличествоОтмененныхСтрок(ТабличнаяЧасть)
    НайденныеСтроки = ТабличнаяЧасть.НайтиСтроки(Новый Структура("Отменено", Истина));
    Возврат НайденныеСтроки.Количество();
КонецФункции
Приложение

При контекстной передаче на сервер действуют правила:

  • реквизиты формы типа ДанныеФормыСтруктура передаются целиком, если изменился хотя бы один реквизит;
  • для типов ДанныеФормыКоллекция, ДанныеФормыСтруктураСКоллекцией, ДанныеФормыДерево передаются только измененные элементы, но каждый измененный элемент передается целиком;
  • для ТабличныйДокумент передаются только измененные области;
  • объекты типа ДинамическийСписок не передаются.
См. также
Источник

https://its.1c.ru/db/v8std#content:636