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