|   |   | 
| 
 | 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 Тогда
	НовоеЗначение = "Привет, о, мир!";
	Шаблон("[глПрисвоить(ИмяПроизвольнойПеременной, НовоеЗначение)]");
КонецЕсли; | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |