Как выполнять код на сервере в обычных формах и реализовать асинхронность в 1С?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

При переходе между разработкой под управляемый и обычный интерфейс у разработчиков часто возникает вопрос: как управлять контекстом исполнения кода и запускать процедуры на сервере, если в конфигурации используются обычные формы (толстый клиент)? Кроме того, нередко требуется выполнять ресурсоемкие операции асинхронно, чтобы интерфейс пользователя не зависал во время длительных расчетов. Рассмотрим подробно, как устроена клиент-серверная архитектура для обычных форм и какими средствами платформы 1С достигается асинхронность.

Особенности исполнения кода в обычных формах

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

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

Настройка общего модуля для вызова сервера из обычной формы

Разберем по шагам, как настроить общий модуль, чтобы код из обычной формы гарантированно выполнялся на стороне сервера 1С:Предприятия:

  1. Создадим новый общий модуль или выберем существующий в дереве метаданных конфигурации.
  2. В палитре свойств общего модуля снимем флаг Клиент (обычное приложение).
  3. Установим флаг Сервер.
  4. Обязательно установим флаг Вызов сервера. Без этого флага клиентский код не сможет напрямую обращаться к экспортным методам серверного модуля.

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

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


Процедура КнопкаРассчитатьНажатие(Элемент)
    
    // Подготавливаем входные данные
    ПараметрыРасчета = Новый Структура;
    ПараметрыРасчета.Вставить("Организация", ЭлементыФормы.Организация.Значение);
    ПараметрыРасчета.Вставить("Период", Период);
    
    // Вызов экспортной функции серверного общего модуля
    Результат = РасчетСебестоимостиСервер.ВыполнитьРасчет(ПараметрыРасчета);
    
    // Обработка полученного результата на клиенте
    ЭлементыФормы.РезультатРасчета.Значение = Результат;
    
КонецПроцедуры

Обратим внимание на поведение в режиме отладки: если на сервере 1С включен флаг отладки (параметр -debug), то при пошаговой трассировке вызова РасчетСебестоимостиСервер.ВыполнитьРасчет(...) отладчик корректно перейдет в серверный контекст исполнения.

Ограничения при передаче параметров между клиентом и сервером

При вызове серверного модуля из обычных форм необходимо учитывать ограничения сериализации данных. Рассмотрим правила передачи данных:

  1. Нельзя передавать напрямую элементы управления формы (например, ЭлементыФормы.ТабличноеПоле) или контекст самой формы.
  2. Следует передавать структуры, массивы, таблицы значений, ссылки на объекты и примитивные типы данных (числа, строки, даты, булево).
  3. Тяжелые манипуляции с объектной моделью базы данных (чтение больших наборов записей регистров, выполнение запросов) должны целиком происходить внутри серверного общего модуля.

Реализация асинхронности и параллельных расчетов через фоновые задания

В платформе 1С понятие серверной асинхронности и многопоточности реализуется через механизм фоновых заданий. Если в коде конфигурации (например, при закрытии месяца или расчете себестоимости) указано, что операция выполняется асинхронно, это означает, что платформа запускает процедуру в отдельном фоновом потоке кластера серверов.

Разберем, как программно запустить фоновое задание с помощью объекта ФоновыеЗадания:


// Формируем массив параметров для серверной процедуры
МассивПараметров = Новый Массив;
МассивПараметров.Добавить(ПараметрыРасчета);

// Запуск длительной операции в отдельном фоновом потоке
Задание = ФоновыеЗадания.Выполнить("РасчетСебестоимостиСервер.ФоновыйРасчетСебестоимости", МассивПараметров, КлючЗадания, "Расчет себестоимости за месяц");

// При необходимости можно ожидать завершения или опрашивать состояние
// Задание.ОжидатьЗавершения(60);

Рассмотрим преимущества такого подхода:

  1. Неблокирующий интерфейс: пользователь может продолжать работу в программе, пока сервер выполняет тяжелые алгоритмы.
  2. Параллельные вычисления: расчет можно разбить на несколько независимых блоков (например, по организациям или складам) и запустить одновременно несколько фоновых заданий, распределив нагрузку по рабочим процессам сервера rphost.
  3. Контроль выполнения: состояние запущенного задания можно отслеживать через свойство Состояние объекта ФоновоеЗадание или используя типовую подсистему «Длительные операции».

Клиентская асинхронность интерфейса

Начиная с современных версий платформы 1С:Предприятие 8.3, для клиентской части интерфейса также доступна асинхронность через ключевые слова Асинх и Ждать, а также встроенные методы с постфиксом ...Асинх (например, ПоказатьВопросАсинх, ПоказатьПредупреждениеАсинх). Данный механизм предназначен для неблокирующего отображения диалогов и взаимодействия с файловой системой клиента, дополняя серверные фоновые вычисления.

← На главную