Имя: Пароль:
1C
 
Хранить COMОбъект на серверной стороне в режиме web-клиента - сдаюсь
0 mclarry
 
04.10.10
15:36
По сути простая задача, не могу реализовать в 8.2 в режиме упр. приложения.
Есть база1 на 8.2, из которой надо постоянно запросами вытаскивать данные в базу2 8.2. Проблема в том, что для каждого нового запроса надо создавать com-соединение, а это дело не быстрое. Хотелось бы создать соединение только один раз. Но хранить его негде! Ни в переменной модуля управляемого приложения, ни в параметрах сеанса, ни даже в локальной переменной обработки! Думаю, что ли 1С это нарочно сделала, и я чего-то не понимаю?
Уточнение: ссылка на com-соединение должна создаваться и храниться только на сервере, а не на клиентской стороне. Ибо клиенты заходят через web.
1 H A D G E H O G s
 
04.10.10
15:37
ВременноеХранилище
2 mclarry
 
04.10.10
15:40
Описание:

Сохраняет сериализуемое значение во временное хранилище.

А COMОбъект не сериализуется! Проходили...
3 H A D G E H O G s
 
04.10.10
15:41
Доверься мне.
4 mclarry
 
04.10.10
15:43
{МодульУправляемогоПриложения(19)}: Ошибка при вызове метода контекста (ПоместитьВоВременноеХранилище)
   ПоместитьВоВременноеХранилище(ОЛЕ_База, ИД);
по причине:
Ошибка помещения значение во временное хранилище
по причине:
Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства 'request':
   форма: Элемент
   имя: {http://v8.1c.ru/8.2/mngsrv/ws}request
по причине:
Ошибка отображения типов:
Отсутствует отображение для типа 'COMОбъект'
5 mclarry
 
04.10.10
15:46
Хм, а сохранить-то получилось... Момент...
6 H A D G E H O G s
 
04.10.10
15:54
МодульУправляемогоПриложения - Енто клиент.
7 H A D G E H O G s
 
04.10.10
15:55
И он захотел твоего сома на сервер отправить.
8 mclarry
 
04.10.10
15:59
да-да, уже понял
9 H A D G E H O G s
 
04.10.10
15:59
10 mclarry
 
04.10.10
16:07
Сохранить - да, а прочитать - нет:

{Форма.Форма.Форма(49)}: Ошибка при вызове метода контекста (ПолучитьИзВременногоХранилища)
   ОЛЕ_База= ПолучитьИзВременногоХранилища(ОЛЕ_ИД);
по причине:
Ошибка получения значение из временного хранилища
по причине:
Неправильный путь к файлу '9cf5b7e3-8484-4990-9b37-24832bfd0d4d'
11 H A D G E H O G s
 
04.10.10
16:09
(10) Код на запись и чтение приведи.
12 mclarry
 
04.10.10
16:13
ЗАПИСЬ

// Модуль упр приложения
Перем ИД Экспорт;

Процедура ПриНачалеРаботыСистемы()
   ИД= Новый УникальныйИдентификатор();
   ГлобальныйМодуль.ОЛЕ(ИД);
КонецПроцедуры

// ГлобальныйМодуль
Процедура ОЛЕ(ИД) Экспорт
   ОЛЕ_(ИД);
КонецПроцедуры // ОЛЕ

&НаСервере
Процедура ОЛЕ_(ИД) Экспорт
   ОЛЕ_База= Новый COMОбъект("V82.Application");
   ПоместитьВоВременноеХранилище(ОЛЕ_База, ИД);
КонецПроцедуры // ОЛЕ


ЧТЕНИЕ


&НаКлиенте
Процедура ПодключитьИБ(Команда)
   ПриСозданииОЛЕ_База(ИД);
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ПриСозданииОЛЕ_База(ОЛЕ_ИД)
   ОЛЕ_База= ПолучитьИзВременногоХранилища(ОЛЕ_ИД);
КонецПроцедуры
13 H A D G E H O G s
 
04.10.10
16:14
Не путай
14 H A D G E H O G s
 
04.10.10
16:14
УникальныйИдентификатор
и
АдресХранилища
15 H A D G E H O G s
 
04.10.10
16:15
АдресОбъекта=ПоместитьВоВременноеХранилище(ОЛЕ_База, ИД);
ОЛЕ_База=Неопределено;
ОЛЕ_База=ПолучитьИзВременногоХранилища(АдресОбъекта);
16 H A D G E H O G s
 
04.10.10
16:15
Проверь.
17 mclarry
 
04.10.10
16:15
Понял, вижу
18 mclarry
 
04.10.10
16:17
С ума сойти! Мил чел, погоди, - проверю под web и еще одну фишку...
19 H A D G E H O G s
 
04.10.10
16:19
И еще - сотри весь этот ... код и пиши вот так:
Процедура СоздатьОбработчик()
       Обработчик=Новый COMОбъект("v82.Application");
       СтрокаПодключения=СтрокаСоединенияИнформационнойБазы();
       Индекс=Найти(СтрокаПодключения,";");
       СтрокаПодключения=Лев(СтрокаПодключения,Индекс);
       Обработчик.Connect(СтрокаПодключения+"usr=""robot""; pwd=""111""");
       ПараметрыСеанса.АдресCOMОбработчика=ПоместитьВоВременноеХранилище(Обработчик,Новый УникальныйИдентификатор());
       Обработчик.НачатьВыполнениеОбработкиЗаданий();
       Обработчик.Visible=false;
КонецПроцедуры

Процедура ОстановитьОбработчик()
   Если ПараметрыСеанса.АдресCOMОбработчика<>"" Тогда
       Обработчик=ПолучитьИзВременногоХранилища(ПараметрыСеанса.АдресCOMОбработчика);
       Обработчик=Неопределено;
       Обработчик.ЗавершитьВыполнениеОбработкиЗаданий();

КонецПроцедуры
20 H A D G E H O G s
 
04.10.10
16:20
Процедура ОстановитьОбработчик()
   Если ПараметрыСеанса.АдресCOMОбработчика<>"" Тогда
       Обработчик=ПолучитьИзВременногоХранилища(ПараметрыСеанса.АдресCOMОбработчика);
       Обработчик.ЗавершитьВыполнениеОбработкиЗаданий();
КонецЕсли;
КонецПроцедуры
21 mclarry
 
04.10.10
16:23
С обработчиком - это чтоб как бы в фоновом режиме запускать, да?
22 mclarry
 
04.10.10
16:23
Под web работает, осталась одна неприятность...
23 H A D G E H O G s
 
04.10.10
16:25
(21) Да.
24 H A D G E H O G s
 
04.10.10
16:26
(22) Не томи
25 mclarry
 
04.10.10
16:32
Ошибка IE:

Интерфейс не поддерживается.

Это когда работаем через web. В (22) был web с локальной машины - работало.
26 mclarry
 
04.10.10
16:32
На коде:

ОЛЕ_База= Новый COMОбъект("V82.Application");
27 H A D G E H O G s
 
04.10.10
16:33
(26) Ты создаешь его НА КЛИЕНТЕ.
Делай на Сервере.
28 H A D G E H O G s
 
04.10.10
16:34
(25) Либо на Серваке не стоит 1С - в виде приложения, а только Сервер 1С.
29 H A D G E H O G s
 
04.10.10
16:34
(25) Либо вообще Linux.
30 mclarry
 
04.10.10
16:35
Создаю как раз на сервере:

&НаСервере
Процедура ОЛЕ_(ИД) Экспорт
   ОЛЕ_База= Новый COMОбъект("V82.Application");
   ПоместитьВоВременноеХранилище(ОЛЕ_База, ИД);
КонецПроцедуры // ОЛЕ
31 mclarry
 
04.10.10
16:35
Сервак - это моя машина, на ней поднят IIS
32 H A D G E H O G s
 
04.10.10
16:36
Да, кстати. Такая фишка на Веб клиенте, как:
ОЛЕ_База= Новый COMОбъект("");
прокатит только для IE. Огнелис COM не поддерживает. Так-то %username%
Это было лирическое отступление.

(31)
На Серваке 1С стоит??
33 mclarry
 
04.10.10
16:39
Говорю же, есть моя машина, на ней 1С 8.2, на ней же IIS
34 H A D G E H O G s
 
04.10.10
16:45
(33) Попробуй на своей машине (серваке) в Толстом клиенте, в обычной форме выполнить
ОЛЕ_База= Новый COMОбъект("V82.Application");
35 mclarry
 
04.10.10
16:47
(34) Да нет, проблема в web-браузере. Сейчас поясню.
36 mclarry
 
04.10.10
16:49
Запуск через http://10.3.1.53/Portal дает ошибку:

ОбщийМодуль.ГлобальныйМодуль.Модуль(10)}: Ошибка при вызове конструктора (COMОбъект)
   ОЛЕ_База= Новый COMОбъект("V82.Application");
по причине:
Интерфейс не поддерживается

Запуск через http://localhost/Portal отрабатывает без проблем: COMОбъект создается, сохраняется и восстанавливается.
37 H A D G E H O G s
 
04.10.10
16:51
(36)
1)Физически разные серваки
2) Разные уровни безопасности IIS для разного доступа (возможно, я IIS в глаза не видел).
38 mclarry
 
04.10.10
16:52
Возможно, у пользователя, под которым запускается процесс, нет прав на создание COM-объектов. Плохо, с этим могу и не разобраться...
39 H A D G E H O G s
 
04.10.10
16:53
(38) Не.
В обоих вариантах - работа идет с одним и тем же процессом IIS, если все верно.
40 mclarry
 
04.10.10
16:56
ХЗ
Разница - на лицо
41 H A D G E H O G s
 
04.10.10
17:04
Ковыряй, ты где-то недоглядел.
42 mclarry
 
04.10.10
17:27
Расковырял, о чудо.

А теперь Last, but not least.

Не работает код:

ОЛЕ_База= Новый COMОбъект("V77S.Application");

DEP отключил. Правда, не помню, перегружался или нет после этого.
43 H A D G E H O G s
 
04.10.10
17:49
(42) гммм.
DEP - защита от вредоносного ПО?
44 H A D G E H O G s
 
04.10.10
17:49
DEP отключил - и?
1) Заработало v82.application ?
2) Перестало работать V77S.Application ?
45 mclarry
 
04.10.10
18:01
Не, "Интерфейс не поддерживается" не могу побороть. Локально работает, при подключении с другой машины не работает. С 77 пока нет смысла разбираться.
46 H A D G E H O G s
 
04.10.10
18:04
(45) Корвыряй настройки IIS-а.

Надо как-нибудь себе поставить, с геммороем подороться.
А то все безглючный Апач, Апач, расслабляет.
47 mclarry
 
04.10.10
18:06
Нет, все-таки раскопал. Фишка в самой 77. Иногда COMОбъект создается, иногда нет. Сейчас скажу точно, при каких условиях.
48 mclarry
 
04.10.10
18:16
Странно. Если на сервере, роль которого сейчас выполняет моя машина, запущен хотя бы один процесс 7.7 под локальным пользователем, то попытка создать COMОбъект("V77S.Application") терпит неудачу. Возможно, из-за того, что из-под web-клиента работает другой пользователь Windows. Если нет локальных процессов 77, все работает, причем можно запускать сколько угодно web-соединений.
H A D G E H O G s - респект.
Ошибка? Это не ошибка, это системная функция.