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