gifts2017

Как определить, есть ли переменная в глобальном модуле?

Опубликовал Сергей Барышников (clappa) в раздел Программирование - Практика программирования

Метод определения из внешнего отчета наличия в глобальном модуле определенной переменной. Может иметь и другие применения.
Может и баян, не знаю. Случайно наткнулся.

Пол-года назад необходимо было из внешнего отчета проверить, определена ли в глобальном модуле переменная глКаталогПечФорм (ну, типа, универсальный отчет, сам подстраивается под механизмы конфигурации).

Хотелось простой конструкции типа:
Если ТипЗначения(глКаталогПечФорм) = 0 Тогда
  Сообщить("Переменной нету")
КонецЕсли;


Однако при открытии отчета в конфигурации без глКаталогПечФорм, отчет вываливал ошибку компиляции.

Тогда нормально так и не решил проблему (сделал через шаблон, но всё равно, при отсутствии переменной в глобальном модуле в окно сообщений вылезала ошибка).

Сегодня торкнуло:

Если 1=0 Тогда глКаталогПечФорм = 0 КонецЕсли;
Если ТипЗначения(глКаталогПечФорм) = 0 Тогда
  Сообщить("Переменной нету")
КонецЕсли;

Бред, конечно, но работает! Правда, неверно определяется случай, когда переменная есть, а значение ей не присвоено, но эту проблему обойти уже легче.

В процессе обсуждения этой статьи Abadonna предложил ещё более лаконичный вариант:
глКаталогПечФорм=глКаталогПечФорм;
Если ТипЗначения(глКаталогПечФорм) = 0 Тогда
  Сообщить("Переменной нету")
КонецЕсли;


Обход упомянутой проблемы с неициализированной переменной
Процедура ПопробоватьУстановитьПеременную()
     глКаталогПечФорм = "Ура!"
КонецПроцедуры

Процедура Проверка()
  глКаталогПечФорм=глКаталогПечФорм;
  Если ТипЗначения(глКаталогПечФорм) = 0 Тогда
    ПопробоватьУстановитьПеременную();
    Если глКаталогПечФорм <> "Ура!" Тогда
      Сообщить("Переменной нету")
    Иначе
      глКаталогПечФорм = ПолучитьПустоеЗначение() //Вернем как было
    КонецЕсли;
  КонецЕсли;
КонецПроцедуры
 

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Доржи Цыденов (support) 19.02.07 11:45
2. К. Ламберт 20.02.07 11:57
а, чо , код :

Попытка
ы = глКаталогПечФорм;
Исключение
Сообщить("Переменной нету");
КонецПопытки;

не катит ?
3. Сергей Барышников (clappa) 20.02.07 18:01
4. Аркадий Кучер (Abadonna) 21.02.07 16:14
2К. Ламберт
А подумать прежде чем вопрос задавать не катит?
5. Аркадий Кучер (Abadonna) 21.02.07 19:15
2clappa.
А почему ты, кстати, пишешь, что бредово? Наоборот, супер-красивым способом объявил переменную внутри никогда не выполняемого условия.
6. Сергей Барышников (clappa) 21.02.07 20:58
Ну, как сказать. Язык программирования - это ведь тоже язык. Подразумевающий логику. А тут... Многие поймут смысл этой конструкции?

Типа, чтобы попросить у прохожего прикурить, я должен спросить его: "Который час?". И кодовую фразу эту знаем во всём мире только он, я и Пит (который вообще всё знает, но никому не скажет).

Короче, решение некоторых задач на 1С напоминает старые добрые квесты, честное слово.
7. Доржи Цыденов (support) 21.02.07 21:48
8. Олег Пономаренко (O-Planet) 21.02.07 23:21
... но эту проблему обойти уже легче

Ну так обойди! А так - статья не закончена.
9. Аркадий Кучер (Abadonna) 22.02.07 03:43
>Подразумевающий логику. А тут... Многие поймут смысл этой конструкции?
Логика тут железная:
1. Чтобы обойти синтаксис-контроль мне надо как-то объявить переменную, но так чтобы она не поменяла значения
2. Я поставлю никогда не выполнимое условие, внутри которого ее и объявлю методом присваивания

Те, кто этой логики не поймут срочно должны менять профессию ;)
10. Аркадий Кучер (Abadonna) 22.02.07 05:14
>.. но эту проблему обойти уже легче
>Ну так обойди! А так - статья не закончена.
А вот ЭТУ проблему как раз НЕ обойти
11. Аркадий Кучер (Abadonna) 22.02.07 06:34
Кстати, приколитесь:
сидит рядом со мной дедушка-программист (63 года), который вовсю программит в DOS-Klipper, а в Клиппере ему почему-то проблематично поставить комментарии сразу на блок операторов.
Он уж давно изобрел такой способ закомментровать
if 0>1
strr=natr+' '+s_fakt[ii,2]+' '+s_fakt[ii,3]+' ';
+s_fakt[ii,4]+s_fakt[ii,5]+s_fakt[ii,6]+s_fakt[ii,7]+' ';
+s_fakt[ii,8]+s_fakt[ii,9]+s_fakt[ii,10]+s_fakt[ii,11]
endif
12. АЛьФ (АЛьФ) 22.02.07 11:15
А объявление локальной переменной разве не перекроет глобальную? Путь даже локальная объявлена вот так, но ведь объявлена. И в другом месте обращение будет к ней, а не к глобальной.
13. Аркадий Кучер (Abadonna) 22.02.07 12:12
2Альф.
Метод автора я не проверя, а вот в таком виде
Процедура Сформировать()
глКаталогПечФорм=глКаталогПечФорм;
Если ПустоеЗначение(глКаталогПечФорм)=1 Тогда
Сообщить("Переменной нет");
Иначе
Сообщить(глКаталогПечФорм);
КонецЕсли;
КонецПроцедуры
в стандартной бухгалтерии успешно печатает
C:\1SBDB\ExtForms\PrnForms\
а в пустой базе
Переменной нет
14. Доржи Цыденов (support) 22.02.07 12:24
глКаталогПечФорм=глКаталогПечФорм;
Гениально!
15. Аркадий Кучер (Abadonna) 22.02.07 12:28
Да! Добавил еще одну процедурку
Процедура ЕщеРаз()
Сообщить(глКаталогПечФорм);
КонецПроцедуры
всё успешно выводится.
Если бы переменная приняла локальный контекст, по идее,
после отработки Сформировать() при выполнении ЕщеРаз() должно было ругнуться, что
переменная не обнаружена. А раз работает, значит как была глобальной, так и осталась
16. AlexQC (alexqc) 22.02.07 13:28
Гл. переменная есть, а значение не присвоено - как раз не обойти, но в большинстве случаев и не надо.
17. Аркадий Кучер (Abadonna) 22.02.07 15:40
2Support
Случайно заметил: нажал Новые комментарии внизу, страница обновилась, НО порядок остался тот же (новые вверху)
18. Сергей Барышников (clappa) 22.02.07 19:10
Добавил про обход проблемы с неинициализированной переменной
19. Аркадий Кучер (Abadonna) 22.02.07 20:57
Ха! Молодец!
Один мой знакомый, имя в виду слово "мудр", говорил так: "ну ты и мудёр" ;)
+1
20. Аркадий Кучер (Abadonna) 23.02.07 15:19
Для особо непонятливых надо было дописать в процедуре Проверка()
перед КонецПроцедуры ---> Сообщить(глКаталогПечФорм):
21. Доржи Цыденов (support) 28.02.07 14:03
автор, надо просто сделать
глКаталогПечФорм=глКаталогПечФорм;
22. Brr (brr) 09.03.07 10:55
Я поставил плюс автору и Abadonnе.
23. Доржи Цыденов (support) 28.05.07 15:40
сегодня проверил метод, не работает.
когда объявляешь переменную, она объявляется локальной переменной,
и даже конструкция А=А не вызывает глобальную.
24. Poppy (poppy) 29.05.07 00:23
2 support
> когда объявляешь переменную, она объявляется локальной переменной,
и даже конструкция А=А не вызывает глобальную.

Хм... Ты как объявляешь переменную? "Перем А"? Это ни к чему...
Сама конструкция А=А объявляет локальную переменную "А", при условии, что она не объявлена как глобальная.
На этом и строится весь "фокус".
25. Доржи Цыденов (support) 31.05.07 22:25
Сама конструкция А=А объявляет локальную переменную "А", И НЕ ВАЖНО, что она объявлена как глобальная.
Это будет локальная переменная. Тоже самое, что объявить ее в начале процедуры
Перем А;
26. Poppy (poppy) 01.06.07 00:12
> Сама конструкция А=А объявляет локальную переменную "А", И НЕ ВАЖНО, что она объявлена как глобальная.

Не логично. Это что получается? Если я напишу А=А; А=Б;, то у меня "локальная" переменная А будет равна Б, но глобальная "А" останется неизменной? Не верю...
27. Аркадий Кучер (Abadonna) 01.06.07 03:15
Не понял о чем спор:
Гл модуль:
Перем глА Экспорт;
глА=5;
Отчет:
глА=глА;
Сообщить(глА); // сообщает 5
Гл модуль:
//Перем глА Экспорт; - не объявили
глА=5;
Отчет:
глА=глА;
Сообщить(глА); // сообщает пусто
Как-то странно ты проверял...
28. Аркадий Кучер (Abadonna) 01.06.07 03:27
Мало того! Если в первом отчете:
Процедура Сформировать()
глА=глА;
Сообщить(глА); // сообщает 5
глА=10; // присвоили 10
КонецПроцедуры
то при запуске после него другого отчета:
Процедура Сформировать()
Сообщить(глА); // сообщает 10
КонецПроцедуры
29. Михаил Семенов (Shaman100M) 25.10.07 12:23
Найти другой способ головоломно.
Буду знать как обманывать синтаксис :)
30. Alexandr (maloi_a) 01.02.08 12:29
Можно в процедуре "Проверка()" обойтись без встроенной функции ПолучитьПустоеЗначение():
Код
Процедура Проверка()
  Перем РабглКаталогПечФорм;
  глКаталогПечФорм=глКаталогПечФорм;
  Если ТипЗначения(глКаталогПечФорм) = 0 Тогда
    РабглКаталогПечФорм=глКаталогПечФорм;
    ПопробоватьУстановитьПеременную();
    Если глКаталогПечФорм <> "Ура!" Тогда
      Сообщить("Переменной нету")
    Иначе
      глКаталогПечФорм=РабглКаталогПечФорм; //Вернем как было до изменения глКаталогПечФорм
    КонецЕсли;
  КонецЕсли;
КонецПроцедуры
Показать полностью
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа