|
COM-коннектор, соединение и его контекст | ☑ | ||
---|---|---|---|---|
0
Tateossian
03.10.17
✎
04:34
|
Господа, нужна подсказка.
Имеется следующая архитектура - одна конфигурация на двух разных серверах в ЛВС. На одном сервере создается COM-объект V83.COMConnector со строкой подключения Srvr=otherServer.local;Ref=otherBase;... Затем следует вызов вида Соединение.СделатьЧтоТоВдругойБазе(), а в процедуре СделатьЧто-то в другой базе есть вызов стандартной функции КаталогВременныхФайлов(), который возвращает путь к каталогу на машине, с которой происходит вызов, а не на удаленном сервере. Вопрос: почему? И как заставить вернуть путь на каталог временных файлов в контексте сервера, где исполняется функция? |
|||
1
Рэйв
03.10.17
✎
06:08
|
Глобальный контекст (Global context)
КаталогВременныхФайлов (TempFilesDir) Синтаксис: КаталогВременныхФайлов() Возвращаемое значение: Тип: Строка. Имя каталога временных файлов пользователя, от имени которого запущено приложение. (С)СП Если запущено от имени пользователя на клиенте, то и будет темповый каталог на клиенте. Хочешь чтобы был темп на сервере - запускай клиента по РДП на сервере. |
|||
2
Рэйв
03.10.17
✎
06:09
|
или как вариант разшарь чтото на сервере и указывай вместо каталога временных файлов
|
|||
3
mehfk
03.10.17
✎
06:12
|
(0) Потому что вызов метода КаталогВременныхФайлов() у тебя происходит на клиенте, а не на сервере.
|
|||
4
Tateossian
03.10.17
✎
20:18
|
(1) Вот меня и сбило с толку вот это:
Глобальный контекст (Global context) КаталогВременныхФайлов (TempFilesDir) Синтаксис: КаталогВременныхФайлов() Возвращаемое значение: Тип: Строка. Имя каталога временных файлов пользователя, от имени которого запущено приложение. (С)СП Я нахожусь в контексте вызова на удаленном сервере, так как строка соединения об этом говорит, а приложение на сервере запущено от .\1c8vuser, но на самом и это (1) и это (2) верно отчасти: локальный юзер 1С не может в сетевые папки, но это настраивается, только было бы проще временные каталоги сделать сетевыми, что тоже сложно: временные каталоги являются RAM диском с уже переопределенным путем в профиле. Полагаю, что постоянно отключаться и подключаться сетевым дискам не есть хорошо. И оба этих вопроса решаются созданием доменного юзера domain\1cv8user и включение его в соответствующие локальные группы безопасности. Но на данный момент проблема не решена, так как занят был другим вопросом. Пока идея появилась следующая (этакое UIшное решение): сделать обработку под тонкого клиента и вызывать этого клиента на локальном сервере с параметрами. Идея на самом деле следующая: есть некоторые тяжелые расчетные операции, для их обработки копируется база на другой сервер, на том сервере максимально "режутся" регистры с итогами, делается выборочная индексация после этого запускаются расчетные механизмы. Итогом является обычный файл обмена, который весит (в среднем) 7-9 Гб. Затем он упаковывается в zip и его нужно передать на сервер в ЛВС после этого загрузить (тривиальная задача), но есть несколько пунктов, которые это превращают не в тривиальную задачу: 1) регистрация при копировании базы каждый раз "обнуляется", базе-копии присваивается некий хэш, по которому проверяется файл обмена, чтобы исключить загрузку ошибочного файла (номер сообщения всегда равен нулю); 2) внутри архива файл разбит на несколько меньших xml-ников, которые загружаются в несколько потоков, как атомарный процесс. Вопрос: как передать на сервер файл и запустить регламентную процедуру, сказав, где находится файл не используя ftp, веб/http-сервисы, базу данных и прочие "медленные" или ценные ресурсы? Вот я как раз изначально предполагал просто создать com-соединение и передать в процедуре адрес файла на шаре, но что-то как-то это не получается так просто, а каталог временных файлов нужен, чтобы распаковать zip. |
|||
5
Asmody
03.10.17
✎
21:24
|
(0) Твое СделатьЧтотоВДругойБазе() должно вызвать процедуру серверного модуля, в которой уже будет КаталогВременныхФайлов(). Тогда это будет правильный каталог временных файлов.
|
|||
6
Лефмихалыч
03.10.17
✎
21:29
|
(0) потому, что comConnector - это по сути на клиенте. Чтобы оно работало на другом сервере, надо Новый ComОбъект(, ИмяДругогоСервера)
|
|||
7
Tateossian
03.10.17
✎
21:33
|
(5) У меня вот так конструкция сделана (в одном модуле)
#Если ВнешнееСоединение Тогда Процедура СделатьЧтоТоВдругойБазе() Экспорт ТутДелаемЕщеВызов(); КонецПроцедуры #КонецЕсли Процедура ТутДелаемЕщеВызов() КонецПроцедуры У модуля стоят флаги внешнее соединение, вызов сервера, сервер. А что, если мне вот так сделать? #Если Сервер Процедура ТутДелаемЕщеВызов() КонецПроцедуры #КонецЕсли Или лучше в другой модуль перенести? Какие там флаги поставить? |
|||
8
Tateossian
03.10.17
✎
21:34
|
(7) В первом случае каталог временных файлов тоже возвращается локальный.
|
|||
9
Лефмихалыч
03.10.17
✎
21:35
|
(7) пустое. Создавай com-объект на том сервере, на котором надо, чтобы он работал.
К тому же "#Если Сервер" управляет не тем, где будет выполняться код, а тем, где он будет скомпилирован. При помощи этих конструкций нельзя отправить код на сервер. Код внутри этой конструкции просто будет вырезан перед компиляцией, если контекст выполнения модуля не соответствует директиве. |
|||
10
Tateossian
03.10.17
✎
21:38
|
(9) Лефмихалыч, а как создать ком-объект на сервере и дернуть его с клиента?
|
|||
11
Tateossian
03.10.17
✎
21:38
|
(10) В смысле, клиент - локальная машина, сервер - удаленная.
|
|||
12
Лефмихалыч
03.10.17
✎
21:50
|
(10) я написал же уже в (6)! Второй параметр у конструктора ком-объекта
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |