Какие ограничения существуют для обычных форм при выполнении кода на сервере и чем они отличаются от управляемых форм?

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

При работе в среде 1С:Предприятие разработчики часто сталкиваются с необходимостью переноса логики с клиента на сервер. Однако поведение системы в этот момент кардинально различается в зависимости от того, используем ли мы обычные формы (толстый клиент) или управляемые формы. Разберем подробно, какие ловушки подстерегают программиста при попытке «оказаться на сервере» из контекста обычной формы.

Главное различие: Существование объекта на сервере

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

В обычных формах ситуация иная. Рассмотрим ситуацию: мы вызываем функцию серверного общего модуля из модуля обычной формы. В этот момент:

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

Доступность типов данных и контекстная «пустота»

Выясним причину, почему работа с данными в обычных формах на сервере требует большего внимания. Обычные формы в толстом клиенте работают напрямую с «тяжелыми» объектами базы данных, такими как СправочникОбъект или ДокументОбъект. В управляемых формах для этого используются облегченные проекции — ДанныеФормыСтруктура или ДанныеФормыКоллекция.

Когда мы выполняем код на сервере для обычной формы:

Интерактивные операции и системные сообщения

Разберем ситуацию с методами взаимодействия с пользователем. Часто возникает вопрос: можно ли использовать Сообщить() или Предупреждение() при серверном вызове?

Метод Сообщить(): В современных версиях платформы (8.3) вызов Сообщить() на сервере не приводит к ошибке. Система накапливает сообщения и передает их на клиент после завершения серверного вызова. Это работает как для управляемых, так и для обычных форм. Даже в фоновых заданиях этот метод безопасен.

Интерактивные диалоги: Здесь нас ждет жесткое ограничение. Методы Предупреждение(), Вопрос(), ВвестиЗначение() на сервере категорически недоступны. Если в обычной форме код написан «вперемешку» (что часто бывает в толстом клиенте), и цепочка вызовов приведет к интерактивному методу на сервере, приложение завершится с ошибкой «Интерактивные операции недоступны».

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

Особенности работы с фоновыми заданиями

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

  1. Фоновое задание всегда выполняется на сервере в отдельном сеансе.
  2. У него нет доступа к текущему состоянию вашей открытой формы.
  3. Если вам нужно передать данные из полей формы в фоновое задание, их нужно предварительно выгрузить в структуру или поместить во временное хранилище.

Пример правильной передачи данных на сервер для обработки:


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

Файловая система и принтеры

Посмотрим на работу с внешними ресурсами. В обычном приложении (толстый клиент) код часто обращается к файлам напрямую по путям типа C:\MyFiles\data.txt. При переносе такого кода на сервер (например, при попытке выполнить ту же логику в регламентном задании):

События формы и жизненный цикл

Проанализируем события. В управляемых формах существуют специализированные серверные события, такие как ПриСозданииНаСервере или ПриЧтенииНаСервере. В обычных формах все события — клиентские.

Это означает, что для инициализации формы при открытии вам в любом случае придется сначала загрузить форму на клиенте, а затем в событии ПриОткрытии или ПередОткрытием явно вызывать серверные функции для получения данных. Автоматического «бесшовного» контекста, который предоставляют управляемые формы, здесь нет.

Резюме ограничений

Подводя итог, при работе с обычными формами на сервере недоступно:

Для успешной разработки в обычном приложении следует придерживаться строгой дисциплины: сервер должен получать только «чистые» данные и возвращать результат для последующей обработки клиентским кодом формы.

← На главную