Книга знаний

1С:Предприятие / v8 / Приемы программирования / Встроенный язык

v8: Доступ к глобальным переменным, процедурам и функциям из общих модулей

Не секрет, что в общих модулях 8.0 не видны экспортируемые переменные, процедуры и функции модуля приложения. Ниже предлагается некоторое решение этой проблемы.Автор статьи: Волшебник | Редакторы: Rovan, Гений 1С, nop,
Последняя редакция №2 от 13.02.06 | История
URL: http://kb.mista.ru/article.php?id=37

Ключевые слова: глобальных, общих, модулей


Небольшим заместителем глобальных переменных могут служить параметры сеанса, которые доступны в общих модулях. Но параметры сеанса могут сохранять не все типы значений, например, не получится так сохранить коллекцию значений (массив, структуру, список значений, таблицу значений и т.д.) Без преобразования в строку эти значения нельзя сохранить в параметре сеанса.

Кроме того, в параметрах сеанса не получается хранить сложные объекты, типа COM-объектов (в том числе из внешних компонент), обработок и др.

В некоторых случаях будет полезным следующий трюк:

В конфигурации создается обработка, которая обеспечивает доступ к модулю приложения из общего модуля.

В модуле обработки (не путать с модулем формы) размещаются следующие процедуры и функции:

//-------------------------
Функция Получить(Выражение) Экспорт
   Возврат Вычислить(Выражение);
КонецФункции

//-------------------------
Процедура Установить(Имя, Значение) Экспорт
  Выполнить("Имя = Значение");
КонецПроцедуры

//-------------------------
Процедура ВыполнитьПрограмму(Текст) Экспорт
  Выполнить(Текст);
КонецПроцедуры
//-------------------------

Теперь в процедурах и функциях общих модулей можно делать следующие вещи:

Процедура Тест() Экспорт

//создаем объект типа ОбработкаОбъект.XXX
гл = Обработки.гл.Создать();

//получение значения переменной
а = гл.Получить("а");

//коллекции значений передаются "по ссылке", т.е.
//ниже можно изменять ее элементы и они будут изменяться
//в глобальной переменной

//установить значение глобальной переменной
гл.Установить("а",10);

//вызвать экспортную процедуру модуля приложения
гл.ВыполнитьПрограмму("проц()");

//вызвать функцию и получить ее возвращаемое значение
а = гл.Вычислить("функ()");

КонецПроцедуры
-----------------

Я думаю, вы выясните самостоятельно, как передавать параметры в процедуры и функции.

Еще хочу заметить, что такая обработка представляет собой ДЫРУ В БЕЗОПАСНОСТИ, потому что позволяет выполнить произвольный программный код и вызвать любую процедуру или функцию модуля приложения и общих модулей.

Еще хочу заметить, что этот трюк не соответствует идеологии платформы и возможно, что такая конфигурация не пройдет "1С:Совместимо", станет запутаннее и сложнее.

Кроме того, обращение к глобальным переменным будет довольно накладным (требуется создание объекта ОбработкаОбъект), но целью данной статьи является демонстрация технологических возможностей платформы на принципах "AS-IS". Вся ответственность за ваши программы лежит на вас.

Рекомендуется по возможности:
1. Обходиться вообще без глобальных переменных
2. Передавать информацию через параметры процедур и функций
3. Использовать параметры сеанса
4. Не допускать выполнения чужого программного кода
5. Комментировать сложные участки программы

Описание | Рубрикатор | Поиск | ТелепатБот | Захваченные статьи | Установки | Форум
© Станислав Митичкин (Волшебник), 2005-2025 | Mista.ru

Яндекс.Метрика