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

18.02.07

Разработка - Механизмы платформы 1С

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

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

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


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

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

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

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

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

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


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

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

См. также

"Виртуальный" работник на платформе 1C v7.7

Механизмы платформы 1С Платформа 1С v7.7 Конфигурации 1cv7 Бесплатно (free)

В статье расписаны примеры из жизни использования "Виртуального" работника. Разобраны вопросы, возникающие при работе с ним.

28.11.2021    1545    user707242_Gold_karas    18    

5

Асинхронное программирование в 1с77 без внешних компонент. Обратные вызовы.

Механизмы платформы 1С Платформа 1С v7.7 Абонемент ($m)

Пример построения программного кода для достижения функционала обратных вызовов (call back) во внешних обработках исключительно штатными средствами. Тестировалось на платформе 1с77 релиз 027. Конфигурация значения не имеет.

1 стартмани

06.10.2018    7444    Vortigaunt    5    

11

Особенности разделения объектной модели документа и базы данных в 1С 7.7. Забавный глюк

Механизмы платформы 1С Оперативный учет 7.7 Абонемент ($m)

Когда занимаешься разработкой в среде 1С, редко задумываешься о том, что программным кодом ты работаешь с объектной моделью базы данных, а не с самой базой данных. И что это вообще разные вещи. Ты создаешь объекты: документы и справочники, записываешь их - и в базе данных появляются соответствующие записи. Это настолько привычно, что когда сталкиваешься с нетипичным поведением платформы, первым делом думаешь: надо протестировать базу, она битая. В этой статье я хочу разобрать одну интересную ситуацию, которая как раз демонстрирует такое поведение. Описанная ниже ситуация воспроизводится как в файловом, так и в клиент-серверном (SQL) варианте. Тестировалось на версии платформы 1с77 релиз 027.

1 стартмани

16.05.2018    10124    Vortigaunt    26    

5

Использование классов .Net в 1С для новичков

Механизмы платформы 1С Платформа 1С v7.7 Платформа 1С v8.3 Бесплатно (free)

Руководство для новичков. Написав статью http://infostart.ru/public/238584/, я понял, что многие не понимают того, что написано. Поэтому в этой статье постараюсь более подробно остановиться на азах и без кода на вражеском языке (C#)

27.01.2016    93955    Serginio    116    

188

Все про картинки в 1С 7.7, ну или почти все...

Механизмы платформы 1С Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

В 1С 8 наличие картинок товаров предусмотрено изначально, а в 7.7 такого нет. Проблема существует и ее исправляют, но это, как правило, частные случаи, касающиеся, например, печати прайса http://infostart.ru/public/289876/ , показу картинок в справочнике номенклатура http://infostart.ru/public/17125/, файловый менеджер картинок товара http://infostart.ru/public/15239/ или просто конфигурации работы с картинками http://infostart.ru/public/21142/ (не стремился дать полный обзор, поэтому не попавшие не обижайтесь :). Что не устроило – информация разбросана по статьям, необходимость дополнительно напрягаться, чтобы это заработало. Здесь я попытался собрать все «до кучи», а так же дать необходимые ссылки для желающих «копнуть вглубь».

1 стартмани

18.11.2014    43976    95    kitminsk    18    

20

ЗаполнитьЗначенияСвойств - заставляем работать в 7.7

Механизмы платформы 1С Платформа 1С v7.7 Конфигурации 1cv7 Бесплатно (free)

Если вы используете в работе 1С:Предприятие 8.х, то наверняка знакомы и с замечательной системной процедурой, как ЗаполнитьЗначенияСвойств(). Ее использование помогает значительно упростить написание программного кода в ряде случае, делает его (код) более наглядным и простым. Но что же делать тем, кто до сих пор использует (постоянно или иногда) 1С:Предприятие 7.7?

24.07.2014    23721    tomvlad    5    

14

Динамическая фильтрация в справочнике при вводе наименования

Механизмы платформы 1С Платформа 1С v7.7 Конфигурации 1cv7 Россия Бесплатно (free)

Позволяет в открытой форме списка, выбора или подбора справочника производить динамическую фильтрацию по набранному наименованию.

02.07.2012    18354    maxpiter    62    

15
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. support 4484 19.02.07 11:45 Сейчас в теме
2. 20.02.07 11:57 Сейчас в теме
а, чо , код :

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

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

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

Короче, решение некоторых задач на 1С напоминает старые добрые квесты, честное слово.
7. support 4484 21.02.07 21:48 Сейчас в теме
Можно еще вот так
А=1+А;
8. O-Planet 6431 21.02.07 23:21 Сейчас в теме
... но эту проблему обойти уже легче

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

Те, кто этой логики не поймут срочно должны менять профессию ;)
10. Abadonna 3958 22.02.07 05:14 Сейчас в теме
>.. но эту проблему обойти уже легче
>Ну так обойди! А так - статья не закончена.
А вот ЭТУ проблему как раз НЕ обойти
11. Abadonna 3958 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 3958 22.02.07 12:12 Сейчас в теме
2Альф.
Метод автора я не проверя, а вот в таком виде
Процедура Сформировать()
глКаталогПечФорм=глКаталогПечФорм;
Если ПустоеЗначение(глКаталогПечФорм)=1 Тогда
Сообщить("Переменной нет");
Иначе
Сообщить(глКаталогПечФорм);
КонецЕсли;
КонецПроцедуры
в стандартной бухгалтерии успешно печатает
C:\1SBDB\ExtForms\PrnForms\
а в пустой базе
Переменной нет
14. support 4484 22.02.07 12:24 Сейчас в теме
глКаталогПечФорм=глКаталогПечФорм;
Гениально!
15. Abadonna 3958 22.02.07 12:28 Сейчас в теме
Да! Добавил еще одну процедурку
Процедура ЕщеРаз()
Сообщить(глКаталогПечФорм);
КонецПроцедуры
всё успешно выводится.
Если бы переменная приняла локальный контекст, по идее,
после отработки Сформировать() при выполнении ЕщеРаз() должно было ругнуться, что
переменная не обнаружена. А раз работает, значит как была глобальной, так и осталась
16. alexqc 150 22.02.07 13:28 Сейчас в теме
Гл. переменная есть, а значение не присвоено - как раз не обойти, но в большинстве случаев и не надо.
17. Abadonna 3958 22.02.07 15:40 Сейчас в теме
2Support
Случайно заметил: нажал Новые комментарии внизу, страница обновилась, НО порядок остался тот же (новые вверху)
18. clappa 902 22.02.07 19:10 Сейчас в теме
Добавил про обход проблемы с неинициализированной переменной
19. Abadonna 3958 22.02.07 20:57 Сейчас в теме
Ха! Молодец!
Один мой знакомый, имя в виду слово "мудр", говорил так: "ну ты и мудёр" ;)
+1
20. Abadonna 3958 23.02.07 15:19 Сейчас в теме
Для особо непонятливых надо было дописать в процедуре Проверка()
перед КонецПроцедуры ---> Сообщить(глКаталогПечФорм):
21. support 4484 28.02.07 14:03 Сейчас в теме
автор, надо просто сделать
глКаталогПечФорм=глКаталогПечФорм;
22. brr 182 09.03.07 10:55 Сейчас в теме
Я поставил плюс автору и Abadonnе.
23. support 4484 28.05.07 15:40 Сейчас в теме
сегодня проверил метод, не работает.
когда объявляешь переменную, она объявляется локальной переменной,
и даже конструкция А=А не вызывает глобальную.
24. poppy 29.05.07 00:23 Сейчас в теме
2 support
> когда объявляешь переменную, она объявляется локальной переменной,
и даже конструкция А=А не вызывает глобальную.

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

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