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