При переходе между разработкой под управляемый и обычный интерфейс у разработчиков часто возникает вопрос: как управлять контекстом исполнения кода и запускать процедуры на сервере, если в конфигурации используются обычные формы (толстый клиент)? Кроме того, нередко требуется выполнять ресурсоемкие операции асинхронно, чтобы интерфейс пользователя не зависал во время длительных расчетов. Рассмотрим подробно, как устроена клиент-серверная архитектура для обычных форм и какими средствами платформы 1С достигается асинхронность.
Проанализируем ключевое отличие модулей обычных форм от управляемых. В управляемом приложении контекст исполнения разделяется директивами компиляции (такими как &НаКлиенте, &НаСервере, &НаСервереБезКонтекста). В обычном приложении директивы компиляции в модулях форм не поддерживаются.
Весь код, написанный внутри модуля обычной формы, по умолчанию исполняется на стороне клиента (в контексте толстого клиента). Если внутри формы обратиться к серверным объектам напрямую, платформе придется неявно обращаться к серверу, либо код вовсе вызовет ошибку контекста. Чтобы передать тяжелые вычисления или выборку данных на сторону сервера, используется механизм вызова процедур и функций общих модулей.
Разберем по шагам, как настроить общий модуль, чтобы код из обычной формы гарантированно выполнялся на стороне сервера 1С:Предприятия:
Выясним причину, почему при включенном флаге Клиент (обычное приложение) код не уходит на сервер: если у модуля взведены одновременно клиентский и серверный флаги для обычного приложения, платформа толстого клиента компилирует и исполняет этот модуль локально на рабочей станции пользователя. Поэтому снятие клиентского флага и установка вызова сервера являются обязательными условиями.
Посмотрим на пример вызова серверной функции из модуля обычной формы:
Процедура КнопкаРассчитатьНажатие(Элемент)
// Подготавливаем входные данные
ПараметрыРасчета = Новый Структура;
ПараметрыРасчета.Вставить("Организация", ЭлементыФормы.Организация.Значение);
ПараметрыРасчета.Вставить("Период", Период);
// Вызов экспортной функции серверного общего модуля
Результат = РасчетСебестоимостиСервер.ВыполнитьРасчет(ПараметрыРасчета);
// Обработка полученного результата на клиенте
ЭлементыФормы.РезультатРасчета.Значение = Результат;
КонецПроцедуры
Обратим внимание на поведение в режиме отладки: если на сервере 1С включен флаг отладки (параметр -debug), то при пошаговой трассировке вызова РасчетСебестоимостиСервер.ВыполнитьРасчет(...) отладчик корректно перейдет в серверный контекст исполнения.
При вызове серверного модуля из обычных форм необходимо учитывать ограничения сериализации данных. Рассмотрим правила передачи данных:
ЭлементыФормы.ТабличноеПоле) или контекст самой формы.В платформе 1С понятие серверной асинхронности и многопоточности реализуется через механизм фоновых заданий. Если в коде конфигурации (например, при закрытии месяца или расчете себестоимости) указано, что операция выполняется асинхронно, это означает, что платформа запускает процедуру в отдельном фоновом потоке кластера серверов.
Разберем, как программно запустить фоновое задание с помощью объекта ФоновыеЗадания:
// Формируем массив параметров для серверной процедуры
МассивПараметров = Новый Массив;
МассивПараметров.Добавить(ПараметрыРасчета);
// Запуск длительной операции в отдельном фоновом потоке
Задание = ФоновыеЗадания.Выполнить("РасчетСебестоимостиСервер.ФоновыйРасчетСебестоимости", МассивПараметров, КлючЗадания, "Расчет себестоимости за месяц");
// При необходимости можно ожидать завершения или опрашивать состояние
// Задание.ОжидатьЗавершения(60);
Рассмотрим преимущества такого подхода:
rphost.Состояние объекта ФоновоеЗадание или используя типовую подсистему «Длительные операции».Начиная с современных версий платформы 1С:Предприятие 8.3, для клиентской части интерфейса также доступна асинхронность через ключевые слова Асинх и Ждать, а также встроенные методы с постфиксом ...Асинх (например, ПоказатьВопросАсинх, ПоказатьПредупреждениеАсинх). Данный механизм предназначен для неблокирующего отображения диалогов и взаимодействия с файловой системой клиента, дополняя серверные фоновые вычисления.