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