v8: Доступ к глобальным переменным, процедурам и функциям из общих модулей Ключевые слова: глобальных, общих, модулей
Небольшим заместителем глобальных переменных могут служить параметры сеанса, которые доступны в общих модулях. Но параметры сеанса могут сохранять не все типы значений, например, не получится так сохранить коллекцию значений (массив, структуру, список значений, таблицу значений и т.д.) Без преобразования в строку эти значения нельзя сохранить в параметре сеанса.
Кроме того, в параметрах сеанса не получается хранить сложные объекты, типа COM-объектов (в том числе из внешних компонент), обработок и др.
В некоторых случаях будет полезным следующий трюк:
В конфигурации создается обработка, которая обеспечивает доступ к модулю приложения из общего модуля.
В модуле обработки (не путать с модулем формы) размещаются следующие процедуры и функции:
//-------------------------
Функция Получить(Выражение) Экспорт
Возврат Вычислить(Выражение);
КонецФункции
//-------------------------
Процедура Установить(Имя, Значение) Экспорт
Выполнить("Имя = Значение");
КонецПроцедуры
//-------------------------
Процедура ВыполнитьПрограмму(Текст) Экспорт
Выполнить(Текст);
КонецПроцедуры
//-------------------------
Теперь в процедурах и функциях общих модулей можно делать следующие вещи:
Процедура Тест() Экспорт
//создаем объект типа ОбработкаОбъект.XXX
гл = Обработки.гл.Создать();
//получение значения переменной
а = гл.Получить("а");
//коллекции значений передаются "по ссылке", т.е.
//ниже можно изменять ее элементы и они будут изменяться
//в глобальной переменной
//установить значение глобальной переменной
гл.Установить("а",10);
//вызвать экспортную процедуру модуля приложения
гл.ВыполнитьПрограмму("проц()");
//вызвать функцию и получить ее возвращаемое значение
а = гл.Вычислить("функ()");
КонецПроцедуры
-----------------
Я думаю, вы выясните самостоятельно, как передавать параметры в процедуры и функции.
Еще хочу заметить, что такая обработка представляет собой ДЫРУ В БЕЗОПАСНОСТИ, потому что позволяет выполнить произвольный программный код и вызвать любую процедуру или функцию модуля приложения и общих модулей.
Еще хочу заметить, что этот трюк не соответствует идеологии платформы и возможно, что такая конфигурация не пройдет "1С:Совместимо", станет запутаннее и сложнее.
Кроме того, обращение к глобальным переменным будет довольно накладным (требуется создание объекта ОбработкаОбъект), но целью данной статьи является демонстрация технологических возможностей платформы на принципах "AS-IS". Вся ответственность за ваши программы лежит на вас.
Рекомендуется по возможности:
1. Обходиться вообще без глобальных переменных
2. Передавать информацию через параметры процедур и функций
3. Использовать параметры сеанса
4. Не допускать выполнения чужого программного кода
5. Комментировать сложные участки программы |