Работа с Ole-объектом

Тема в разделе "1C и всё что с ней связано", создана пользователем ЧИА, 23 дек 2009.

  1. ЧИА

    ЧИА Active Member

    Репутация:
    0
    Регистрация:
    22 окт 2009
    Сообщения:
    33
    Симпатии:
    0
    В 1С:7.7 открывается вторая конфигурация командой Initialize
    Какой командой можно закрыть открытую таким образом конфу для последующего повторного открытия?
     
  2. Vladones

    Vladones Member

    Репутация:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    7
    Симпатии:
    0
    Просто уничтожь OLE-обект программно. То есть, присвой переменной, хранящей этот объект, пустое значение.
    (типа, мойOLEобъект = "")
     
  3. ЧИА

    ЧИА Active Member

    Репутация:
    0
    Регистрация:
    22 окт 2009
    Сообщения:
    33
    Симпатии:
    0
    Так я уже пробовал делать. Следующая попытка вновь подключиться оказывается неудачной.
    Положительного решения удалось достичь только при закрытии обработки (открытие-закрытие конфы из обработки), но это не то.
     
  4. Gman

    Gman Гость

    Репутация:
    0
    Попробуйте так:
    БазаОле.ExecuteBatch("ЗавершитьРаботуСистемы(0)");
    БазаОле = "";
     
  5. ЧИА

    ЧИА Active Member

    Репутация:
    0
    Регистрация:
    22 окт 2009
    Сообщения:
    33
    Симпатии:
    0
    Попробовал эту конструкцию - результат тот же
    Но обнаружил следующее: если я следующий раз захожу под другим именем, то ошибки подключения нет.
    И так имена можно чередовать любое число раз.
    Если же захожу под именем, для которого не назначен рабочей каталог, то проблем совсем нет.
    Получается, что после сеанса подключения надо освободить рабочий каталог
    Как же это сделать?
     
  6. KiR

    KiR НЕ шибка опытный програмер)
    1C Team

    Репутация:
    0
    Регистрация:
    11 сен 2007
    Сообщения:
    1.581
    Симпатии:
    0
    рабочий каталог пользователя освобождается по завершению работы програмы
     
  7. vitfil

    vitfil IT-интегратор

    Репутация:
    0
    Регистрация:
    2 апр 2004
    Сообщения:
    2.062
    Симпатии:
    0
    я бы лучше смотрел в сторону использования иных технологий нежели ОЛЕ. устаревшая она и тормознутая.
     
  8. ЧИА

    ЧИА Active Member

    Репутация:
    0
    Регистрация:
    22 окт 2009
    Сообщения:
    33
    Симпатии:
    0
    Буду более четким в постановке задачи:
    Запускается внешняя обработка;
    В ней есть код, с помощью которого я получаю доступ к конфигурации в папке "МояБаза"
    БазаОле=СоздатьОбъект("V77.Application");
    КаталогБазыОле = "C:\МояБаза";
    ПользовательОле = "";
    ПарольОле = "";
    МонопольныйРежимOLE = "";
    ЗапускБезЗаставки = 1;
    РезультатПодключения =
    БазаОле.Initialize ( БазаОле.RMTrade , "/d" +
    Сокрлп(КаталогБазыОле) + " /n" +
    Сокрлп(ПользовательОле)+ " /p" +
    Сокрлп(ПарольОле) + МонопольныйРежимOLE ,
    ?(ЗапускБезЗаставки = 1,"NO_SPLASH_SHOW",""));

    Если РезультатПодключения = 0 Тогда
    Предупреждение("Ошибка подключения.");
    ПользовательОле=0;
    КаталогБазыОЛе=0;
    ПарольОле = "";
    БазаОле=0;
    Возврат;
    КонецЕсли;

    В процессе подключения выбирается пользователь "Новый1", которому назначен рабочий католог .\usr5

    Вопрос: Как, не выходя из обработки, завершить работу с базой "МояБаза" и под тем же пользователем
    еще раз подключиться к конфигурации "МояБаза"
     
  9. WildAnther

    WildAnther Гость

    Репутация:
    0
    А что вы бы посоветовали?
     
  10. Gman

    Gman Гость

    Репутация:
    0
    А что возвращает БазаОле.ExecuteBatch("ЗавершитьРаботуСистемы(0)") ? Для ОЛЕ (-1 это true; 0 false), вероятнее всего процесс 1с не завершается. И еще в моей практике часто бывало что метод Initialize() возвращет 0 хотя Оле объект успешно создается и с ним можно работать.

    Добавлено:
    Могу предположить что ответ будет в сторону прямых запросов. Да Оле интерфейс работает ооооооооочень медленно, но зато позволяет использовать все теже методы 1с, не прибегая к изучению СКЛ.
     
  11. ЧИА

    ЧИА Active Member

    Репутация:
    0
    Регистрация:
    22 окт 2009
    Сообщения:
    33
    Симпатии:
    0
    Gman
    БазаОле.ExecuteBatch("ЗавершитьРаботуСистемы(0)") возвращает "-1"

    Теперь к вопросу прямых запросов. Сам СКЛ мне знаком
    Может быть на элементарном примере покажете технологию доступа из обработки, скажем к справочнику, в другой конфигурации.
     
  12. Gman

    Gman Гость

    Репутация:
    0
    Думаю по этому вопросу вам больше ответов даст модератор, тем более что он:
    И все таки хотелось бы добить Оле, процесс 1с завершается или так и торчит? Как вы узнаете что не подключись к базе, как я говорил по неизвестным причинам метод Initialize() возвращает 0, хотя база подключается.
     
  13. Hryv

    Hryv Гость

    Репутация:
    0
    Недавно сталкивался с подобным
    Приведенная выше конструкция работает правильно

    Но я читал на одном из форумов, что между
    БазаОле = "";
    и освобождением базы проходит какое-то время, несколько секунд

    ЧИА, может быть проблема связана с этим? Или вторая попытка логина происходит не сразу после первой?



    Добавлено:

    Наверное лучше тут задать вопрос
    http://codeby.net/forum/threads/32231.html
     
  14. ЧИА

    ЧИА Active Member

    Репутация:
    0
    Регистрация:
    22 окт 2009
    Сообщения:
    33
    Симпатии:
    0
    Для тестирования ситуации создал такую конструкцию:

    Если ПустоеЗначение(БазаОле) = 0 Тогда
    Рез = БазаОле.ExecuteBatch("ЗавершитьРаботуСистемы(0)"); // здесь всегда -1
    БазаОле = 0;
    КонецЕсли;
    Предупреждение("Пауза "+ Рез);
    БазаОле=СоздатьОбъект("V77.Application");
    // детально см. выше
    ..................
    РезультатПодключения =
    БазаОле.Initialize ( БазаОле.RMTrade , "/d" +
    ..................
    //
    ОлеСпрФирмы = БазаОле.CreateObject("Справочник.Фирмы");
    сзФирмы = СоздатьОбъект("СписокЗначений");
    ОлеСпрФирмы.ВыбратьЭлементы();
    Пока ОлеСпрФирмы.ПолучитьЭлемент() = 1 Цикл
    сзФирмы.ДобавитьЗначение(ОлеСпрФирмы.ТекущийЭлемент().Наименование);
    КонецЦикла;
    // выбор фирмы
    Если сзФирмы.ВыбратьЗначение(ВыбФирма,"Выберите фирму",1,,2) = 0 Тогда
    Возврат;
    КонецЕсли;
    //

    Параллельно запустил базу ОЛЕ в режиме МОНИТОР под именем Новый2, чтобы видеть список подключенных пользователей
    При первом подключении выбрал имя Администратор (все используемые имена имеют одинаковые права)
    Перед вторым подключением Пауза длится минуты. Из списка подключений Администратор не исчезает.
    При втором подключении, если выбираю предыдущее имя (Администратор), то происходит завершение по ошибке на строке "ОлеСпрФирмы = БазаОле.CreateObject("Справочник.Фирмы"); - невозможно создать объект".
    Если выбираю другое имя (Новый1), то программа работает нормально, но из списка подключений Администратор исчезает только после отработки группы "Выбор фирмы"
     
  15. Hryv

    Hryv Гость

    Репутация:
    0
    А в мониторе обновляете список после: БазаОле = 0;?

    По диспетчеру задач мониторили в какой момент процесс 1С пропадает после БазаОле = 0;?
     
  16. ЧИА

    ЧИА Active Member

    Репутация:
    0
    Регистрация:
    22 окт 2009
    Сообщения:
    33
    Симпатии:
    0
    Обнуление БазаОле никак не влияет на связь с конфигурацией.
    Процесс пропадает только после подключению к базе еще раз под другим именем и, самое главное, только после отработки группы операторов "Выбор фирмы". Это последние три оператора в моем примере.
    Кстати, группа

    Если ПустоеЗначение(БазаОле) = 0 Тогда
    Рез = БазаОле.ExecuteBatch("ЗавершитьРаботуСистемы(0)");
    БазаОле = 0;
    КонецЕсли;
    Предупреждение("Пауза "+ Рез);

    никак не влияет на результат, т.е с ней или без нее - одно и тоже
     
  17. Hryv

    Hryv Гость

    Репутация:
    0
    А другие способы обнуления пробовали?
    типа
    БазаОле = "";
    или
    БазаОле = ПолучитьПустоеЗначение();
     
  18. ЧИА

    ЧИА Active Member

    Репутация:
    0
    Регистрация:
    22 окт 2009
    Сообщения:
    33
    Симпатии:
    0
    Попробовал. Все то же.
    Но я бы в очередной раз хотел обратить внимание на то, что
     
  19. Hryv

    Hryv Гость

    Репутация:
    0
    Дайте полный код процедуры, где происходит подключение-отключение
     
  20. ЧИА

    ЧИА Active Member

    Репутация:
    0
    Регистрация:
    22 окт 2009
    Сообщения:
    33
    Симпатии:
    0
    У кнопки есть процедура Сформировать()
    Вот ее код. Я убрал строки, которые обращаются к каким-то внешним пременным
    Подключение к конфигурации Торговля+Склад 7.7
    Процедура Сформировать()

    Перем ВыбФирма;

    //тзДокум.УдалитьСтроки();
    Если ПустоеЗначение(БазаОле) = 0 Тогда
    Рез = БазаОле.ExecuteBatch("ЗавершитьРаботуСистемы(0)");
    БазаОле = ПолучитьПустоеЗначение();
    КонецЕсли;
    //Предупреждение("Пауза "+ Рез);
    БазаОле=СоздатьОбъект("V77.Application");
    КаталогБазыОле = "C:\МояБаза";
    ПользовательОле = "";
    ПарольОле = "";

    МонопольныйРежимOLE = "";

    ЗапускБезЗаставки = 1;

    РезультатПодключения =
    БазаОле.Initialize ( БазаОле.RMTrade , "/d" +
    Сокрлп(КаталогБазыОле) + " /n" +
    Сокрлп(ПользовательОле)+ " /p" +
    Сокрлп(ПарольОле) + МонопольныйРежимOLE ,
    ?(ЗапускБезЗаставки = 1,"NO_SPLASH_SHOW",""));

    Если РезультатПодключения = 0 Тогда
    Предупреждение("Ошибка подключения.");
    Иначе
    Сообщить("Подключение прошло успешно");
    КонецЕсли;

    ОлеСпрФирмы = БазаОле.CreateObject("Справочник.Фирмы");
    сзФирмы = СоздатьОбъект("СписокЗначений");
    ОлеСпрФирмы.ВыбратьЭлементы();
    Пока ОлеСпрФирмы.ПолучитьЭлемент() = 1 Цикл
    сзФирмы.ДобавитьЗначение(ОлеСпрФирмы.ТекущийЭлемент().Наименование);
    КонецЦикла;
    Если сзФирмы.ВыбратьЗначение(ВыбФирма,"Выберите фирму",1,,2) = 0 Тогда
    Возврат;
    КонецЕсли;
    // В этот момент происходит отключение предыдущего пользователя
    ОлеДокРеал = БазаОле.CreateObject("Документ.Реализация");
    ОлеДокСчФакт = БазаОле.CreateObject("Документ.СчетФактураВыданный");
    ОлеРегистр = БазаОле.CreateObject("Регистр.ПартииНаличие");
    ОлеСпрКонтр = БазаОле.CreateObject("Справочник.Контрагенты");
    ОлеСпрНомен = БазаОле.CreateObject("Справочник.Номенклатура");
    ОлеДок = ОлеДокРеал;
    ОлеДок.ВыбратьДокументы(НачДата,КонДата);
    Пока ОлеДок.ПолучитьДокумент() = 1 Цикл
    КонецЦикла;

    КонецПроцедуры
     
Загрузка...

Поделиться этой страницей