![]() |
![]() |
![]() |
|
Будни: Доступ к глобальным переменным, процедурам и функциям из общих модулей | ☑ | ||
---|---|---|---|---|
0
Волшебник
16.09.04
✎
21:40
|
Не секрет, что в общих модулях 8.0 не видны экспортируемые переменные, процедуры и функции модуля приложения.
Небольшим заместителем могут служить параметры сеанса, которые доступны в общих модулях. Но параметры сеанса могут сохранять не все типы значений, например, не получится так сохранить коллекцию значений (массив, структуру, список значений, таблицу значений и т.д.) Без преобразования в строку эти значения нельзя сохранить в параметре сеанса. Кроме того, в параметрах сеанса не получается хранить сложные объекты, типа COM-объектов (в том числе из внешних компонент), обработок и др. Ниже предлагается некоторое решение этой проблемы: В конфигурации создается обработка, которая обеспечивает доступ к модулю приложения из общего модуля. В модуле обработки (не путать с модулем формы) размещаются следующие процедуры и функции: //------------------------- Функция Получить(Выражение) Экспорт Возврат Вычислить(Выражение); КонецФункции //------------------------- Процедура Установить(Имя, Значение) Экспорт Выполнить("Имя = Значение"); КонецПроцедуры //------------------------- Процедура ВыполнитьПрограмму(Текст) Экспорт Выполнить(Текст); КонецПроцедуры //------------------------- Теперь в процедурах и функциях общих модулей можно делать следующие вещи: Процедура Тест() Экспорт //создаем объект типа ОбработкаОбъект.XXX гл = Обработки.гл.Создать(); //получение значения переменной а = гл.Получить("а"); //коллекции значений передаются "по ссылке", т.е. //ниже можно изменять ее элементы и они будут изменяться //в глобальной переменной //установить значение глобальной переменной гл.Установить("а",10); //вызвать экспортную процедуру модуля приложения гл.ВыполнитьПрограмму("проц()"); //вызвать функцию и получить ее возвращаемое значение а = гл.Вычислить("функ()"); КонецПроцедуры ----------------- Я думаю, вы выясните самостоятельно, как передавать параметры в процедуры и функции. Еще хочу заметить, что такая обработка представляет собой ДЫРУ В БЕЗОПАСНОСТИ, потому что позволяет выполнить произвольный программный код и вызвать любую процедуру или функцию модуля приложения и общих модулей. Еще хочу заметить, что этот трюк не соответствует идеологии платформы и возможно, что такая конфигурация не пройдет "1С:Совместимо", станет запутаннее и сложнее. Кроме того, обращение к глобальным переменным будет довольно накладным (требуется создание объекта ОбработкаОбъект), но целью данного "будня" является демонстрация технологических возможностей платформы на принципах "AS-IS". Вся ответственность за ваши программы лежит на вас. Рекомендуется по возможности: 1. Обходиться вообще без глобальных переменных 2. Передавать информацию через параметры процедур и функций 3. Использовать параметры сеанса 4. Не допускать выполнения чужого программного кода 5. Комментировать сложные участки программы |
|||
1
Волшебник
17.09.04
✎
09:57
|
Утренний up
|
|||
2
ALX
10.11.04
✎
14:18
|
для получения глобальной переменной:
Функция Получить(Выражение) Экспорт Возврат Вычислить(Выражение); КонецФункции Чтобы не использовать Вычислить (за что 1С при сертификации по головке не погладит), я просто использовал условие типа Функция Получить(Имя) Экспорт Если имя = "глПеременная1" тогда Возврат глПеременная1 ИначеЕсли имя = "глПеременная2" тогда Возврат глПеременная1 .... .... КонецЕсли; КонецФункции |
|||
3
427
10.11.04
✎
14:38
|
Бредни В8
|
|||
4
Волшебник
10.11.04
✎
14:39
|
(2) За такой код тоже по головке не погладят.
|
|||
5
427
10.11.04
✎
14:40
|
(4) мягко сказано...
|
|||
6
ALX
11.11.04
✎
13:39
|
(4,5) А чем, подскажите, этот код не соответствует стандартам 1С??
Обычный вызов экспортной процедуры... |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |