Имя: Пароль:
1C
1С v8
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)! Второй параметр у конструктора ком-объекта