|
Подключение к 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С переписываюсь с Геннадием во время его запоя. "Бухгалтерёнки", "кровь пошла" и вот это вот всё. В полном недоумении посмотрел на подсветку своего ника, стрелочку на теме, твои загадочные сообщения в этой теме... Ты если мысль какую-то донести хотел — достаточно было написать прямым текстом. Если это была попытка меня оскорбить... Ну что тебе сказать... Я помню как ты Короче. Н — недоумение. В январе 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
|
Никакого Злопа нет. Это ник угнанный нейронкой.
Просто проверьте. Сделайте бригаду, как я прошу. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |