Не видит глобальную переменную 1с
Добрый день. В модуле обычного приложения объявил экспортную переменную. А в общем модуле с галочкой "глобальный" ее не видно. Подскажите пожалуйста, как лечить?
не знаю, константа подразумевает под собой постоянное/условно постоянное значение. Параметр сеанса (например ТекущийПользователь) - постоянен только в течение сеанса
Модуль обычного приложения Модуль обычного приложения располагается в корневом разделе конфигурации. В нем располагаются процедуры-обработчики событий, которые инициализируются при старте и окончании работы системы с установленным в значение "Обычное приложение" свойством Основной режим запуска. В модуле обычного приложения возможно объявление переменных, а также объявление и описание процедур и функций, которые будут доступны в любом модуле конфигурации (кроме модуля внешнего соединения). Их доступность также обеспечивается для неглобальных общих модулей с установленным свойством Клиент (обычное приложение). В контексте модуля обычного приложения доступны экспортируемые процедуры и функции общих модулей.
+ Справка - Встроенный язык - Общее описание встроенного языка - Формат исходных текстов программных модулей - Что такое программный модуль? - Виды программных модулей
Спасибо. А как их инициализировать? Вот так вот ругается на параметр сеанса: <ОбщийМодуль.шапСобытия.Модуль>: Ошибка при получении значения атрибута контекста (шапВключенРежимНапоминания) ПараметрыСеанса.шапВключенРежимНапоминания.Установить(ложь); по причине: Попытка получения неинициализированного значения параметра сеансаОбщийМодуль.шапСобытия.Модуль>
Модуль сеанса Модулем сеанса называется модуль, который автоматически выполняется при старте системы 1С:Предприятие 8 в момент загрузки конфигурации. Модуль сеанса предназначен для инициализации параметров сеанса и отработки действий, связанных с сеансом работы. Модуль сеанса всегда исполняется в привилегированном режиме в кластере серверов 1С:Предприприятия 8. Важно! Модуль сеанса может содержать только определения процедур и функций. Модуль сеанса не содержит экспортируемых процедур и функций и может использовать процедуры из общих модулей конфигурации.
Добрый день. В модуле обычного приложения объявил экспортную переменную. А в общем модуле с галочкой "глобальный" ее не видно. Подскажите пожалуйста, как лечить?
(4) не знаю, константа подразумевает под собой постоянное/условно постоянное значение. Параметр сеанса (например ТекущийПользователь) - постоянен только в течение сеанса
(0)
Модуль обычного приложения
Модуль обычного приложения располагается в корневом разделе конфигурации. В нем располагаются процедуры-обработчики событий, которые инициализируются при старте и окончании работы системы с установленным в значение "Обычное приложение" свойством Основной режим запуска. В модуле обычного приложения возможно объявление переменных, а также объявление и описание процедур и функций, которые будут доступны в любом модуле конфигурации (кроме модуля внешнего соединения). Их доступность также обеспечивается для неглобальных общих модулей с установленным свойством Клиент (обычное приложение). В контексте модуля обычного приложения доступны экспортируемые процедуры и функции общих модулей.
+(6) Справка - Встроенный язык - Общее описание встроенного языка - Формат исходных текстов программных модулей - Что такое программный модуль? - Виды программных модулей
(9) Спасибо. А как их инициализировать? Вот так вот ругается на параметр сеанса:
: Ошибка при получении значения атрибута контекста (шапВключенРежимНапоминания)
ПараметрыСеанса.шапВключенРежимНапоминания.Установить(ложь);
по причине:
Попытка получения неинициализированного значения параметра сеанса
(10) Модуль сеанса
Модулем сеанса называется модуль, который автоматически выполняется при старте системы 1С:Предприятие 8 в момент загрузки конфигурации.
Модуль сеанса предназначен для инициализации параметров сеанса и отработки действий, связанных с сеансом работы. Модуль сеанса всегда исполняется в привилегированном режиме в кластере серверов 1С:Предприприятия 8.
Важно! Модуль сеанса может содержать только определения процедур и функций.
Модуль сеанса не содержит экспортируемых процедур и функций и может использовать процедуры из общих модулей конфигурации.
Но как так!? Ведь глобальные переменные модуля формы существуют всё время, пока живёт форма. Какой костыль нужно поставить в этот раз, чтоб можно было пользовать переменную, вполне законно, объявленную ранее? Или сейчас в 2018 это уже нельзя делать?
(1) Объявление переменной модуля идет первой строкой модуля?
Если сохранить не взирая на ошибку компилятора, в режиме предприятия ошибка возникает?
Опечатки исключаются?
Переменная объявлена, но её значение не определено, т.е даже не равно Неопределено.
Довольно много кодил на управляемых формах, и не могу припомнить случаев, когда мне нужно было иметь значение ТОЛЬКО на клиенте. Обычно все "только клиентские" переменные это либо реквизит формы (который отображается на форме), либо передаются в параметрах функций и процедур. В каких случаях требуются только клиентские переменные, приведите пример?
Локальное кэширование, например. Хранение каких-то связанных данных, нужных в интерактиве, без запихивания их в реквизиты формы, чтобы облегчить контекст формы и клиент-серверные вызовы. Работа с оборудованием с клиента.
(27)При работе с другой базой через ком-соединение, хранить это ком-соединение можно только в клиентской переменной модуля, в реквизиты формы вы его не засунете. Вы конечно можете каждый раз создавать новое ком-соединение при выполнении клиентской команды, но это варварство.
(29) Странный аргумент. Намного выгоднее работать с другой базой через COM-соединение на сервере. Куча профита. Одна точка подключения, нет ограничений на окружение клиента (хоть веб), нет лишних клиент-серверных вызовов и других ограничений клиента. А чтобы подключение не пересоздавалось постоянно - получать его через модуль с повторным использованием возвращаемых значений.
(31) Если на сервере можно сохранить соединение после серверного вызова, то конечно, - так было бы удобнее, но я не смог это проделать. Дайте, пожалуйста, минимальный пример.
А чтобы подключение не пересоздавалось постоянно - получать его через модуль с повторным использованием возвращаемых значений.
В общем модуле со свойством "Повторное использование возвращаемых значений" установленным в "На время сеанса" создаешь функцию, которая создает и возвращает соединение. В параметры функции лучше всего передавать собственно параметры подключения или ссылку на элемент справочника, который их содержит (т.к. возвращаемые значения кэшируются для комбинаций параметров).
В результате при первом обращении к этой функции соединение будет создано, а при повторных вызовах функция будет возвращать ранее созданное соединение. Иногда соединение может "потеряться", в этом случае функция просто повторно создаст соединение. Варианты на потеряться (из справки):
- после долгого неиспользования (более 5 минут);
- при нехватке оперативной памяти в рабочем процессе сервера;
- при перезапуске рабочего процесса;
- при переключении клиента на другой рабочий процесс
ЗЫ. Встречал даже "хаки" для "удержания" больших ТЗ на сервере таким макаром, с "дерганьем" каждые несколько минут, чтобы не ушло из кэша. Но это выглядит грязным приемом, ведь все-таки это чистой воды механизм кэширования. Использовать его для хранения состояния потенциально чревато. Ну а для кэширования соединений подходит идеально.
(33) Спасибо. Жаль, этот метод не подойдет в общем случае для внешней обработки.
Хотя, наверно, можно создать универсальную функцию в таком модуле, параметром которой будет текст кода, выполняемого на сервере.
А без этого костыля никак? Мне бы логику разработчиков этого чуда понять! Вот, вроде бы есть возможность переменную объявить, но вроде и нет такой возможности(
P.S.: Я так подозреваю, что дело тут в препроцессоре и надобно с директивами поиграться.
Небольшим заместителем глобальных переменных могут служить параметры сеанса, которые доступны в общих модулях. Но параметры сеанса могут сохранять не все типы значений, например, не получится так сохранить коллекцию значений (массив, структуру, список значений, таблицу значений и т.д.) Без преобразования в строку эти значения нельзя сохранить в параметре сеанса.
Кроме того, в параметрах сеанса не получается хранить сложные объекты, типа COM-объектов (в том числе из внешних компонент), обработок и др.
В некоторых случаях будет полезным следующий трюк:
В конфигурации создается обработка, которая обеспечивает доступ к модулю приложения из общего модуля.
В модуле обработки (не путать с модулем формы) размещаются следующие процедуры и функции:
Теперь в процедурах и функциях общих модулей можно делать следующие вещи:
Я думаю, вы выясните самостоятельно, как передавать параметры в процедуры и функции.
Еще хочу заметить, что такая обработка представляет собой ДЫРУ В БЕЗОПАСНОСТИ, потому что позволяет выполнить произвольный программный код и вызвать любую процедуру или функцию модуля приложения и общих модулей.
Еще хочу заметить, что этот трюк не соответствует идеологии платформы и возможно, что такая конфигурация не пройдет "1С:Совместимо", станет запутаннее и сложнее.
Кроме того, обращение к глобальным переменным будет довольно накладным (требуется создание объекта ОбработкаОбъект), но целью данной статьи является демонстрация технологических возможностей платформы на принципах "AS-IS". Вся ответственность за ваши программы лежит на вас.
Рекомендуется по возможности:
1. Обходиться вообще без глобальных переменных
2. Передавать информацию через параметры процедур и функций
3. Использовать параметры сеанса
4. Не допускать выполнения чужого программного кода
5. Комментировать сложные участки программы
Альтернативное решение, посредством общей формы вместо обработки
Недостаток вышеприведенного метода - в каждой функции общего модуля нужно создавать экземпляр обработки.
Реализация: :
Если есть общая-рабочий стол, то используем её, иначе создаем новую "ТестоваяФорма". На форму кладем ПолеВвода "рез" составного типа данных, и если форма-рабочий_стол,- то ещё два поляВвода "выражение_" и "парам".
В модуль формы кладем код
В модуль приложения
Пример использования
(не забудьте ф = ПолучитьОбщуюФорму("ТестоваяФорма", ,"ТестоваяФорма") в каждом модуле)
для формы, которая рабочий стол
- дополнение к статье писалось быстро - ошибки не исключены. Позже пересмотрю
- Код не поддерживает получение результата глоб.функций, точнее он не различает что выполняет - функцию или переменную. Позже перепишу что бы понимал
- При выполнении функций, процедур не поддерживается параметр локального контекста, например
Небольшим заместителем глобальных переменных могут служить параметры сеанса, которые доступны в общих модулях. Но параметры сеанса могут сохранять не все типы значений, например, не получится так сохранить коллекцию значений (массив, структуру, список значений, таблицу значений и т.д.) Без преобразования в строку эти значения нельзя сохранить в параметре сеанса.
Кроме того, в параметрах сеанса не получается хранить сложные объекты, типа COM-объектов (в том числе из внешних компонент), обработок и др.
В некоторых случаях будет полезным следующий трюк:
В конфигурации создается обработка, которая обеспечивает доступ к модулю приложения из общего модуля.
В модуле обработки (не путать с модулем формы) размещаются следующие процедуры и функции:
Теперь в процедурах и функциях общих модулей можно делать следующие вещи:
Я думаю, вы выясните самостоятельно, как передавать параметры в процедуры и функции.
Еще хочу заметить, что такая обработка представляет собой ДЫРУ В БЕЗОПАСНОСТИ, потому что позволяет выполнить произвольный программный код и вызвать любую процедуру или функцию модуля приложения и общих модулей.
Еще хочу заметить, что этот трюк не соответствует идеологии платформы и возможно, что такая конфигурация не пройдет "1С:Совместимо", станет запутаннее и сложнее.
Кроме того, обращение к глобальным переменным будет довольно накладным (требуется создание объекта ОбработкаОбъект), но целью данной статьи является демонстрация технологических возможностей платформы на принципах "AS-IS". Вся ответственность за ваши программы лежит на вас.
Рекомендуется по возможности:
1. Обходиться вообще без глобальных переменных
2. Передавать информацию через параметры процедур и функций
3. Использовать параметры сеанса
4. Не допускать выполнения чужого программного кода
5. Комментировать сложные участки программы
Читайте также:
- Чтобы записать документ программы word на дискету надо выбрать пункт меню
- Как удалить голосовые сообщения в whatsapp с памяти телефона на айфоне
- Программа для оптимизации батареи андроид сяоми от гугл
- По какой траектории вы можете выполнить разворот включите отображение картинок в браузере
- Программа для контактов на компьютер