Не видит глобальную переменную 1с
Использование переменных в программных модулях
Область применения: управляемое приложение, мобильное приложение, обычное приложение.
1. В большинстве случаев, вместо переменных программных модулей следует использовать более подходящие средства разработки платформы 1С:Предприятие . Поскольку область видимости (использования) таких переменных сложно контролировать, то они зачастую становятся источником трудновоспроизводимых ошибок.
Примеры некорректного использования и исключений из этого правила приведены далее. Рекомендации по оформлению переменных в коде программных модулей см. в статье Структура модуля.
2. Неоправданные примеры использования переменных в модулях объектов (справочников, документов, наборов записей, обработок, отчетов и пр.).
2.1. Для передачи параметров между обработчиками подписок на события и в обработчики событий модуля объекта из внешнего кода рекомендуется использовать свойство объекта ДополнительныеСвойства . Например, неправильно:
Перем КонвертацияФайлов Экспорт;
Если КонвертацияФайлов Тогда
.
// вызывающий код
ФайлОбъект.КонвертацияФайлов = Истина;
ФайлОбъект.Записать();
Если ДополнительныеСвойства.Свойство("КонвертацияФайлов") Тогда
.
// вызывающий код
ФайлОбъект.ДополнительныеСвойства.Вставить("КонвертацияФайлов", Истина);
ФайлОбъект.Записать();
В то же время, для передачи внутренних параметров между обработчиками событий модуля объекта целесообразно использовать неэкспортные переменные модуля объекта, которые недоступны из внешнего кода.
Например:
Перем ПредыдущееЗначениеОрганизации; // значение реквизита "Организация" до записи объекта в базу
Процедура ПередЗаписью(Отказ)
ПредыдущееЗначениеОрганизации = . ; // с помощью запроса выясняем значение до записи объекта в базу
КонецПроцедуры
Процедура ПриЗаписи(Отказ)
Если ПредыдущееЗначениеРеквизита <> Организация Тогда
// отрабатываем изменение значения реквизита при записи
.
КонецЕсли;
2.2. Для обработки кодов возврата (ошибок) в логике программного модуля рекомендуется использовать строковые константы.
Например, неправильно:
Перем НетОшибок,
Ошибка_ОбработкиПроверкиЗаполнения, // возникает, если обработка проверки заполнения вернула отказ
Ошибка_ЗаписиОбъекта, // возникает, если во время записи объекта возникло исключение
Ошибка_БлокировкиОбъекта, // возникает, при попытке блокировки объекта
Процедура ВыполнитьПерерасчет()
.
Результат = ОбработатьДокументы(. );
Если Результат = Ошибка_ЗаписиОбъекта Тогда
.
ИначеЕсли Результат = Ошибка_БлокировкиОбъекта Тогда
.
ИначеЕсли .
НетОшибок = 1;
Ошибка_ОбработкиПроверкиЗаполнения = 2;
Ошибка_ЗаписиОбъекта = 3;
Ошибка_БлокировкиОбъекта = 4;
Процедура ВыполнитьПерерасчет()
.
Результат = ОбработатьДокументы(. );
Если Результат = "ОшибкаЗаписиОбъекта" Тогда
.
ИначеЕсли Результат = "ОшибкаБлокировкиОбъекта" Тогда
.
ИначеЕсли .
2.3. Для кеширования долго-вычисляемых и часто-используемых значений в процедурах и функциях рекомендуется применять модули с повторным использованием возвращаемых значений на время вызова сервера.
Исключение из этого правила составляют случаи, когда по соображениям безопасности возвращать результат вычисления в экспортной функции недопустимо. В этом случае они размещаются в локальной переменной модуля.
3. Неоправданные примеры использования переменных в модулях форм.
3.1. Для кеширования долго-вычисляемых и часто-используемых значений в процедурах и функциях рекомендуется применять модули с повторным использованием возвращаемых значений.
При этом не следует кешировать статическую и легко вычисляемую информацию. В частности, не следует кешировать в клиентских переменных модуля формы значения предопределенных элементов и перечислений. Для их получения на клиенте предназначен метод ПредопределенноеЗначение .
3.2. Для хранения и передачи промежуточных результатов вычислений между разными процедурами и функциями формы следует использовать
- Параметры процедур и функций – для передачи результатов по цепочке вызовов дочерних процедур и функций в контексте одного вызова.
- Реквизиты формы – если требуется сохранять промежуточные результаты между разными вызовами с клиента. (Следует иметь в виду, что значения серверных переменных модуля формы не сохраняются между вызовами с клиента.)
Исключение из этого правила составляют случаи использования клиентских переменных формы для хранения промежуточных результатов в обработчиках ожидания формы, в обработчиках внешних событий и в клиентских обработчиках событий элементов формы.
Например:
&НаКлиенте
Перем ПорядковыйНомерИзображения; // счетчик-нумератор для наименования файлов при сканирования нескольких изображений
.
&НаКлиенте
Процедура ВнешнееСобытие(Источник, Событие, Данные)
Если Источник = "TWAIN" И Событие = "ImageAcquired" Тогда
Если ПорядковыйНомерИзображения = Неопределено Тогда
ПорядковыйНомерИзображения = 1;
КонецЕсли;
ПорядковыйНомерИзображения = ПорядковыйНомерИзображения + 1;
// Сохранение отсканированного документа в файл с номером ПорядковыйНомерИзображения
// .
КонецЕсли;
КонецПроцедуры
4. Переменные управляемого и обычного приложения следует использовать для хранения «клиентских параметров сеанса». Подробнее см. статью Использование параметров сеанса.
Небольшим заместителем глобальных переменных могут служить параметры сеанса, которые доступны в общих модулях. Но параметры сеанса могут сохранять не все типы значений, например, не получится так сохранить коллекцию значений (массив, структуру, список значений, таблицу значений и т.д.) Без преобразования в строку эти значения нельзя сохранить в параметре сеанса.
Кроме того, в параметрах сеанса не получается хранить сложные объекты, типа COM-объектов (в том числе из внешних компонент), обработок и др.
В некоторых случаях будет полезным следующий трюк:
В конфигурации создается обработка, которая обеспечивает доступ к модулю приложения из общего модуля.
В модуле обработки (не путать с модулем формы) размещаются следующие процедуры и функции:
Теперь в процедурах и функциях общих модулей можно делать следующие вещи:
Я думаю, вы выясните самостоятельно, как передавать параметры в процедуры и функции.
Еще хочу заметить, что такая обработка представляет собой ДЫРУ В БЕЗОПАСНОСТИ, потому что позволяет выполнить произвольный программный код и вызвать любую процедуру или функцию модуля приложения и общих модулей.
Еще хочу заметить, что этот трюк не соответствует идеологии платформы и возможно, что такая конфигурация не пройдет "1С:Совместимо", станет запутаннее и сложнее.
Кроме того, обращение к глобальным переменным будет довольно накладным (требуется создание объекта ОбработкаОбъект), но целью данной статьи является демонстрация технологических возможностей платформы на принципах "AS-IS". Вся ответственность за ваши программы лежит на вас.
Рекомендуется по возможности:
1. Обходиться вообще без глобальных переменных
2. Передавать информацию через параметры процедур и функций
3. Использовать параметры сеанса
4. Не допускать выполнения чужого программного кода
5. Комментировать сложные участки программы
Альтернативное решение, посредством общей формы вместо обработки
Недостаток вышеприведенного метода - в каждой функции общего модуля нужно создавать экземпляр обработки.
Реализация: :
Если есть общая-рабочий стол, то используем её, иначе создаем новую "ТестоваяФорма". На форму кладем ПолеВвода "рез" составного типа данных, и если форма-рабочий_стол,- то ещё два поляВвода "выражение_" и "парам".
В модуль формы кладем код
В модуль приложения
Пример использования
(не забудьте ф = ПолучитьОбщуюФорму("ТестоваяФорма", ,"ТестоваяФорма") в каждом модуле)
для формы, которая рабочий стол
- дополнение к статье писалось быстро - ошибки не исключены. Позже пересмотрю
- Код не поддерживает получение результата глоб.функций, точнее он не различает что выполняет - функцию или переменную. Позже перепишу что бы понимал
- При выполнении функций, процедур не поддерживается параметр локального контекста, например
Мне необходимо получить ее значение в модуле объекта управляемой формы. Разъясните почему при работе в файловом режиме я свободно к ней обращаюсь, а при серверном она у меня неопределенна.
Тоже самое относится и к ФУНКЦИИ, которая лежит в общем модуле РаботаСДиалогами, пытаюсь ее вызвать из модуля объекта в процедуре ПередЗаписью() с файлового могу, с серверного нет.
И как же все таки мне достучаться к ним при серверном режиме работы
__________________Помощь в написании контрольных, курсовых и дипломных работ здесь
Глобальные переменные в 8.2
Спустя время вынужден опять задуматься над проблемой. 8.2 возненавидела глобальные переменные (ГП).
Глобальные полезности
Давно хотел такую тему сделать, но руки не доходили А тут повод хороший появился .
Глобальные изменения: внешние отчеты и обработки
Приветствую! Есть задача по типу: раньше мы брали показатели так то а теперь нужно брать так-то.
УФ в обычном приложении. Форма списка документа. Глобальные команды
Не объяснит ли кто мне, страдающему пользовательским кретинизмом, принцип появления кнопки "На.
В модуле ОБЫЧНОГО приложения получить значение переменной в УПРАВЛЯЕМОЙ форме?
Скажите тогда зачем нужен модуль УПРАВЛЯЕМОГО приложения?
Добавлено через 1 минуту
У общего модуля есть галочки которые определяют где он будет доступен
Добавлено через 11 минут
Глобальных переменных в 1С как таковых НЕТ
Их функцию заменяют параметры сеанса
Галочки поставила, с общим модулем все ок)
А вот с формой нет. Поясню
этой переменной присваивается значение при запуске системы.
Я хочу записать ее значение в документ. Форма документа управляемая.
В процедуре ПередЗаписью()
Так вот при отладке на локальной конфе все работает, переношу в рабочую базу на сервер сваливается в ошибку переменная не определена
Создаете параметр сеанса глТекущийПользователь и в модуле СЕАНСА инициализируете параметр сеанса и далее параметр сеанса будет доступен в любой точке программы
Добавлено через 4 минуты
Серверный код и Клиентский компилируются отдельно
В случае управляемого приложения модуль Обычного приложения не должен компилироваться
Я с этой управляемой формой уже устала((
Работаю в 1С8.2 УПП
в нем описаны стандартные функции
Почему я не могу обратиться к нему из управляемой формы??
Когда пишу сам код синтаксических ошибок нет
Режим серверный. Приложение толстый клиент.
Почему эти функции из управляемой формы не определяются?? Из обычной все отлично проходит. И при файловом режиме тоже.
Управляемая форма делает вид, что это клиент-сервер и искусственно разделяет обращение к функциям. Но тут лучше Fenomenа спросить. НО! В УПП все основные формы, особенно в документах, работают обычные. "Т_Заявка. " - это типа из торговли 11, что ли? Или из Автотранспорта?А то рисуйте для УПП обычную форму - документ если не родной. Я бы не стал связываться с управляемой, если она вызывает больше одной функции из общих модулей в УПП, а эту функцию скопировал бы в модуль формы
Да я уже 1000 раз пожалела что связалась с ними. Дали проект реализация бизнес-процесса по закупке ЗЧ у иностранных поставщиков, создание всех документов, справочников, регистров с нуля, все реализовать на управляемых формах. С ними работаю впервые. Ну я и сделала все в файловом режиме. Работало все отлично, с проблемами столкнулась при переносе все в боевую базу, на сервер. При создании документов есть естественно общие функции, которые я и вынесла в общий модуль, а теперь все это не работает ни фига. Сижу теперь книги изучаю, может все таки можно как то вызвать их от туда, ну не хочется мне все это дублировать в каждом документе. Смысл тогда для меня существования этого общего модуля если я ничего из него получить не могу
Добавлено через 1 минуту
Около месяца работы с этими формами, столько всего навыдумывала и тут такая
Подскажите, пожалуйста, как определить глобальные переменные в общем модуле, который содержит процедуры подписки на события?
Суть задачи: Из периодического регистра выбираются несколько значений в каждой подписке, все прописки вызывают процедуры этого же модуля для каждой строки табличных частей документа. Сейчас приходится в качестве параметра передавать эту кучу значений, полученных из регистра, т.к. для каждой строки получать заново эти периодические значения - кажется моветоном.
Ещё вопрос. Как определить глобальные переменные для всей конфигурации в целом и как для каждого сеанса в отдельности?
Flexy --> FlexyТолько описание процедур и функций. logist --> logist
Только описание процедур и функций. bolobol --> bolobol
Что есть "модуль обычного приложения"? Чем оно выгодно отличается от необычного приложения? shurik_shurik --> shurik_shurik
Тем, что работает на толстом клиенте. а необычное приложение - это тонкий клиент, или WEB-клиент, или внешнее соединение.
bolobol --> bolobolТогда, я не понимаю, что нужно установить, чтобы общий модуль стал модулем обычного приложения?, и мог использовать глобальные переменные. Ardi --> Ardi
Общий модуль не может быть модулем обычного приложения. Модуль обычного приложения - это, так сказать, глобальный модуль. В нем выполняются процедуры при запуске системы, подключаются обработчики ожидания и т. д. - тоесть выполняются такие глобальные задачи. Я даже не вижу смысла использовать там какие-то переменные. Есть модуль управляемого приложения - этот модуль "заменяет" модуль обычного приложения, когда 1С запускается в управляемом режиме. Есть модуль внешнего соединения - экспортные процедуры в этом модуле доступны при подключении к даной базе из другой базы.
Если все уж так плохо с получением данных из регистров, можно воспользоватся "СохранитьЗначение", "ВосстановитьЗначение". Но я бы занялся именно оптимизацией получения данных из регистров
Внедряю, сопровождаю, разрабатываю, обслуживаю 1С: +38 (066) 53-281-53 Ardi --> Ardiвот видео:
[необходимо зарегистрироваться для просмотра ссылки]
[необходимо зарегистрироваться для просмотра ссылки] bolobol --> bolobol
Плохо, если требуется пять раз за операцию получать одни и те же значения из БД. Придётся переписывать сам модуль, использующий пятикратное обращение к одним и тем же данным. Жаль.
Щас взломаем правила:вот видео:
[необходимо зарегистрироваться для просмотра ссылки]
[необходимо зарегистрироваться для просмотра ссылки]
Теперь мне понятно, где собака порылась. Другой вопрос, что эти модули на поддержке и мне это вариант не подходит. Буду переписывать.
logist --> logistЯ не знаю что Вы там делаете, но если допустить что между этими обращениями данные могут измениться, то такое обращение вероятно оправдано. А если данные 101% не меняются между обращениями, то возможно стоит пересмотреть логику всего кода который их обрабатывает, что бы в результате получить одну процедуру с одним обращением. vbi --> vbi
Есть еще один очень хитрый вариант, если данные меняются не часто: Использовать свойство внешнего модуля "Повторное использование возвращаемых значений" (Повторне використання значень, що повертаються).
1. Создаете новый общий модуль
2. Ставите галку "Повторное использование возвращаемых значений"
3. Пишите функцию, которая Вам возвращает Ваши труднособираемые данные в этом модуле
4. Функция обязательно должна иметь параметр (например число. Параметр не обязательно использовать внутри функции)
Например у Вас функция:
Далее дело обстоит так: когда Вы вызываете функцию и например передаете число или строку:
Функция проведет сложные расчеты и вернет Вам результат. Но если вы ее вызовите снова:
Функция вернет тот же результат, но в этот раз не будет проводить расчетов, а вернет сразу результат, полученный в предыдущий раз.
Если теперь вызвать
функция опять проведет расчеты и вернет некий (может и другой результат)
Если снова вызвать - тот же результат но без вычислений - результат полученный в первый раз тоже без вычислений.
И все это делает галочка в модуле "Повторное использование возвращаемых значений".
Честно говоря я не тестировал это все, но теоретически - должно работать
Внедряю, сопровождаю, разрабатываю, обслуживаю 1С: +38 (066) 53-281-53 Ardi --> ArdiМожет там уже есть готовая объявленная переменная для этого дела. bolobol --> bolobol
Читайте также: