Имя: Пароль:
1C
1C 7.7
v7: Проверить существование переменной по имени, если есть - получить значение
,
0 Злопчинский
 
16.06.24
16:33
Например, запускаем универсальную обработку в неизвестной конфигурации.
.
В коде обработки хочется узнать -
1. а есть ли в этой конфигурации глобальная переменная с именем "глПользователь" ..?
2. Если есть - вернуть значение переменной
.
хочется как-нить максимально штатно, при этом чтобы в окно сообщений никаких исключений не выдавалось, если штатно не получается - можно заюзать 1С++ и Formex
1 maxab72
 
16.06.24
16:39
Через Попытка Исключение годится?
и еще Шаблон()
2 Aleksey
 
16.06.24
16:41
глКаталогПечФорм=глКаталогПечФорм;
Если ТипЗначения(глКаталогПечФорм) = 0 Тогда
  Сообщить("Переменной нету")
КонецЕсли;
3 Aleksey
 
16.06.24
16:42
первая строка нужна чтобы небыло ошибки при компелляции
4 Злопчинский
 
16.06.24
16:48
(2) так и я умею, я так и сделал
глПользователь = глПользователь;
Пользователь = ?(ТипЗначенияСтр(глПользователь)="","<значение недоступно>",глПользователь);
в принципе покатит, вариант что переменная описана, но не инициализирована - маловероятен
5 Злопчинский
 
16.06.24
16:49
(1) не получится, выругается на синтаксис
6 Aleksey
 
16.06.24
17:09
7 Злопчинский
 
16.06.24
20:38
(6) А универсальный алгоритм, для произвольного количества переменных по их именам...
8 Aleksey
 
16.06.24
22:54
А какой смысл? Имя переменной тебе и так известно. Ты же имя не собираешь, типа имяпеременной = "перем" + й;
Поэтому можно и без вашего универсализма
9 Злопчинский
 
16.06.24
23:39
ну вот хочу на "вход" дать имя переменной, а на выходе результат.
Имя переменой м.б. в принципе любое: "глПользователь", "глКаталог", итд..
тогда я могу код применять без его дополнительного дописывания
10 MarySue
 
17.06.24
04:00
(7) ну видимо нужно весь тот код завернуть в Шаблон, и в параметр того шаблона подавать нужное имя
11 Злопчинский
 
17.06.24
04:32
(10) Попробуй... Шаблон будет в итоге исполняться, встретит неинициализированную переменную и выругается...
12 MarySue
 
17.06.24
05:00
(11) да, точно. Не сработало. Должно быть в явном виде объявление переменной.
13 victuan1
 
17.06.24
08:00
(7) Такой универсальный алгоритм тоже есть, но он требует использования объекта ВыполняемыйМодуль 1с++.

ИмяПроизвольнойПеременной = ПарамВход.Получить("ИмяПеременной");
Модуль = СоздатьОбъект("ВыполняемыйМодуль");
Модуль.УстановитьМодуль("т = "+ИмяПроизвольнойПеременной);
Попытка
	//Модуль.РазрешитьИсключения();
	Модуль.КомпилироватьМодуль();
	ПеременнаяОбъявлена = 1;
Исключение
	ПеременнаяОбъявлена = 0;
КонецПопытки;	
14 Злопчинский
 
17.06.24
12:00
Точно.
Думал в эту сторону
Но не дотумкал что можно успех компиляции отлавлиаать
15 Chai Nic
 
17.06.24
13:04
Да проверить/получить то легко. Через formex тот же.

Сложнее обратная задача. Задать/установить переменную контекста, если она не была до этого объявлена в коде..
16 Злопчинский
 
17.06.24
13:30
(15) в 1с++ там вроде для выполняемого модуля есть возможность назначить контекст
17 Chai Nic
 
17.06.24
13:34
(16) Как это поможет объявить новую переменную в заданном контексте?
18 victuan1
 
17.06.24
14:12
(15) Это тоже легко.
19 victuan1
 
17.06.24
14:17
(15) Например:

Функция ЗагрузитьДопГлМодуль(Сервис)
	Если 1=0 Тогда
		глМ_аисВерсияРелизаДляПроверки = ""
	КонецЕсли;
	Если ПустоеЗначение(глМ_аисВерсияРелизаДляПроверки)=0 Тогда
		глМ_Загружен = 1;
		Возврат 1
	Иначе
		Если Сервис.ДобавитьГлобальныйМодуль(ТекстМодуля) = 0 Тогда
			Сообщить("Попытка загрузки доп. гл. модуля не удалась!","!!",1);
			Возврат -1; //не удалось создать доп. гл. модуль
		КонецЕсли;
		//Сообщить("доп гл. модуль смогли загрузить");
		Возврат 1;
	КонецЕсли;
КонецФункции // ЗагрузитьДопГлМодуль
20 Chai Nic
 
17.06.24
14:17
(18) Можно пример кода?
21 Chai Nic
 
17.06.24
14:18
(19) Я не понял смысла этого фрагмента. Мне надо:
1. Есть некий контекст, полученный тем или иным способом
2. В этом контексте я хочу создать новую переменную (её изначально нет) и присвоить ей значение, чтобы оно стало доступным далее

Как это сделать?
22 victuan1
 
17.06.24
14:27
(21) "Контекст" это что такое? Какой объект данных?
23 victuan1
 
17.06.24
15:13
(21) Ну пусть контекст это текущий Контекст ))
Тогда в продолжение примера в (13) через вспомогательную переменную ПеременнаяОбъявлена мы знаем есть ли переменная в контексте, если ее нет, то объявим ее и присвоим ей некое значение:

Функция глПрисвоить(Кому,Что) Кому = Что КонецФункции
...

Если ПеременнаяОбъявлена = 0 Тогда
	НовоеЗначение = "Привет, о, мир!";
	Шаблон("[глПрисвоить(ИмяПроизвольнойПеременной, НовоеЗначение)]");
КонецЕсли;