• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

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

  • Автор темы ЧИА
  • Дата начала
Ч

ЧИА

В 1С:7.7 открывается вторая конфигурация командой Initialize
Какой командой можно закрыть открытую таким образом конфу для последующего повторного открытия?
 
V

Vladones

Просто уничтожь OLE-обект программно. То есть, присвой переменной, хранящей этот объект, пустое значение.
(типа, мойOLEобъект = "")
 
Ч

ЧИА

Так я уже пробовал делать. Следующая попытка вновь подключиться оказывается неудачной.
Положительного решения удалось достичь только при закрытии обработки (открытие-закрытие конфы из обработки), но это не то.
 
G

Gman

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

ЧИА

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

KiR

рабочий каталог пользователя освобождается по завершению работы програмы
 
V

vitfil

я бы лучше смотрел в сторону использования иных технологий нежели ОЛЕ. устаревшая она и тормознутая.
 
Ч

ЧИА

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

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

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

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

Gman

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

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

ЧИА

Gman
БазаОле.ExecuteBatch("ЗавершитьРаботуСистемы(0)") возвращает "-1"

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

Gman

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

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

Hryv

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

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

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

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



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


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

ЧИА

Для тестирования ситуации создал такую конструкцию:

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

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

Hryv

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

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

ЧИА

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

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

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

Hryv

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

ЧИА

Попробовал. Все то же.
Но я бы в очередной раз хотел обратить внимание на то, что
Процесс пропадает только после подключению к базе еще раз под другим именем и, самое главное, только после отработки группы операторов "Выбор фирмы"
 
H

Hryv

Дайте полный код процедуры, где происходит подключение-отключение
 
Ч

ЧИА

У кнопки есть процедура Сформировать()
Вот ее код. Я убрал строки, которые обращаются к каким-то внешним пременным
Подключение к конфигурации Торговля+Склад 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 Цикл
КонецЦикла;

КонецПроцедуры
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!