Переключение на Главную Страницу Страницы: 1 [2] 3  ОтправитьПечать
Очень популярная тема (более 25 ответов) Переменная контекста по имени (число прочтений - 10694 )
DionX
Senior Member
****
Отсутствует



Сообщений: 373
Местоположение: Кемерово
Зарегистрирован: 22. Августа 2006
Пол: Мужской
Re: Переменная контекста по имени
Ответ #15 - 05. Октября 2007 :: 07:33
Печать  
получается, что приходится изгалятся вот так:
Цитата:
Функция ПолучитьРеквизит(Конт,Реквизит)
     Сервис=СоздатьОбъект("Сервис");
     Рез="";
     Если Сервис.ПолучитьПеременнуюКонтекста(Конт,Реквизит,Рез)=1 Тогда  //здесь результат получим, если получаем переменную
     Иначе //получаем значение реквизита
           Попытка //в надежде, что это реквизит док-а
                 Рез=Конт.ПолучитьАтрибут(Реквизит);
           Исключение//зна это просто нарисованный на форме атрибут... наверно))))
                 Попытка
                       РасшФормы=СоздатьОбъект("РасширениеФормы");
                       РасшФормы.УстановитьФорму(Конт.Форма);
                       Рез=РасшФормы.ПолучитьАтрибут(Реквизит).Значение;
                 Исключение
                       Сообщить("Невозможно получить значение для '"+Реквизит+"'!","!");
                 КонецПопытки;
           КонецПопытки;
     КонецЕсли;
     //*
     Возврат Рез;
КонецФункции

и то: это подходит только для того, чтоб получить значение рекфизита документа или справочника/реквизита формы/переменной. А хотелось бы иметь возможность вычислять целые выражение в нужном контексте. Нерешительный
  
Наверх
ICQ  
IP записан
 
sedmin
1c++ developer
Отсутствует


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Переменная контекста по имени
Ответ #16 - 05. Октября 2007 :: 07:50
Печать  
DionX писал(а) 05. Октября 2007 :: 07:29:
спасибо, но...
работает для, например, реквизитов документа, но не работает для переменных модуля документа и для реквизитов формы документа ((((


Откуда следует такой вывод? У нас везде работает. Кроме как для неэкспортных переменных классов.
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Переменная контекста по имени
Ответ #17 - 05. Октября 2007 :: 09:55
Печать  
sedmin писал(а) 05. Октября 2007 :: 06:03:
Дарю рабочий код. При желании, можно доработать напильником Улыбка

Код
Выбрать все
Перем _ЗначениеВыражения Экспорт;
// и т.д.
 


Подразумевается, что указанный код находится в глобальнике конфы.
Если код закинуть в класс, то не сработает Улыбка

(DionX)Возможно, ты забыл закинуть определение
Перем _ЗначениеВыражения Экспорт;
в начало глобальника??
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
sedmin
1c++ developer
Отсутствует


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Переменная контекста по имени
Ответ #18 - 05. Октября 2007 :: 14:07
Печать  
Ага. Это недостаток этого кода.

Но если определить функцию, которая возвращает значение, то у нее есть другой недостаток. Иногда она выдает не то, что надо.  И как это исправить - я не знаю. Похоже, что это в кишках 1С.
А еще при этом неправильно обрабатываются исключения.

Для того и тесты пишутся, чтобы подобные вещи ловились. А этот код многократно протестированный. А так от балды можно и любой другой код написать. Улыбка

Так что - проверено, мин нет.  Подмигивание

И еще. С помощью этого кода было выловлено множество багов, которые были незаметны при использовании Шаблона().
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Переменная контекста по имени
Ответ #19 - 05. Октября 2007 :: 21:45
Печать  
А если способ определить переменную по имени, которая не является реквизитом и не объявлена
в разделе "перем" модуля ?
Штатный 1С запрос же определяет локальные переменные процедуры как то...
  
Наверх
 
IP записан
 
DionX
Senior Member
****
Отсутствует



Сообщений: 373
Местоположение: Кемерово
Зарегистрирован: 22. Августа 2006
Пол: Мужской
Re: Переменная контекста по имени
Ответ #20 - 08. Октября 2007 :: 01:35
Печать  
artbear писал(а) 05. Октября 2007 :: 09:55:
Подразумевается, что указанный код находится в глобальнике конфы.
Если код закинуть в класс, то не сработает Улыбка


Угу, примерно так было...
Дело в том, что глобальник мне правиль низя в этом случае!)))
Вроде обрулил ситуацию с помощью Альфовского "ДобавитьГлобальныйМодуль"... потом делаю так:
Код
Выбрать все
Функция ВычислитьВыражение(Конт,Выражение)
	ВМ=СоздатьОбъект("ВыполняемыйМодуль");
	ВМ.НазначитьКонтекст(Конт);
	ВМ.УстановитьМодуль("
						 |Функция ВычВыр(Конт,Выражение)
						 |	Возврат глВычислитьВыражение(Конт,Выражение);
						 |КонецФункции");
	ВМ.КомпилироватьИВыполнитьМодуль();
	Возврат ВМ.ВычВыр(Конт,Выражение);
КонецФункции
 


Рабатет для реквизитов док-та, для реквизитов формы, но по прежнему не работает для переменных, объявленных в моделе формы. Пытался даже на всякий случай объявлять с Экспорт.
Выдаёт:
Цитата:
=== Syntax error в модуле 'unknown' 40563920
Ошибка выполнения макровыражения:_ЗначениеВыражения=ШаблонПечати
  
Наверх
ICQ  
IP записан
 
DionX
Senior Member
****
Отсутствует



Сообщений: 373
Местоположение: Кемерово
Зарегистрирован: 22. Августа 2006
Пол: Мужской
Re: Переменная контекста по имени
Ответ #21 - 08. Октября 2007 :: 08:18
Печать  
странное дело...
вообще механизм работы:
допустим из открытого док-та открыватся обработка
Цитата:
ОткрытьФорму("Отчет.ТакойТо",Контекст)

В этой обработке мне и необходимо получить значения некоторых переменных открывшего её документа. Так вот, заходим в 1С, открываем документ, жмём кнопочку запускающую обработку, выскакивает только что описанная мною ошибка. Сколько на кнопочку не жми - ошибка не пропадает))))
Закрываем до-т, открываем, повторяем все манипуляции - всё работает!)))) И продолжает работать до тех пор, пока не выйти из 1С. Потом снова даёт сбой при первой открытии док-та, при повторном начинает все работать.  Что за зараза?)))))
  
Наверх
ICQ  
IP записан
 
DionX
Senior Member
****
Отсутствует



Сообщений: 373
Местоположение: Кемерово
Зарегистрирован: 22. Августа 2006
Пол: Мужской
Re: Переменная контекста по имени
Ответ #22 - 08. Октября 2007 :: 08:32
Печать  
всё, вопрос решён собственными силами. Ларчик-то просто открывался! Смех
Дело в том, что в конфиге 1спп по умолчанию не загружена. Грузилась она у меня только при открытии обработки. Поэтому, видимо, при первом открытии док-та переменные и не считывались, т.к. при открытии док-та 1спп ещё не была подгружена.)))
  
Наверх
ICQ  
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Переменная контекста по имени
Ответ #23 - 08. Октября 2007 :: 08:38
Печать  
Тем не менее, как определить переменную по имени, если она объявлена только в локальной
процедуре так и остался Печаль
  
Наверх
 
IP записан
 
sedmin
1c++ developer
Отсутствует


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Переменная контекста по имени
Ответ #24 - 08. Октября 2007 :: 13:58
Печать  
kiruha писал(а) 08. Октября 2007 :: 08:38:
Тем не менее, как определить переменную по имени, если она объявлена только в локальной
процедуре так и остался Печаль


Никак. Локальная переменная - она и есть локальная.

Не надо пытаться нарушать принципы видимости переменных. Это один из основополагающих принципов.
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Переменная контекста по имени
Ответ #25 - 08. Октября 2007 :: 14:22
Печать  
sedmin писал(а) 08. Октября 2007 :: 13:58:
kiruha писал(а) 08. Октября 2007 :: 08:38:
Тем не менее, как определить переменную по имени, если она объявлена только в локальной
процедуре так и остался Печаль


Никак. Локальная переменная - она и есть локальная.

Не надо пытаться нарушать принципы видимости переменных. Это один из основополагающих принципов.


А 1С запрос тем не менее их видит - значит возможность есть...
Чтобы его подменить - нужно тоже как то увидеть   Озадачен
  
Наверх
 
IP записан
 
sedmin
1c++ developer
Отсутствует


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Переменная контекста по имени
Ответ #26 - 08. Октября 2007 :: 19:31
Печать  
Ну зачем вам пытаться встать на эту скользкую почву?

То, что Запрос видит эти переменные, еще не значит, что это хорошо. Посмотрите другие системы, нигде такого нет...

Основной недостаток такого подхода: код становится непереносимым, ты не можешь больше разделить одну большую процедуру на две мальньких. (Надеюсь, вы, друзья, меня понимаете?  Очень довольный ).
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Переменная контекста по имени
Ответ #27 - 08. Октября 2007 :: 21:24
Печать  
sedmin писал(а) 08. Октября 2007 :: 19:31:
(Надеюсь, вы, друзья, меня понимаете?  Очень довольный ).


Саня, надо писать так:
(Надеюсь, вы, мои маленькие друзья, меня понимаете?  Очень довольный ).

И радоваться, как удачно ты скрестил Фаулера со Спольски. Подмигивание

  

De quelle planète es-tu?
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Переменная контекста по имени
Ответ #28 - 08. Октября 2007 :: 21:39
Печать  
sedmin писал(а) 05. Октября 2007 :: 14:07:
Но если определить функцию, которая возвращает значение, то у нее есть другой недостаток. Иногда она выдает не то, что надо.  И как это исправить - я не знаю. Похоже, что это в кишках 1С.

Если бы это было в самой 1С, то же самое происходило бы и в методах классов.
Отловить это как-нибудь можно? (тест какой есть или метода)?
  

De quelle planète es-tu?
Наверх
 
IP записан
 
sedmin
1c++ developer
Отсутствует


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Переменная контекста по имени
Ответ #29 - 09. Октября 2007 :: 04:13
Печать  
Тест есть, залит в тесты.  Очень довольный
Назывется ВыполняемыйМодульТесты::ТестКомпилироватьИВыполнитьМодульСОшибкой2
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1 [2] 3 
ОтправитьПечать