Имя: Пароль:
1C
1С v8
Подключение к 7.7 из 8.3 по OLE/COM.
🠗Ø (Волшебник 06.01.2025 22:45)
,
0 Иван Петров
 
03.01.25
16:00
В 8.3 в функции НаСервере выполняю код:
БазаОЛЕ = Новый COMОбъект("V1CEnterprise.Application");
По функциональной затее, подключение может выполняться только на сервере.
Т.е. COM-объект создаётся в сеансе пользователя, под которым запущен сервер 8.3.
Используется 8.3.20. Живёт это на Windows 2003 Server.
Замешательство у меня вот в чём.
То ли мне кажется, то ли так и должно быть, но одновременно в сеансе создаётся только один COM-объект.
Попытка вызвать функцию создания COM-объекта, пока существует предыдущий экземпляр, вызывает ошибку.
Так и должно быть — один сеанс, один экземпляр COM-объекта? Или всё таки может быть одновременно несколько COM-объектов?
1 ChMikle
 
03.01.25
16:07
м.б. несколько подключений к разным базам одновременно, если вы про это
2 Иван Петров
 
03.01.25
16:22
(1) У меня до подключения к самой базе (БазаОЛЕ.Initialize(БазаОЛЕ.RMTrade) ход не доходит, выхватываю ошибку ещё на создании СОМ-объекта.

Для наглядности, в функции НаСервере выполняется, упрощённо, такой код:
БазаОЛЕ = Новый COMОбъект("V1CEnterprise.Application");
БазаОЛЕ.Initialize(БазаОЛЕ.RMTrade, "/D" + Путь + " /n" + Пользователь + " /p" + Пароль, "NO_SPLASH_SHOW");

Делаем первый вызов функции.
Всё сработало. На сервере в Диспетчере задач появился процесс 7.7 под пользователем сервера 8.3.
Он пока делает свою работу. В это время выполняем нашу функцию второй раз и она падает на первой строчке (создание СОМ объекта).

И вот понять бы. Я что-то делаю не так (очень бы хотелось чтобы так оно и было) или так и должно быть и иначе не будет (а вот это засада ибо хотелось сделать "веб-OLE-сервер" для доступа к 7.7 "снаружи").
3 Иван Петров
 
03.01.25
16:23
2+
Если первый вызов функции отработал, уничтожил СОМ-объект, повторный вызов функции будет успешным.
4 Волшебник
 
03.01.25
17:00
Объект называется V77.Application, а не то, что Вы придумали
5 Волшебник
 
03.01.25
17:04
Хотя если там v7plus, то всё может быть
6 Иван Петров
 
03.01.25
17:10
(4) Из ЖКК.  
V1СEnterprise.Application — версия независимый ключ;
V77.Application — версия зависимый ключ;
V77S.Application — версия зависимый ключ, SQL версия;
V77L.Application — версия зависимый ключ, локальная версия;
V77M.Application — версия зависимый ключ, сетевая версия.

Для спорта попробую и более традиционный ключ, мало ли.
7 Иван Петров
 
03.01.25
17:22
К (2).
Как говорят в КВН-е: "Так, стоп!"
Посыпаю свою голову оливье. Был напуган.
Таки отваливается всё на Initialize.
Это уже оптимистичнее, можно попробовать подпереть костыли v7AppServer.dll.
8 Злоп
 
03.01.25
19:16
Ну дык пользователи скорее всего разные должны быть которые клюшечные
9 Иван Петров
 
03.01.25
19:49
(9) Не. У хоккеиста (клюшечный пользователь) каталог пользователя не указан. Т.е. под ним можно открыть сколько угодно (ладно, больше одного) сеансов 7.7.
Я проверял гипотезу из (1) и подсовывал разные базы 7.7 для подключений — не помогло.

В загашнике лежал v7AppServer.dll. Попробовал использовать, но это какая-то боль.
10 Злоп
 
03.01.25
20:31
(2) для "веболе" сервера есть нормальная вк под 77 на ИС
11 Злоп
 
03.01.25
20:37
В одном сеансе делать ДВА раза

БазаОле = ....
То есть на одну и ту же переменную? Так себе затея, я бы тоже упал...

Попробуй массив для БазаОле или базаОое1 базаоле2 итд
12 Иван Петров
 
03.01.25
20:53
(10) Если мы об одном, то в комментах не очень её нахваливают.
(11) Ну не так же. :)
Есть функция, которая создаёт БазаОЛЕ и выполняет в ней запрос с использованием 1с++ (хотя не суть). Я не присваиваю в функции одной переменной два разных СОМ объекта.
Открываем два сеанса 8.3 и в каждом жмём кнопку, которая вызывает эту функцию.
Вот если в первом сеансе 8.3 запрос ещё не завершился, во втором сеансе 8.3 случается облом на Initialize.
13 Иван Петров
 
03.01.25
20:56
(10) Пока я ковыряю v7Server.dll.
Да, это работает как заявлено. И на первый взгляд даже корректно, но пока что у меня при использовании такой матрёшки зависают все вызовы функций в 7.7, которые используют 1с++.
14 Chai Nic
 
03.01.25
21:00
(0) А при чем тут сеанс? В восьмерке нет глобальных переменных сеанса на сервере. Есть параметры сеанса, но это другое.. даже если в них получится запихать КОМ-объект, не факт что он внезапно не превратится в тыкву.
15 AAA
 
03.01.25
21:17
Если Вам надо отдавать данные из 7.7 в 8.3, то лучше сделайте это через http сервис. И летать будет по скорости. И геморроя меньше
16 Иван Петров
 
03.01.25
21:24
(14) Можем назвать это другими словами.
Есть процесс (с точки зрения Виндовс) сервера 8.3, который вызывает функцию общего модуля НаСервере.
НаКлиенте №1 выполняется код, который вызывает эту функцию. Всё ок, подключение установлено, данные выгребаются из 7.7.
НаКлиенте №2 запускаем такой же отчёт и запросто ловим ситуацию, когда функция падает на этапе Initialize.

Вот чтобы вообще было просто, код функции. Общий модуль. НаСервере.

Функция ПодключитьБазу(ВнешняяБаза) Экспорт
	Попытка
		БазаОЛЕ = Новый COMОбъект("V1CEnterprise.Application");
	Исключение
		БазаОЛЕ = ""; // Ритуальное обнуление. 
		//
		Возврат ОбменНаСервере.СоздатьОтвет("Ошибка создания COM-объекта.", ОписаниеОшибки());
	КонецПопытки;
	//
	Путь = ВнешняяБаза.Путь;
	Пользователь = ВнешняяБаза.Пользователь;
	Пароль = ВнешняяБаза.Пароль;
	//						
	Если БазаОЛЕ.Initialize(БазаОЛЕ.RMTrade, "/D" + Путь + " /n" + Пользователь + " /p" + Пароль, "NO_SPLASH_SHOW") Тогда
		Возврат БазаОЛЕ;
	Иначе
		БазаОЛЕ = ""; // Ритуальное обнуление. 
		//
		Возврат ОбменНаСервере.СоздатьОтвет("Ошибка подключения к базе.", "Метод Initialize вернул Ложь.");
	КонецЕсли; 
КонецФункции
17 Иван Петров
 
03.01.25
21:21
(15) Отдавать из 7.7 в 8.3 просто, но неинтересно. :)
Интересно когда выборку данных из 7.7 инициирует 8.3 и тут же  в СКД-шном отчёте рисует красивые диаграммы. :)
18 AAA
 
03.01.25
21:26
(17)В чем тайный интерес рисовать диаграммы "тут же"? Передадите данные и рисуйте диаграммы сколько хотите. Разделите процесс передачи данных и рисование диаграмм. Данные - это данные, а отчет - это отчет по этим данным. Зачем объединять эти 2 разных процесса? Вы же все равно эти данные пишете в базу 8.3 и к чему эта гонка, чтобы сразу диаграммы рисовать. Боитесь не успеть?
19 Иван Петров
 
03.01.25
21:54
(18) Хорошо. Я не буду сразу показывать выборку в 8.3, а буду записывать. :)
Что поменялось с точки зрения проблемы в (0)? :)
Смотрите.
1. Есть ассортимент баз 7.7 (розница, опт, производство, бухгалтерия, кадры), из которых хотелось бы поиметь данные в 8.3, по критериям, которые будут заданы на стороне 8.3.
2. Есть 8.3, которая в сторону 7.7 смотрит по СОМ-соединению, а наружу http-сервисом.
3. Есть 8.3-потребитель. Которая работает в браузере, на смартфоне, на чём там ещё она умеет и "показывает" пользователю "компоновку" выборок из 7.7 в п.1.

Так вот. :)
В п.2. создаётся СОМ-объект, возвращает данные и уничтожается. Дальше начинается передача данных в п.3.
В этот момент СОМ-объект уже уничтожен.
И не имеет вообще никакого значения что я буду делать с данными в п.3 и сколько это будет происходить — "транзакция" с СОМ-объектом завершена.

Во что я сейчас упёрся и не могу подебить.
Пока что у меня получается так, что процесс сервера 8.3 может в один момент оперировать только одним СОМ-объектом.
И это о-о-очень узкое место.
Хочу найти возможность как сделать так, чтобы сервер 8.3 мог параллельно выполнять несколько (десятки) СОМ-соединений с 7.7.
Вариант что я тупой и что-то делаю не так для меня был бы идеальным. Особенно, если бы понять что я делаю не так. :)
20 Chai Nic
 
03.01.25
22:01
(19) А можно без ком обойтись. Просто запускать приложение 7.7, а в нём при запуске делать нужные дела и класть результаты в файл.
21 Иван Петров
 
03.01.25
22:05
(18) Есть вот такая чудная штука.
https://www.1cpp.ru/forum/YaBB.pl?num=1179245025;start=all
Древняя и развития не получила. Но, как минимум, познавательная.
Всё бы с ней хорошо, но не срастается у меня с её использованием работать с ODBCDataBase 1с++. Перебрал уже несколько вариантов вызовов с "обеих сторон", увы и ах.
А без 1с++ выковыривать данные из 7.7 (гигабайты и десятки гигабайт) вообще не вариант.
22 Иван Петров
 
03.01.25
22:11
(20) А параметры класть тоже "в тумбочку" (в файлик)? :)

Собственно, почему бы и не да. Только нужно решить два момента:
1. Понять что запущенный процесс завершился и можно искать файлик с ответом.
2. Передать в запущенный процесс 7.7 параметры "что выполнять".
23 Chai Nic
 
03.01.25
23:03
(22)
1. Глобальный контекст (Global context)
ЗапуститьПриложение (RunApp)
Синтаксис:
ЗапуститьПриложение(<СтрокаКоманды>, <ТекущийКаталог>, <ДождатьсяЗавершения>, <КодВозврата>)

2. Параметры можно передать через файл. И ещё, в 7.7 можно в параметрах командной строки любую фигню дополнительно написать, это ей не мешает запуститься, если обязательные параметры заданы. А в процедуре параметры командной строки достать и обработать то, что мы передали.
24 Иван Петров
 
04.01.25
00:19
(23) "Есть нюанс" с выполнением ЗапуститьПриложение() НаСервере.
Никогда это не проверял, но:

"При запуске "1С:Предприятия" в пакетном режиме, а также при вызове метода на сервере будет сгенерировано исключение."

И в то же время:
"Доступность:
Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер."
25 Злоп
 
04.01.25
01:52
Какая о хреновая концепция имхо. Запуск приложения - вещь небыстрая. А когда много сеансов 77 будет стартовать и выполняться - задержки на инициализации переменных и построение запросов...
.
Почему не сделать так чтобы 8ка складывала свои требования" к 77 в промежуточный внешний контейнер, а на сервере кратилсябы один-два-три сеанса-робота 77 (в которых уже все инициализировано, запросы параметризированы и подготовлены - только параметры подсовывай), которые забирают входящие запросы из внешнего контейнера, обрабатывают и выкладывают результат в другой внешний контейнер. Такие контейнеры можно тупо на SQLite сделать или в том же скуле...
Так не пойдет?
26 Злоп
 
04.01.25
01:53
Или может проще обращаться к данным 77 из 8 как к внешнему источнику данных напрямую, без использования 77?
27 Иван Петров
 
04.01.25
02:20
(26) Да можно и так. Как совсем уже крайняя мера.
Просто потому что придётся писать ещё более прямые запросы чем в 1с++.
Хотелось оставаться в рамках более дружелюбной среды 1с++, а в случае с БухИтогами вообще в родной среде 7.7.

Я из любопытства проверил как отрабатывает веб-сервер 8.3 в файловом варианте. (Не работаю я с файловыми базами.) Ну чтобы исключить фантазию "а вдруг файловый веб-сервер запускает на каждый веб-запрос отдельный процесс 8.3 и тогда случится чудо". :)) Конечно же чудо не произошло. :)
Всё стабильно, второй веб-запрос обламывается на подключении к 7.7 базе.
28 Иван Петров
 
04.01.25
02:33
(25) Всё верно. Инициализация OLE-объекта рабочей 7.7 базы занимает 3-5 секунд запросто.
Чуть выше писал. Ребята сто лет назад заморочились v7AppServer.dll — держали очередь уже открытых сеансов целевой 7.7 базы.

Я упоролся чутка иначе. Сделал пустую конфигурацию, в которой одна глобальная процедура (загрузка 1с++) и несколько функций (по числу баз, для инициации ODBCDataBase).
Создание объекта и его выгрузка из памяти происходят быстро — 1 секунда. Процесс занимает около 13 метров оперативки.
В эту базу подключается 8.3 по OLE и дальше прямыми запросами шерстит целевые базы 7.7.
Приятный бонус — весь код пишется на стороне 8.3.
Ещё бонус — несколько выборок из разных баз 7.7 можно склеивать в запросах на стороне 8.3.
По скорострельности меня всё устроило. Усреднённый запрос в одну базу 7.7 с выборкой оборотов за год с момента нажатия "Сформировать" и до вывода Диаграммы занимает 4-6 секунд.
Половина из этого времени уходит на перекладывание данных туда-сюда и компоновку отчёта в СКД.
Одна засада — я упёрся в "однозадачность". :)
29 Злоп
 
04.01.25
05:36
А если бля начала тупо попробовать для теста ограничиться средой ш7. Вместо 8.3 использовать 77. Что получится? А вдруг?
30 ChMikle
 
04.01.25
10:38
Попытка
v7 = Новый COMObject("V1CEnterprise.Application");
Открыта = v7.Initialize(v7.RMTrade, "/D""" + Магазин.Путь + """ /N" + Магазин.Пользователь + " /P" + Магазин.Пароль, "NO_SPLASH_SHOW");
    Исключение    
       v7 ="";
     ТекстовыйФайл.ДобавитьСтроку("----------Ошибка подключения "+СокрЛП(Магазин));    
     возврат;                           КонецПопытки;

у меня с скулевой базой 1С 7.7 работает (база лежит на другом сервере, не где 1С 8.3 сервак)
31 ChMikle
 
04.01.25
10:38
V7Plus.dll из типовой поставки
32 Иван Петров
 
04.01.25
11:29
(29) Для спорта можно посмотреть как 7.7 поведёт себя, если в ней создать больше одного ОЛЕ-объекта других 7.7 баз.
Это больше изыскания в ключе если один процесс 7.7 сможет оперировать больше чем одним ОЛЕ-объектом 7.7, то можно ломать голову что я делаю не так с серверным процессом 8.3.

Залез в нафталин и нагуглил что-то похожее на документацию к "Веб-расширению 7.7". Тоже познавательное чтиво.

Для установки соединения V7 Scripting Engine использует два метода: «прямой» метод и с использованием промежуточного файла. Прямой метод позволяет подключаться только к одному 1С:Предприятию, запущенному на компьютере с Web-сервером, при этом файл параметров (см. далее) не используется. Метод, использующий промежуточные файлы, позволяет распределять нагрузку по нескольким 1С:Предприятиям, запущенным на компьютере с Web-сервером или на других компьютерах в локальной сети. Более того, используемые 1С:Предприятия могут работать с различными информационными базами, что дает возможность на одном Web-сервере запускать несколько различных Web-приложений для выполнения различных задач.

Для  работы  V7   Scripting  Engine  необходимо,  чтобы 1С:Предприятие было запущено заранее. Если при запуске 1С:Предприятия было указано соединение через файл, то указанный файл создается автоматически.
33 Злоп
 
04.01.25
11:31
(30) несколько сеансов клюшек открывает?
34 Иван Петров
 
04.01.25
11:39
(30) Уточнение. Этот код выполняется НаКлиенте или НаСервере?

НаКлиенте будет так. Каждый сеанс клиента порождает свои СОМ-объекты. Т.е. 10 клиентов 8.3 запустят 10 СОМ-объектов 7.7.
Так четверть века и работают все обмены по ОЛЕ между "семёрками". У 7.7 сервера нет в принципе, сколько обменов запустили, столько пар "процесс — ОЛЕ-подключение" и создалось. Здесь особой проблемы никогда и не было.
А я то с сервером бодаюсь.

Дошёл уже даже до наркоманской затеи "а как-бы под каждый вызов http-сервиса открывать сессию тонкого клиента". :))
Хорошая ж затея. Жаль что нереальная. :))
35 AAA
 
04.01.25
11:53
я потерял ход мысли. Мы все видимо несколько разное имеем в виду
Что за http-сервис, раньше  не было про него разговора. Web сервер - это сервер на котором опубликована база 8.3 или что ?
36 Иван Петров
 
04.01.25
12:23
(35) Так все ж слова правильные и все они вместе. :)
Веб-сервер (технически это Апач) — это средство публикации базы 8.3.
http-сервис — это объект 8.3, в котором обрабатываются входящие http-запросы.
Обработчик http-сервиса 8.3 выполняется НаСервере.
Вот этот обработчик и создаёт СОМ-соединение с базами 7.7.

Вся моя боль в том, что у меня не получается обрабатывать параллельно много (больше одного) входящих запросов, создающих СОМ объект 7.7.
37 AAA
 
04.01.25
12:53
(36)а http запросы откуда лезут ?
38 Иван Петров
 
04.01.25
13:25
(37) Из более другой 8.3. Физически в другом дата-центре.
39 AAA
 
04.01.25
13:35
(38)посадите все 7.7 на обработки ожидания, пусть анализируют  свои триггеры. Из 8.3 выставляйте им триггеры, и пусть 7.7 своими http запросами отправляют в 8.3 требуемые данные, которые обработает http сервис для 7.7
40 ChMikle
 
04.01.25
14:42
(34) на сервере
41 Иван Петров
 
04.01.25
15:31
(40) И можно запустить несколько параллельно выполняющихся (хотя бы 20-30 секунд) СОМ-подключений и все они успешно выполняются?
42 Иван Петров
 
04.01.25
15:37
(39) Да. Такую "очередь обменов" давно уже реализовал. Как только появилась первая необходимость обменов с 7.7 в физически разных сетях.
И да, "дежурящие" сеансы 7.7 мониторят постоянно нет ли для них новых заданий.
А теперь мне захотелось новых ощущений. :)
43 Волшебник
 
04.01.25
17:57
(42) А может хватит разврата?
44 Иван Петров
 
04.01.25
21:00
(43) Рано ещё закапывать стюардессу. До 2038-го года ещё полно времени.
Опять же, восьмёрка ещё сырая.
45 ChMikle
 
05.01.25
09:14
(41) попробуйте , у меня две базы с этим кодом одновременно работают , висят в трее 2 процесса
46 Злоп
 
05.01.25
10:05
(45) а к одной и той же базе два подключения работают? Да еще под одним и тем же пользователем?
47 Иван Петров
 
05.01.25
10:17
(45) На какой операционной системе это работает?
48 ChMikle
 
05.01.25
10:45
(46) если каталог пользователя в 7.7 не прописан, то работать должно ...
(47) windows server 64 bit
49 Злоп
 
05.01.25
11:04
(48) должно. Я бы проверил.
50 Иван Петров
 
05.01.25
11:10
(48) А какой именно сервер? :) 2003? 2008?
51 skafandr
 
05.01.25
12:54
(50) Попробуйте подключение под разными пользователями
52 Иван Петров
 
05.01.25
17:02
(51) Я не то что под разными пользователями, я в разные базы 7.7 подключаюсь.
53 Волшебник
 
05.01.25
17:06
(52) А много там разных баз? Нельзя ли их просто удалить?
54 Иван Петров
 
05.01.25
20:48
(53) ПробЫвал. К утру из ВаскИр-ов восстанавливают.
55 Волшебник
 
05.01.25
20:51
(54) хе-хе
56 Волшебник
 
05.01.25
20:55
Враньё! Сплошное враньё!
57 Волшебник
 
05.01.25
21:58
У меня тут функция — хранитель знаний, генераторов и накопителей этих знаний. Справляюсь плохо, но что-то умею...
Например, умею выявлять идиотов и фейки!
58 Иван Петров
 
05.01.25
23:28
(57) Так понимаю, моя тема идеально подходит по всем критериям.
59 Иван Петров
 
06.01.25
01:01
(57) Божечки-кошечки...
У меня ощущение что за окном год так 2003-й и я на Т1С переписываюсь с Геннадием во время его запоя. "Бухгалтерёнки", "кровь пошла" и вот это вот всё.
В полном недоумении посмотрел на подсветку своего ника, стрелочку на теме, твои загадочные сообщения в этой теме...
Ты если мысль какую-то донести хотел — достаточно было написать прямым текстом.
Если это была попытка меня оскорбить... Ну что тебе сказать... Я помню как ты пешком под стол ходил бегал на Т1С переманивать на свой форум пользователей. Это вот примерно уровень "сэррегировал" в исполнении БЖ. Забавно было. Четверть века назад.
Короче. Н — недоумение.
В январе 2038-го загляну сюда ещё раз. Почитаю как в 7.7 точку актуальности на 20 января установить.
60 Волшебник
 
06.01.25
03:27
(59) Я твою ветку разбанил и дал тебе последнее слово.
Кроме этого сообщения. Пиши что хочешь
61 Волшебник
 
06.01.25
03:29
Прикиньте, какой чувак к нам залетел... Который помнил!
62 Волшебник
 
06.01.25
03:29
Я вот думаю, что все атаки ddos организовал тоже ты...
63 Волшебник
 
06.01.25
03:31
Ну а хуйли ты новые ники создаёшь? Иван Петров... Глупость...
64 2mugik
 
06.01.25
06:06
(59)Ну ради справедливости надо сказать что он брался на сколько помню отвечать на любые вопросы по 8-ке в ходе переманивания или как это назвать.
65 Злоп
 
06.01.25
10:26
Ну дык на Т1С модеры зверствовали.
Все повторяется ;-)
66 Волшебник
 
06.01.25
17:35
(64) Это был такой маркетологический приём ради переманивания.
Да, я убил "Территорию 1С". И горжусь этим.

У 1С-ников должен быть собственный форум, а не какой-то раздел кубани...
И движок у нас прекрасный, новый.
67 Злоп
 
06.01.25
20:14
(67) кстати да, переход на новый движок прошел очень гладко. Для меня что старый движок, что сейчас - как бы одно. Программерам - зачет.
68 Волшебник
 
06.01.25
22:43
(67) сами с собой\...
69 Волшебник
 
06.01.25
22:44
Никакого Злопа нет. Это ник угнанный нейронкой.
Просто проверьте. Сделайте бригаду, как я прошу.
Основная теорема систематики: Новые системы плодят новые проблемы.