Имя: Пароль:
1C
1С v8
COM соединение в фоновом задании
0 Viktorilia
 
16.09.15
10:35
Добрый день. Задача следующая. Перенести подключение к удаленной базе в фоновое задание. Вызов процедуры  происходит из формы списка документа:
   Если глV21Object = Неопределено Тогда
                  
                   ПутьКБазе = Константы.ПутьКБазеАвтовесов.Получить();
                   СтруктураПодключения = МодульРегламентныхЗаданий.ПолучитьСтруктуруПодключения_Авто(ПутьКБазе) ;
                   глV21Object              = МодульРегламентныхЗаданий.ПодключитсяКИнформационнойБазе2(СтруктураПодключения);
                   Если глV21Object = Неопределено Тогда
                       Сообщить( "Ошибка подключения к базе данных!!!", СтатусСообщения.Важное ) ;
                       Возврат ;
                   КонецЕсли;
                   Сообщить( ""+ТекущаяДата() + " - Подключение к конфигурации "+глV21Object.Метаданные.Synonym+" выполнено успешно!" ) ;
               КонецЕсли;
          
          
          
       КонецЕсли;
1 Viktorilia
 
16.09.15
10:36
Извиняюсь вот эта процедура в модуле списка документа:
     //МассивЗаданий=Новый Массив();
     //
     //Задание=ФоновыеЗадания.Выполнить("МодульФоновыхЗаданий.COMСоединение");
     //МассивЗаданий.Добавить(Задание);
     //Попытка
     //ФоновыеЗадания.ОжидатьЗавершения(МассивЗаданий);
    
////     Исключение
     ////Сообщить("Подключение к базе ""Автовесовой"" не произошло!");
     //КонецПопытки;
     //МассивЗаданий.Очистить();
2 Viktorilia
 
16.09.15
10:37
В модуле Фоновых заданий:  Процедура COMСоединение() Экспорт
      
      
       ///-- если константа заполнена то создаем соеденение
       Если  ЗначениеЗаполнено(Константы.ПутьКБазеАвтовесов.Получить()) Тогда
          
              
               Если глV21Object = Неопределено Тогда
                  
                   ПутьКБазе = Константы.ПутьКБазеАвтовесов.Получить();
                   СтруктураПодключения = МодульРегламентныхЗаданий.ПолучитьСтруктуруПодключения_Авто(ПутьКБазе) ;
                   глV21Object              = МодульРегламентныхЗаданий.ПодключитсяКИнформационнойБазе2(СтруктураПодключения);
                   Если глV21Object = Неопределено Тогда
                       Сообщить( "Ошибка подключения к базе данных!!!", СтатусСообщения.Важное ) ;
                       Возврат ;
                   КонецЕсли;
                   Сообщить( ""+ТекущаяДата() + " - Подключение к конфигурации "+глV21Object.Метаданные.Synonym+" выполнено успешно!" ) ;
               КонецЕсли;
                     
          
       КонецЕсли;
      
      
      
   КонецПроцедуры
3 Апош
 
16.09.15
10:38
назови свою процедуру "COMСоеденение". это уже будет не зарезервированное слово
4 Viktorilia
 
16.09.15
10:38
Пременная глV21Object  определяется в моле приложения:
перем  глV21Object Экспорт;
5 Viktorilia
 
16.09.15
10:41
При запуске фонового задания переменная не видится. Свойства Модуля фонового задания:Внешнее соед, на клиенте, сервер, вызов сервера
6 Viktorilia
 
16.09.15
10:42
база серверная
7 Остап Сулейманович
 
16.09.15
10:46
Не увидел вопроса... Но если дело в том, что в модуле фонового задания не видно переменной - то ее объявить нужно в модуле внешнего соединения. Модуль приложения компилируется при интерактивном запуске. А фоновое работает из под внешнего соединения.
8 Viktorilia
 
16.09.15
10:52
(7)Ок, Спасибо.Скажите а как дальше работать с объектом ComConnector. Сервер 64-х разрядный. Т.е. нужно ли регистрировать библиотеку? Я прочитала про обертку COM+
9 Viktorilia
 
16.09.15
10:52
имею ввиду библиотеку comcntr.dll
10 olegves
 
16.09.15
10:56
(0) имхо, лучше уж сразу и данные прочитать в фоновом задании (или там обмен какой)
11 Viktorilia
 
16.09.15
10:58
да мне хотя бы к базе подключиться
12 Viktorilia
 
16.09.15
10:58
(7)Суть поняла, но почему то все равно переменная не определена.
13 Остап Сулейманович
 
16.09.15
10:59
(9) В общем случае библиотеку нужно регистрировать. Но если ОНО у вас работает вне фоновых заданий то ОНО уже зарегистрировано и никаких больше регистраций не нужно.
14 olegves
 
16.09.15
11:04
(13) не факт. Фоновое задание выполняется с правами (по умолчанию) пользователя, под которым стартован сервер 1С, вот этому пользователю и нужны права на компоненту. Если этот пользователь на том же компе, где уже зарегана компонента, то все ОК, а если на другой машинке, то на ней и нужно регать сомстрл
15 Остап Сулейманович
 
16.09.15
11:08
(14) Таки да. Но права на использование и регистрация самой компоненты все-таки разные вещи. Компонента может быть зарегистрирована, а прав на запуск нет. И тогда повторная регистрация не поможет.
16 Viktorilia
 
16.09.15
11:16
Я больше даже имею ввиду похожую ситуацию , найденную в интернете: Объект V81.Application выполняется в рамках нового процесса 1cv8.exe.
Объект V81.COMConnector является внутрипроцессным сервером. На удаленном компьютере нет процесса, в котором он может быть создан.
Чтобы объект V81.COMConnector можно было создать на удаленном компьютере, регистрации компоненты comcntr.dll в COM утилитой regsvr32.exe недостаточно. Требуется выполнить регистрацию на удаленном компьютере компоненты comcntr.dll в качестве приложения COM+.
17 Viktorilia
 
16.09.15
11:27
Еще такой момент:64 битные приложения не могут запускать 32 битные DLL которые активируются при запуске 32 битного COM объекта 1С. Для решения проблемы нужно воспользоваться оберткой COM+ которая являясь 64 битным приложением может взаимодействовать с 32 битными библиотеками.
18 Viktorilia
 
16.09.15
11:28
Для это необходимо выполнить следующие шаги:

Запускаем консоль «Службы компонентов» (например: Пуск ? Администрирование ? Службы компонентов.
В ветке Приложения COM+ добавляем новое приложение: Создать ? Приложение
На вопрос «Установка или создание нового приложения» - выбираем «Создать новое приложение».
Имя нового приложения лучше написать чтобы было понятно о чем речь: V8_ComConnector, способ активации - «серверное приложение».
Учетная запись для запуска приложения: выбираем учетку под которой стартует сервер 1С.
В ветке созданного приложения переходим на ветку «Роли» открываем роль «CreatorOwner» и далее в разделе «Пользователи» создаем пользователя - учетную запись под которой работает сервер 1С.
В ветке созданного приложения переходим на ветку «Компоненты» и создаем компонент: Создать ? Компонент
Выбираем «Установка новых компонентов», и в диалоге выбираем нужную DLL-ку (comcntr.dll)
Открываем свойства только что созданного компонента, идем на вкладку «Безопасность», проверяем в списке «Явно установленные для выделенных объектов роли» стоит ли «птичка» напротив роль CreatorOwner - если нет, тогда устанавливаем эту «птичку».