Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Простейший способ узнать подгружена ли Внешняя компонента (число прочтений - 4518 )
rawlik
Junior Member
**
Отсутствует



Сообщений: 53
Зарегистрирован: 11. Сентября 2007
Пол: Мужской
Простейший способ узнать подгружена ли Внешняя компонента
18. Марта 2009 :: 15:03
Печать  
Возможно ли не прибегая к Попытке  с Исключением узнать подгружен FormEx (или другая внешняя компонента) или нет ?
  
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Простейший способ узнать подгружена ли Внешняя компонента
Ответ #1 - 18. Марта 2009 :: 15:22
Печать  
rawlik писал(а) 18. Марта 2009 :: 15:03:
Возможно ли не прибегая к Попытке  с Исключением узнать подгружен FormEx (или другая внешняя компонента) или нет ?


ПолучитьТаблицуЗагруженныхВК
  
Наверх
 
IP записан
 
rawlik
Junior Member
**
Отсутствует



Сообщений: 53
Зарегистрирован: 11. Сентября 2007
Пол: Мужской
Re: Простейший способ узнать подгружена ли Внешняя компонента
Ответ #2 - 18. Марта 2009 :: 15:49
Печать  
А без 1С++ ?
Только через Попытка...Исключение  Печаль (Ну нэ любэ я их, нэ любэ Улыбка)
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Простейший способ узнать подгружена ли Внешняя компонента
Ответ #3 - 19. Марта 2009 :: 09:34
Печать  
Я в 1С++ для этого и добавлял метод ПолучитьТаблицуЗагруженныхВК Улыбка
  

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


1C++ v. 3.0.1.23

Сообщений: 148
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Простейший способ узнать подгружена ли Внешняя компонента
Ответ #4 - 30. Апреля 2009 :: 13:35
Печать  
если есть желание извратится, то можно сделать специальный документ (например) у которого в предопределеной FormEx процедуре устанавливается глобальный флаг (например в "ПослеОткрытия").  Открывать этот объект через "ОткрытьФорму" и наблюдать как при этом меняется глобальный флаг.
  

Поспешность наносит ущерб
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Anthon
Junior Member
**
Отсутствует


Тупой 1сник

Сообщений: 31
Местоположение: Chitago
Зарегистрирован: 17. Июня 2009
Пол: Мужской
Re: Простейший способ узнать подгружена ли Внешняя компонента
Ответ #5 - 17. Июня 2009 :: 03:50
Печать  
Не совсем простейший... Но зато надежный :) Просто проверяйте переменную глСервис на неравность 0. Иначе используйте ее по назначению (а зачем тогда эта компонента нужна?). А в глобальном модуле

[font=Courier New]
Перем глСервис Экспорт;

Функция ПодключитьКомпоненту()
     Если ТипЗначения(глСервис) = 0 Тогда
           СписокПутей = СоздатьОбъект("СписокЗначений");
           СписокПутей.ДобавитьЗначение(КаталогПрограммы() + "FormEx.dll");
           СписокПутей.ДобавитьЗначение(КаталогИБ() + "FormEx.dll");
           СписокПутей.ДобавитьЗначение(КаталогИБ() + "ExtForms\FormEx.dll");
           Для Сч = 1 По СписокПутей.РазмерСписка() Цикл
                 ИмяФайла = СписокПутей.ПолучитьЗначение(Сч);
                 Если ФС.СуществуетФайл(ИмяФайла) = 1 Тогда
                       Попытка
                             Если ЗагрузитьВнешнююКомпоненту(ИмяФайла) = 1 Тогда
                                   глСервис = СоздатьОбъект("Сервис");
                             ИначеЕсли ПодключитьВнешнююКомпоненту(ИмяФайла) = 1 Тогда
                                   глСервис = СоздатьОбъект("Сервис");
                             ИначеЕсли глСервис <> 0 Тогда
                                   Сообщить("Внимание! Невозможно загрузить компоненту " + ИмяФайла + "!" +
                                     РазделительСтрок + "Срочно обратитесь к разработчику Вашей конфигурации!", "!!");
                                   глСервис = 0;
                             КонецЕсли;
                       Исключение
                             глСервис = 0;
                             Сообщить("Внимание! Невозможно загрузить компоненту " + ИмяФайла + "!" +
                                   РазделительСтрок + "Срочно обратитесь к разработчику Вашей конфигурации!", "!!");
                       КонецПопытки;
                       Прервать;
                 КонецЕсли;
           КонецЦикла;
           Если ТипЗначения(глСервис) = 0 Тогда
                 глСервис = 0;
                 Если Вопрос("Внимание! Не подключена компонента FormEx! Некоторые действия недоступны!" +
                       РазделительСтрок + "Срочно обратитесь к разработчику Вашей конфигурации! Продолжить?", "Да+Нет") = "Нет" Тогда
                       глСервис = -1;
                 КонцеЕсли;
           КонецЕсли;
     КонецЕсли;
     Возврат глСервис;
КонецФункции;




Процедура ПриНачалеРаботыСистемы()
     Если ПодключитьСистему() = -1 Тогда
           ЗавершитьРаботуСистемы(0);
           Возврат;
     КонецЕсли;
..........
[/font]

П.С. Спасибо Алексу за компоненту. У меня много полезного кода, связанного с ней, обращайтесь.. :)
« Последняя редакция: 17. Июня 2009 :: 07:36 - Anthon »  

Все в мире относительно
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Простейший способ узнать подгружена ли Внешняя компонента
Ответ #6 - 17. Июня 2009 :: 08:39
Печать  
[quote author=Anthon link=1237388586/0#5 date=1245210633]Не совсем простейший... Но зато надежный :) Просто проверяйте переменную глСервис на неравность 0. Иначе используйте ее по назначению (а зачем тогда эта компонента нужна?).[/quote]
1. Неоднозначный код, поэтому не очень удобный :(
2. Чем проверять значение переменной, проще сразу в ГМ завести спец.метод глВК_ФормЕкс_Загружена(), которая и будет возвращать нужное значение, а глСервис юзать для других вещей.
  

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


Тупой 1сник

Сообщений: 31
Местоположение: Chitago
Зарегистрирован: 17. Июня 2009
Пол: Мужской
Re: Простейший способ узнать подгружена ли Внешняя компонента
Ответ #7 - 17. Июня 2009 :: 09:34
Печать  
1. Хм... У меня, конечно, много неоднозначностей... Но интересно, где же это здесь? Здесь логика проста, как тапок.
Просто в терминале винды есть особенность, компонента ИНОГДА НЕ ЗАГРУЖАЕТСЯ С ПЕРВОГО РАЗА, более того, для этого приходится использовать аж две функции (см. код). В баг не вникал, просто забыл об этой функции, когда все заработало.
2. Ну, если содержимое функции глФормЭксЗагружена() будет равно ли глСервис нулю, пускай, сам принцип состоит в том, загрузилась ли компонента при запуске, и если не загрузилась, можно повторить вызов ПодключитьКомпоненту (например, по параметру в ней же). Просто не вижу смысла нагружать ГМ лишними функциями, он этого не любит, несмотря на модульность 1С. Спасибо за внимание.
3. Извините, что использовал конструкцию Попытка Исключение, но это ведь только при запуске....
  

Все в мире относительно
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Простейший способ узнать подгружена ли Внешняя компонента
Ответ #8 - 18. Июня 2009 :: 08:19
Печать  
Anthon писал(а) 17. Июня 2009 :: 09:34:
Просто не вижу смысла нагружать ГМ лишними функциями, он этого не любит, несмотря на модульность 1С.

При использовании 1С++ в Предприятии и Телепата в Конфигураторе ГМ любое количество функций нипочем Улыбка
А ясность кода намного выше.

Главный принцип разработки - уменьшение сложности.

Лишняя четкая функция тебе только поможет Улыбка
  

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


Тупой 1сник

Сообщений: 31
Местоположение: Chitago
Зарегистрирован: 17. Июня 2009
Пол: Мужской
Re: Простейший способ узнать подгружена ли Внешняя компонента
Ответ #9 - 18. Июня 2009 :: 08:46
Печать  
Ну ладно, все, больше не буду надоедать. Много функций действительно вредит, проверено годами, просто инстинктивно стараюсь этого избегать. Тогда уж по методологии 1С (один метод на чтение и на запись):


Перем глСервис Экспорт;

Функция глВКФормЭксЗагружена(ЗагрузитьНаВсякийСлучай = 0)
     Если (ЗагрузитьНаВсякийСлучай = 1) и (ТипЗначения(глСервис) = 0) Тогда
           СписокПутей = СоздатьОбъект("СписокЗначений");
           СписокПутей.ДобавитьЗначение(КаталогПрограммы() + "FormEx.dll");
           СписокПутей.ДобавитьЗначение(КаталогИБ() + "FormEx.dll");
           СписокПутей.ДобавитьЗначение(КаталогИБ() + "ExtForms\FormEx.dll");
           Для Сч = 1 По СписокПутей.РазмерСписка() Цикл
                 ИмяФайла = СписокПутей.ПолучитьЗначение(Сч);
                 Если ФС.СуществуетФайл(ИмяФайла) = 1 Тогда
                       Попытка
                             Если ЗагрузитьВнешнююКомпоненту(ИмяФайла) = 1 Тогда
                                   глСервис = СоздатьОбъект("Сервис");
                             ИначеЕсли ПодключитьВнешнююКомпоненту(ИмяФайла) = 1 Тогда
                                   глСервис = СоздатьОбъект("Сервис");
                             ИначеЕсли глСервис <> 0 Тогда
                                   Сообщить("Внимание! Невозможно загрузить компоненту " + ИмяФайла + "!" +
                                         РазделительСтрок + "Срочно обратитесь к разработчику Вашей конфигурации!", "!!");
                                   глСервис = 0;
                             КонецЕсли;
                       Исключение
                             глСервис = 0;
                             Сообщить("Внимание! Невозможно загрузить компоненту " + ИмяФайла + "!" +
                                   РазделительСтрок + "Срочно обратитесь к разработчику Вашей конфигурации!", "!!");
                       КонецПопытки;
                       Прервать;
                 КонецЕсли;
           КонецЦикла;
     КонецЕсли;
     Возврат ?(ТипЗначения(глСервис) = 0, 0, 1);
КонецФункции;


Процедура ПриНачалеРаботыСистемы()
     Если глВКФормЭксЗагружена(1) = 0 Тогда
           Если Вопрос("Внимание! Не подключена компонента FormEx! Некоторые действия недоступны!" +
                 РазделительСтрок + "Срочно обратитесь к разработчику Вашей конфигурации! Продолжить?", "Да+Нет") = "Нет" Тогда
                 ЗавершитьРаботуСистемы(0);
                 Возврат;
           КонецЕсли;
     КонецЕсли;
..........



Так лучше?..

P. S. Не использовал пока 1С++ в работе, нет возможности, да и на 8-ку уже перехожу, там все по-другому.. Можете закрывать ветку.  Язык
  

Все в мире относительно
Наверх
 
IP записан
 
classic
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 330
Местоположение: г. Харьков
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Простейший способ узнать подгружена ли Внешняя компонента
Ответ #10 - 20. Июня 2009 :: 13:39
Печать  
Код сложный и с первого взгляда - непонятно что он делает и зачем. Куча сравнений и всякой фигни. И все ради отказа от трех строчек - попытка/исключение? Люблю/не люблю... Это для поэтов. А программист должен писать программы.
Ну и это, спросите у гугли про Оккама...
  
Наверх
 
IP записан
 
Anthon
Junior Member
**
Отсутствует


Тупой 1сник

Сообщений: 31
Местоположение: Chitago
Зарегистрирован: 17. Июня 2009
Пол: Мужской
Re: Простейший способ узнать подгружена ли Внешняя компонента
Ответ #11 - 23. Июня 2009 :: 01:47
Печать  
Печально, конечно, уважаемый, что такой код для вас является сложным... В действительности, я работаю не с одним клиентом и приходится учитывать все недоделки, которые оставили в наследство программисты 1С из Москвы. А еще с удовольствием упростил бы сотни конструкций, ими написанных, видать, в спешном порыве, которые больше напоминают не бритву Оккама, а скорее, сапог Шварца... Специально для вас тогда, я думаю, сойдет вот такая конструкция.


Перем глПеремВКФормЭксЗагружена Экспорт;

Функция глВКФормЭксЗагружена()
     Возврат глПеремВКФормЭксЗагружена;
КонецФункции;

Процедура ПриНачалеРаботыСистемы()
     глПеремВКФормЭксЗагружена = ЗагрузитьВнешнююКомпоненту(КаталогПрограммы() + "FormEx.dll");
..........


Хотите больше возможностей - усложняйте код. Это же 1С!

П.С. Знаете, настоящий программист должен быть поэтом, ведь это самая что ни на есть творческая профессия...
  

Все в мире относительно
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Простейший способ узнать подгружена ли Внешняя компонента
Ответ #12 - 23. Июня 2009 :: 10:30
Печать  
Не знаю, по мне classic прав.
Если б вы посмотрели и поучились у патриархов этого проекта по написанию кода, то возможно подумали бы на счет целесообразности перехода на 8-ку.
А если хотите стать поэтом, то без 1С++  туда пути нет!!!
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать