Имя: Пароль:
1C
 
Будни: Доступ к глобальным переменным, процедурам и функциям из общих модулей
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С??
Обычный вызов экспортной процедуры...
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший