Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Доступ к глобальным переменным из КОП-ов (решено?) (число прочтений - 7230 )
kos
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 127
Местоположение: Киев
Зарегистрирован: 03. Марта 2013
Доступ к глобальным переменным из КОП-ов (решено?)
15. Марта 2013 :: 11:39
Печать  
В глобальном модуле есть некоторая "глПеременная Экспорт".

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

Если 1cpp.dll была загружена в теле глобального модуляне в ПриНачалеРаботыСистемы()), то
глобальный модуль (переменные/процедуры/функции) не будет доступен для КОП-объектов,
созданных ВНЕ глобального модуля:
- как для объектов, созданных в формах "нативных" объектов 1с77 (модуль проведения не проверял)
- так и для объектов, созданных внутри других КОП-ов (в качестве атрибутов КОП-а или локальных переменных в методах этого КОП-а)

Тестируется 4 варианта доступа к глобальной переменной:
1) прямой доступ (простое присваивание "А=Б")
2) ч\з объект "Сервис" (FormEx) (многоуважаемый автор всем известен  Улыбка)
3) ч\з объект "ВыполняемыйМодуль"(автор идеи mszsuz http://www.1cpp.ru/forum/YaBB.pl?num=1317653014/4#4)
4) ч\з "Шаблон()" (недокументированные возможности, автор 1С  Смех)

В результате тестирования (конфигурация прилагается, обновлено 2013-03-19)
прямой доступ ведет себя так (что очень-очень "не есть гуд")
(остальные 3 варианта - см.тестовую конфигурацию):

[1] объект "КопОбертка" создан в теле ГМ, до инициализации переменной "глПеременная":

1.1 из "КопОбертка"                                                | доступ к переменной есть, правильно
1.2 из атрибута "КопОбертка::КОПартибут1"                              | доступа нет, вопрос№2
1.3 из атрибута"КопОбертка::КОПартибут2"                              | доступа нет, вопрос№2
1.4 из переменной "КопЛокал" в "КопОбертка::Сообщение()"      | доступа нет, вопрос№2

[2] объект "КопОбертка" создан в теле ГМ, после инициализации переменной "глПеременная":

2.1 из "КопОбертка"                                                | доступ к переменной есть, правильно
2.2 из атрибута "КопОбертка::КОПартибут1"                              | доступа нет, вопрос№2
2.3 из атрибута"КопОбертка::КОПартибут2"                              | доступа нет, вопрос№2
2.4 из переменной "КопЛокал" в "КопОбертка::Сообщение()"      | доступа нет, вопрос№2

[3] объект "КопОбертка" создан внутри "ПриНачалеРаботыСистемы()":

3.1 из "КопОбертка"                                                | доступ к переменной есть, правильно
3.2 из атрибута "КопОбертка::КОПартибут1"                              | доступа нет, вопрос№2
3.3 из атрибута"КопОбертка::КОПартибут2"                              | доступа нет, вопрос№2
3.4 из переменной "КопЛокал" в "КопОбертка::Сообщение()"      | доступа нет, вопрос№2

[4] объект "КопОбертка" создан в теле формы "Справочник.Новый1.ТелоМодуляФормы"

4.1 из "КопОбертка"                                                | доступа нет, вопрос №1
4.2 из атрибута "КопОбертка::КОПартибут1"                              | доступа нет, вопрос№2
4.3 из атрибута"КопОбертка::КОПартибут2"                              | доступа нет, вопрос№2
4.4 из переменной "КопЛокал" в "КопОбертка::Сообщение()"      | доступа нет, вопрос№2

[5] объект "КопОбертка" создан внутри "Справочник.Новый1.ПриОткрытии()":

5.1 из "КопОбертка"                                                | доступа нет, вопрос №1
5.2 из атрибута "КопОбертка::КОПартибут1"                              | доступа нет, вопрос№2
5.3 из атрибута"КопОбертка::КОПартибут2"                              | доступа нет, вопрос№2
5.4 из переменной "КопЛокал" в "КопОбертка::Сообщение()"      | доступа нет, вопрос№2



Вопрос №1 как получить доступ к переменной "глПеременная" из КОП-ов,
созданных в "нативном" модуле формы 1С7.7 (НЕ в глобальном модуле - случаи 4.1 и 5.1) ?
Вопрос №2 как получить доступ к той же переменной из КОП-ов,
созданных внутри других КОП-ов (случаи Х.2,Х.3,х,4) ?

Замечание:
Понятно что случаи 1.1, 2.1, 3.1 - абсолютно рабочие и не рассматриваются.

В это таблице под "доступа нет" я понимаю следующее:
исключение при чтении переменной не возникает (т.е переменная "вычитывается"),
но в результате внутри КОП-а (который это значение читал),
полученное значение оказывается СЛУЧАЙНЫМ значением
- не тем, которое реально "живет" в переменной "глПеременная экспорт"

При этом не важно какие настройки включены/выключены для "УправлениеНастройками",
а также не важно есть/нет другие ВК и порядок их загрузки.
Т.е. - это поведение "видимость глобальных переменных" исключительно определяется самой 1C++

Тест на: XP/Vista/7 + 2003 (32\64) + 2003 терминал.

1CPP.DLL Версия 3.2.4.0+3.2.4.1 (предыдущие версии не рассматривал)

от том что это баг 1С++ и почему его очень хочется исправить
здесь: http://www.1cpp.ru/forum/YaBB.pl?num=1363347562/6#6
и здесь:http://www.1cpp.ru/forum/YaBB.pl?num=1363347562/9#9

временное рабочее решение (конфигурация с демонстрацией проблемы и ее решение):
http://www.1cpp.ru/forum/YaBB.pl?num=1363347562/7#7
« Последняя редакция: 19. Марта 2013 :: 10:54 - kos »  
Наверх
 
IP записан
 
mszsuz
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 33
Зарегистрирован: 18. Октября 2010
Re: Доступ к глобальным переменным из КОП-ов
Ответ #1 - 15. Марта 2013 :: 12:15
Печать  
Перемести код из тела глоб.модуля в ПриНачалеРаботыСистемы()
  
Наверх
 
IP записан
 
kos
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 127
Местоположение: Киев
Зарегистрирован: 03. Марта 2013
Re: Доступ к глобальным переменным из КОП-ов
Ответ #2 - 15. Марта 2013 :: 12:38
Печать  
mszsuz писал(а) 15. Марта 2013 :: 12:15:
Перемести код из тела глоб.модуля в ПриНачалеРаботыСистемы()


В этом случае:
1) класс "Обертка" из формы справочника
всё равно не имеет доступа к глоб.переменной.

2) класс "Вложение" - не имеет доступа к глоб.переменным
НИ ОТКУДА (даже если "обертку" поместить в ПриНачалеработы...)

см. приложенную конфигурацию в первом посте.
Если запустить 1С, то сообщения (место создания+значение переменной) всё показывают.

Как получить доступ?

Именно в этом то и вся загвоздка.
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Доступ к глобальным переменным из КОП-ов
Ответ #3 - 15. Марта 2013 :: 14:33
Печать  
Не подтверждаю. При загрузке 1С++ в первой строке ПриНачалеРаботыСистемы ошибка не наблюдается.
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
kos
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 127
Местоположение: Киев
Зарегистрирован: 03. Марта 2013
Re: Доступ к глобальным переменным из КОП-ов
Ответ #4 - 15. Марта 2013 :: 16:23
Печать  
berezdetsky писал(а) 15. Марта 2013 :: 14:33:
Не подтверждаю. При загрузке 1С++ в первой строке ПриНачалеРаботыСистемы ошибка не наблюдается.


Видимо меня не правильно поняли. Обновил первый пост. Прошу перечитать.

+ обновил тестовую конфигурацию для демонстрации.


Может кто подтвердить, что у него конфигурация выдает
тот же результат что и в табличке в первом посте?

Может кто дать ответы на вопросы №1 и №2 из первого поста?

Случай "Поместить всё в ПриНачалеРаботыСистемы()" абсолютно понятен. В моем случае  - не интересен.

Предполагаю что это баг 1С++. Не фича. И не глюк конфигурации.
Возможно есть смысл адресовать вопросы к разработчикам 1С++?

Как Вы считаете, уважаемое сообщество?
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Доступ к глобальным переменным из КОП-ов
Ответ #5 - 15. Марта 2013 :: 20:35
Печать  
Нет, это ты неправильно понял.
artbear писал(а) 15. Октября 2008 :: 14:00:
Но запомни главное - загрузка 1С++ в теле ГМ не является рекомендованным способом, слишком сильное внимание на баги в этом варианте обращать не буду !!

Это можно найти по ссылкам из http://www.1cpp.ru/bugs/show_bug.cgi?id=4216
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
kos
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 127
Местоположение: Киев
Зарегистрирован: 03. Марта 2013
Re: Доступ к глобальным переменным из КОП-ов
Ответ #6 - 16. Марта 2013 :: 11:50
Печать  
berezdetsky писал(а) 15. Марта 2013 :: 20:35:
Нет, это ты неправильно понял.
artbear писал(а) 15. Октября 2008 :: 14:00:
Но запомни главное - загрузка 1С++ в теле ГМ не является рекомендованным способом, слишком сильное внимание на баги в этом варианте обращать не буду !!

Это можно найти по ссылкам из http://www.1cpp.ru/bugs/show_bug.cgi?id=4216



Очень жаль, что этот баг рассматриваться не будет.
Тогда вопрос меняем.

У меня есть такая задача (думаю интересна многим):
1) установить начальное значение "глПеременная экспорт"
2) начинаем перехват 2х событий (в теле глоб.модуля - до начала отработки оригинальных событий):
- ПриНачалеРаботыСистемы()
- Событие_ЗаписьСобытияЖурналаРегистрации()
3) в ходе отработки оригинального события "ПриНачалеРаботыСистемы()"
обработчик для "Событие_ЗаписьСобытияЖурналаРегистрации()"
выполняет некоторые действия.
4) после того как оригинальный обработчик "ПриНачалеРаботыСистемы()" завершил работу,
выполняется анализ+обработка "глПеременная"
и перехват забытий завершается.

Эту задачу можно реализовать ТОЛЬКо если грузить 1cpp.dll
в теле глобального модуля
до начала оригинального обработчика ПриНачалеРаботыСистемы()

Вопрос:
Как это можно реализовать с учетом имеющегося бага?

Есть вариант замены глобального модуля при помощи ВК AddGlobMD.exe (http://www.1cpp.ru/forum/YaBB.pl?num=1233511656/0).
Но этот вариант не очень хорош, т.к. нужно на всех компах менять ярлыки запуска 1С для подмены EXE.
Что очень не привлекательно (кроме программиста привлекать еще и сисадмина).

Хочется всё реализовать только средствами 1С++ И FormEx.

Может есть идеи как обойти этот баг?


  
Наверх
 
IP записан
 
kos
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 127
Местоположение: Киев
Зарегистрирован: 03. Марта 2013
Re: Доступ к глобальным переменным из КОП-ов
Ответ #7 - 16. Марта 2013 :: 14:44
Печать  
Собственно, решение нашел сам. Смех

Идея в следующем:
(1) получить доступ к контесту, породившем "проблемный" КОП:
методом "ПолучитьКонтекстОкружения()",
(понимая что этот метод на самом деле возвращает не "контекст окружения", а "контекст создания")
(2) если родительский контекст является "нативным" ГМ или ГК,
то уже из этого родительского контекста
получить значение нужной переменной глобального модуля
(или переменной этой родительской формы, или ее реквизита и т.д.).
(3) если же родительский контекст - это другой КОП,
то для этого родительского КОП-а вызываем тот-же метод
по цепочке вверх (и так для каждого КОП-родителя),
пока не достигнем собственно нативного ГМ или ГК.

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

Полностью исправленная и протестированная конфигурация
с демонстрацией проблема+решение - во вложении .

Всё реализуется при помощи пары методов
"СамыйБазовыйКласс::ПолучитьЗначениеИзКонтекстаСоздания()"  (из контекста "родителя" - из ГМ или ГК)
"СамыйБазовыйКласс::УстановитьЗначениеВКонтекстСоздания()" (в контекст "родителя" - в ГМ или ГК)

Тестируется 4 варианта доступа к глобальной переменной:
1) прямой доступ (простое присваивание "А=Б")
2) ч\з объект "Сервис" (FormEx) (многоуважаемый автор всем известен  Улыбка)
3) ч\з объект "ВыполняемыйМодуль"(автор идеи mszsuz http://www.1cpp.ru/forum/YaBB.pl?num=1317653014/4#4)
4) ч\з "Шаблон()" (недокументированные возможности, автор 1С  Смех)

К сожалению, ВСЁ работает ТОЛЬКО ч\з "Шаблон()"
Остальные способы имеют указанный баг: http://www.1cpp.ru/bugs/show_bug.cgi?id=4216

Прошу критиковать  Круглые глаза

Может есть смысл уважаемому artbear посмотреть эту идею
доступа к родительскому контексту по цепочке вверх, пока не достигнем ГМ или ГК
и реализовать "внутри" 1С++, дабы метод стал "родным" ?
« Последняя редакция: 19. Марта 2013 :: 10:02 - kos »  

1cpp_GlobalVarsInClasses4.7z ( 16 KB | Загрузки )
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Доступ к глобальным переменным из КОП-ов
Ответ #8 - 18. Марта 2013 :: 15:18
Печать  
kos писал(а) 16. Марта 2013 :: 11:50:
У меня есть такая задача (думаю интересна многим):
1) установить начальное значение "глПеременная экспорт"
2) начинаем перехват 2х событий (в теле глоб.модуля - до начала отработки оригинальных событий):
- ПриНачалеРаботыСистемы()
- Событие_ЗаписьСобытияЖурналаРегистрации()
3) в ходе отработки оригинального события "ПриНачалеРаботыСистемы()"
обработчик для "Событие_ЗаписьСобытияЖурналаРегистрации()"
выполняет некоторые действия.
4) после того как оригинальный обработчик "ПриНачалеРаботыСистемы()" завершил работу,
выполняется анализ+обработка "глПеременная"
и перехват забытий завершается.

Ты поясни, для чего нужна эта задача.
Пока цели не вижу Печаль
  

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


1C++ rocks!

Сообщений: 127
Местоположение: Киев
Зарегистрирован: 03. Марта 2013
Re: Доступ к глобальным переменным из КОП-ов (решено?)
Ответ #9 - 18. Марта 2013 :: 17:22
Печать  
есть 2 БД (упрощаю, на самом деле чуть больше)
- упр (со своими извращениями)
- бух (типовая 8.2, даже точнее УПП, но не важно)

Есть обработка которая:
- забирает данные из упр.77
- как-то их анализирует 77<->82
- экпортирует в 82
- в 77 проставляет "флажки" результата экспорта (+ссылка GUID 8)

Теперь зачем перехват и глобальный модуль:
- когда выполняется любая запись в БД 77
перехватывается событие "ЗаписьЖурналаРегистрации"
(любое программное / интерактивного / групповое проведение)
Для этого есть свои КОП-ы, опять же не важно.

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

Перехват события ПриНачалеРаботы тоже нужен (от начала до конца),
т.к. там свои заморочки с программной записью данных

+ менять саму ПриНачалеРаботы - нельзя
за то отвечают другие люди, мне не доступные,
т.е. я не могу изменить (загрузить 1с++ в самом начале) ПриНачалеРаботы()...

Поэтому грузить 1с++ нужно ДО ПриНачалеРаботы...
чтобы отработал ПЕРЕХВАТ ЭТОГО события.
и делаю я это в самом конце тела глобального модуля

У меня для всего этого хозяйства задуман некий "синглтон":
Код
Выбрать все
//в конец глобальника 2 строчки:
ЗагрузитьВнешнююКомпоненту("1cpp.dll");
СоздатьОбъект("ДиспетчерСобытий");//без присваивания чему-либо

//внутри "ДиспетчерСобытий" переопределяю глобальную переменную
// "глПользователь" на свой КОП ("МенеджерСеанса", наследник от Спр.Пользователи) 



А тут вот баг такой...
http://www.1cpp.ru/bugs/show_bug.cgi?id=4216

Пришлось извратиться с ловлей "КонтекстСоздания"
чтобы выйти на ГМ (ну и вдогонку на ГК)...
пример внутри тестовой конфигурации здесь:
http://www.1cpp.ru/forum/YaBB.pl?num=1363347562/7#7

Просто я не представляю как реализовать
- ловлю записи в БД
- контроль флажков всяких
- дополнительные права доступа
без синглтона в глобальнике и перехвата событий.

Вот.
Надеюсь, цель понятна.
« Последняя редакция: 19. Марта 2013 :: 10:46 - kos »  
Наверх
 
IP записан
 
kos
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 127
Местоположение: Киев
Зарегистрирован: 03. Марта 2013
Re: Доступ к глобальным переменным из КОП-ов (решено?)
Ответ #10 - 19. Марта 2013 :: 09:16
Печать  
конфигурация в посте
http://www.1cpp.ru/forum/YaBB.pl?num=1363347562/7#7
обновлена.

Теперь уже рассматриваются 4 варианта доступа.
К сожелению остаётся рабочим только один, как и прежде - ч\з "Шаблон"
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать