Имя: Пароль:
1C
 
Как узнать о наличии определенной глобальной переменной? Чтобы не было синт. ошибки?
0 DJ Anthon
 
03.02.10
15:25
Требуется запустить обработку на произвольной базе (может быть любая конфигурация, даже самописная), в конфиге может присутствовать некий набор функций и переменных. в случае, если они присутствуют, необходимо использовать их, иначе - аналоги в форме обработки (по типу DirectX )).
Как узнать, что такая-то функция/переменная определена и взять ее значение? Попытка не выручает - ошибка синтаксического контроля.. (( П.С. Конфиги править нельзя и пихать в базу лишние файлы тоже...
1 Fragster
 
гуру
03.02.10
15:26
попытка Шаблон(...)
2 DJ Anthon
 
03.02.10
15:29
вот над этим и думаю. не получаццо.
3 Ненавижу 1С
 
гуру
03.02.10
15:30
придумай свое пространство имен как бы (префикс для переменных) и используй

моясуперкрутаяобработкаЗначение = 10;
4 DJ Anthon
 
03.02.10
15:31
(1) она одинаково отрабатывает как существующую, так и несуществующую переменную, если у нее нестроковый тип данных, возвращает "" и никакой ошибки / сообщения ((
5 DJ Anthon
 
03.02.10
15:32
(3) это сделано. вот только если в конфиге еще нет -
моясуперкрутаяобработкаЗначение = 10;
КАК МНЕ ЭТО ПРОГРАММНО УЗНАТЬ? ))
6 Ненавижу 1С
 
гуру
03.02.10
15:33
(5) будь уверен )) придумывай имена покруче
7 Ненавижу 1С
 
гуру
03.02.10
15:34
блин, сорри, я не о том
8 Ёпрст
 
03.02.10
15:36
(0) Шаблон
9 DJ Anthon
 
03.02.10
15:36
короче говоря, есть что-нибудь подобное как в формах и таблицах

попытка
  ПолучитьИзБазы = ПолучитьАтрибут("ХренЗнаетКакаяФункция")
исключение
  сообщить("а вот нема такой функции!");
  ПолучитьИзБазы = 0;
конецпопытки

а то принципиально невозможно использовать неописанную переменную, это я понимаю. но нужно это как-то обыграть.
пока спасает

Метаданные.Обработка("ВсеТакиЭтоМояКонфига").Выбран()

но глобальную функцию трудно выполнить, неописав ее.
10 DJ Anthon
 
03.02.10
15:37
(8) переменная типа Контекст. шаблон возвращает ее значение как "". ДАЖЕ ЕСЛИ ЕЕ НЕТ ((((( вот если бы знать, что ее нет! мне факт нужен, что ее нет!, а уже потом ее значение....
11 ProxyInspector
 
03.02.10
15:38
(0) Пока это никому не удавалось сделать штатными средствами.
12 Ёпрст
 
03.02.10
15:39
ща вспомню. был метод. Причем штатный.
13 ASU_Diamond
 
03.02.10
15:39
если у тебя аналог в форме обработки, то зачем пользовать встроенные в конфигу?
14 DJ Anthon
 
03.02.10
15:40
решение есть с помощью допмодуля FormEx, но он очень нестабильный, 1ска постоянно ложится, после двух-трех подключений, использовать не получается. а на форуме по формексу этот глюк игнорируют, он трудновыловимый.
15 DJ Anthon
 
03.02.10
15:42
(13) самый прикол! в разных конфигах реализация функций отличается, более того, версия функции в конфиге может быть позже, а также код может там меняться произвольно (и довольно часто). те конфиги, которые не мои (( мне править низя... а функция эта может вообще отсутствовать
16 Ёпрст
 
03.02.10
15:43
17 DJ Anthon
 
03.02.10
15:43
ща попробую вариант - попытка открыть обработку, в которой идет обращение к этой переменной...
18 Волшебник
 
03.02.10
15:43
ИмяПеременной = "блаблабла";
   Попытка
    а = Вычислить(ИмяПеременной);
    Сообщить("Есть переменная " + ИмяПеременной);
   Исключение
    Сообщить("Нет переменной " + ИмяПеременной);
   КонецПопытки;

По мотивам
Книга знаний: Метод Рупора
19 Fragster
 
гуру
03.02.10
15:44
(18) это восьмерка
20 Sadovnikov
 
03.02.10
15:45
(18) Ты на письма принципиально не отвечаешь или, просто, давно в почту не заглядывал?
21 Волшебник
 
03.02.10
15:45
(19) Ну в 7.7 через Шаблон
22 ProxyInspector
 
03.02.10
15:45
Может быть
 Попытка
    ОткрытьФорму(ВнешняяОбработка);
 Исключение
    Сообщить("Проблемы");
 КонецПопытки;
23 ProxyInspector
 
03.02.10
15:46
(16) Мне очень понравилось

глКаталогПечФорм=глКаталогПечФорм;
Если ТипЗначения(глКаталогПечФорм) = 0 Тогда
 Сообщить("Переменной нету")
КонецЕсли;
24 DJ Anthon
 
03.02.10
15:46
(18) ! это и ежу понятно! у меня такая функциия есть:

Функция Выполнить(Код, Конт = 0) Экспорт
   Если глСервис = 0 Тогда
       Возврат 0;
   КонецЕсли;
   Старый = глМодуль;
   глКод = "Функция ВыполнитьДополнительно" + Старый + "() Экспорт " + РазделительСтрок + Код + РазделительСтрок + "Возврат 1; КонецФункции";
   глМодуль = глСервис.ДобавитьГлобальныйМодуль(глКод);
   глКод = Код;
   Если глМодуль = 0 Тогда
       Сообщить("Невозможно запустить код. Ошибка: " + ОписаниеОшибки());
       Возврат 0;
   КонецЕсли;
   Если Шаблон("[ВыполнитьДополнительно" + Старый + "()]") = "1" Тогда
       Сообщить("Выполнение завершено успешно. Код модуля: " + глМодуль);
//        глСервис.УдалитьГлобальныйМодуль(глМодуль);
       Возврат 1;
   КонецЕсли;
   Сообщить("Выполнение завершено с ошибками. Код модуля: " + глМодуль, "!!");
//    глСервис.УдалитьГлобальныйМодуль(глМодуль);
   Возврат 0;
КонецФункции


но она нестабильная
25 DJ Anthon
 
03.02.10
15:47
выполняет произвольный код в 7.7! )) но не канает
26 DJ Anthon
 
03.02.10
15:48
(22)=(17) по хочу вариант, только громоздкий...
27 DJ Anthon
 
03.02.10
15:48
по ходу*
28 Sadovnikov
 
03.02.10
15:48
(25) А зачем так-то?
   Модуль = СоздатьОбъект("ВыполняемыйМодуль");
   Модуль.УстановитьМодуль("
   |Функция ПолучитьЗначение()
   |    Возврат "+ИдентЭлемДиалога+"
   |КонецФункции
   |
   |Процедура УстановитьЗначение(НовЗнач)
   |    "+ИдентЭлемДиалога+" = НовЗнач;
   |КонецПроцедуры
   |
   |Функция ВыборГруппы()
   |    Возврат ?(Форма."+ИдентЭлемДиалога+".ВыборГруппы() = 1, 1, 0);
   |КонецФункции
   |");
   Модуль.НазначитьКонтекст(Конт);
   Модуль.КомпилироватьМодуль();
   Модуль.ВыполнитьМодуль();

   ЗначениеЭлемента = Модуль.ПолучитьЗначение();
29 ProxyInspector
 
03.02.10
15:48
(25) Так ты (16) попробовал?
30 DJ Anthon
 
03.02.10
15:49
(29) зашел, посмотрел. все это я знаю. а задача все равно другая
31 DJ Anthon
 
03.02.10
15:50
(28) как сумел, так написал. а это
СоздатьОбъект("ВыполняемыйМодуль")
откуда?
32 Sadovnikov
 
03.02.10
15:51
(31) 1С++. Причем, работает стабильно.
33 DJ Anthon
 
03.02.10
15:51
так и думал... мне 1cpp использовать нельзя... не мое решение, просто табу (((((
34 Sadovnikov
 
03.02.10
15:52
(33) О как... Формэкс - можно, а 1С++ - низя? Странная религия...
35 DJ Anthon
 
03.02.10
15:53
(34) да. я на формекс-то не знаю как убедил прогеров, я с ними в симбиозе, пишу им доработочки, с их условиями. а они мне - денюфку...
36 Sadovnikov
 
03.02.10
15:54
(35) Пошарь на инфостарте - там был пример, как в обработку ВК засовывать. И офцы целы и 1С++ у тебя есть :)
37 DJ Anthon
 
03.02.10
15:58
(29) - этот вариант (22) по ходу проканает. все равно использую одну внешнюю обработочку, вот в ней попробую сделать обращение к нужным функциям. если проканает, тогда

попытка
КонтФормы = открыть форму внешнего отчета
Сервис.ВыполнитьПроцедуру(КонтФормы, "ВотТакаяДолбанутаяФункция")
исключение
сообщить("что ж, придется вызывать местные...");
конецпопытки

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


(36) мне себя не обмануть ) это принципиально надо решить, засунуть я что угодно кому угодно могу. как-то раз в ert-шник запихивал сертификаты подлинности, вот смеху-то было....
Ладно, спасибо за советы
38 DJ Anthon
 
03.02.10
16:04
http://www.infostart.ru/public/16943/ - Епрст! спасибо! гениально!
39 ProxyInspector
 
03.02.10
16:14
(16) Гениальный способ и работает.
Процедура ПопробоватьУстановитьПеременную()
    глКаталогПечФорм = "Ура!"
КонецПроцедуры

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

   Сервис = 0;
   Если 1 = 0 Тогда глСервис = 0 КонецЕсли;
   Если ТипЗначения(глСервис) = 100 Тогда
       Сервис = глСервис;
   КонецЕсли;
   Если Сервис = 0 Тогда

.... мне типа не жалко и свою переменную использовать. просто метод и дальше работает )) и с контекстами, и с массивами, супер
41 DJ Anthon
 
03.02.10
16:45
* массивами = таблицами и списками
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой