Запуск COM-Объекта 1С 7.7 или 1С 8.х в виде "УДАЛЕННОГО COM+" (как Решение проблемы запуска COM 32-бит внутри 64-бит приложения, так и проблем разных версий движка 8.х)

Проблемы (решенные с помощью COM+):
1) Проблема с «ComConnector» из-за разных версий движка 1С;
2) «Сервер 1с 64-бит отказался работать с COM 1c 7.7(32 бит)»;
3) Как создать удаленный COM+ внутри 1с 7.7 для решения проблемы, как в пункте 1);
И вот, наконец-то, при помощи удаленного запуска COM+ забываем обо всех этих проблемах навсегда)))

Предыстория1:
Наше головное подразделение — постоянно меняет версии движка 1С 8.х и т.к. некоторые обмены построены на «V2.ComConnector» или «V3.ComConnector», то они постоянно навязывали тем самым нам обновлять движок тоже ….. что нам жутко ненравилось))
Решение:
На сервере на котором крутися нужный «сервер 1с» прописываем «ComConnector» в виде COM+ и теперь Он становится доступным даже на машине где вообще не установлена 1С!! (ВНИМАНИЕ!! при обновлении движка на этом сервере)

Предыстория2:
Существует у нас база на 1С 7.7 и база на 1С 8.2 — Необходимо было настроить авто-обмен в Фоновом задании на Сервере 64-бит 1с 8.2… Вот тут и получилась проблема «Сервер 1с 64-бит отказался работать с COM 1c 7.7(32 бит)»
Решение:
Как оказалось прописывание 32 бит компонента в COM+ обладает еще одним полезным свойством — т.е. вызов его в 64-бит приложении, следовательно прописываем COM  «v77.Aplication» в COM+, что позволило запускать его на 64-бит сервере 1С.

Предыстория3:
RDP сервер на котором крутится 1с 7.7 использовала в обработках «V2.ComConnector» или «V3.ComConnector» …. все бы ничего, но постоянные проблемы с ком объектом из-за разных версий.
Решение:
Конечно сразу подумал о COM+
К сожалению метод СоздатьОбъект() в 1С 7.7 не имеет второго парамера и соответственно непозволяет удаленно создать COM+ ((((.
Но сразу подумал о COM объектах Windows, которые создаем в 1С, и через которые уже можно создать COM+ со вторым пораметром — т.е. удаленный COM+.
—————————————————-
К публикации приложены файлы в одном архиве:

1)Картинки описывающие создание COM+ с необходимыми опциями, а также если УДАЛЕННЫЙ КОМПЬЮТЕР под управлением Windows 2008+ описывается создание необходимой роли для доступа по сети к COM+, и еще картинка с настройкой доступа для удаленного вызова COM+
2)Обработка для 1С 8.х получающая доступ к Удаленному COM+
3)Обработка для 1С 7.7 получающая доступ к Удаленному COM+

Еще раз всетаки хочу заострить внимание)))
 COM+ в данном случае, создается именно, не на КОМП1 (где запущен код программы, и где даже вообще может несуществовать этот COM объект), а на удаленном КОПМП2!!!

Для обмена через COM

рекомендую использовать обмен по GUID (Внимание: Если объект по GUID ненайден то СОЗДАЕТСЯ Новый с нужным нам GUID — для дальнейещего использования ССЫЛОК на него —  ПРЕДВАРИТЕЛЬНО записываем данный объект в базу)) )

// ВернутьОбъектПоGUID возвращает объект по GUID или создает новый
// объект если такого несуществует
// пример ТипОбъекта="Справочник"
//  ИмяОбъекта ="Номенклатура"
//
Функция ВернутьОбъектПоGUID(GUID,ТипОбъекта,ИмяОбъекта,ЭтоГруппа=ЛОЖЬ) Экспорт
UUID = Новый УникальныйИдентификатор(GUID);

Если ТипОбъекта = "Справочник"  Тогда
НоваяСсылка = Справочники[ИмяОбъекта].ПолучитьСсылку(UUID);
Если  Найти(СокрЛП(НоваяСсылка),"<Объект не найден>")=0 Тогда
// нашли объект
НовыйОбъект = НоваяСсылка.ПолучитьОбъект();
Иначе
// не нашли объект
Если ЭтоГруппа Тогда
НовыйОбъект = Справочники[ИмяОбъекта].СоздатьГруппу();
Иначе
НовыйОбъект = Справочники[ИмяОбъекта].СоздатьЭлемент();
КонецЕсли;
НовыйОбъект.УстановитьСсылкуНового(НоваяСсылка);
КонецЕсли;
ИначеЕсли ТипОбъекта = "Документ" Тогда
НоваяСсылка = Документы[ИмяОбъекта].ПолучитьСсылку(UUID);
Если  Найти(СокрЛП(НоваяСсылка),"<Объект не найден>")=0 Тогда
НовыйОбъект =НоваяСсылка.ПолучитьОбъект();
Иначе
НовыйОбъект = Документы[ИмяОбъекта].СоздатьДокумент();
НовыйОбъект.УстановитьСсылкуНового(НоваяСсылка);
КонецЕсли;
ИначеЕсли ТипОбъекта = "ПланВидовХарактеристик" Тогда
НоваяСсылка = ПланыВидовХарактеристик[ИмяОбъекта].ПолучитьСсылку(UUID);
Если  Найти(СокрЛП(НоваяСсылка),"<Объект не найден>")=0 Тогда
НовыйОбъект=НоваяСсылка.ПолучитьОбъект();
Иначе
НовыйОбъект = ПланыВидовХарактеристик[ИмяОбъекта].СоздатьЭлемент();
НовыйОбъект.УстановитьСсылкуНового(НоваяСсылка);
КонецЕсли;
ИначеЕсли ТипОбъекта = "ПланСчетов" Тогда
НоваяСсылка = ПланыСчетов[ИмяОбъекта].ПолучитьСсылку(UUID);
Если  Найти(СокрЛП(НоваяСсылка),"<Объект не найден>")=0 Тогда
НовыйОбъект=НоваяСсылка.ПолучитьОбъект();
Иначе
НовыйОбъект = ПланыСчетов[ИмяОбъекта].СоздатьСчет();
НовыйОбъект.УстановитьСсылкуНового(НоваяСсылка);
КонецЕсли;
ИначеЕсли ТипОбъекта = "ПланВидовРасчета" Тогда
НоваяСсылка = ПланыВидовРасчета[ИмяОбъекта].ПолучитьСсылку(UUID);
Если  Найти(СокрЛП(НоваяСсылка),"<Объект не найден>")=0 Тогда
НовыйОбъект=НоваяСсылка.ПолучитьОбъект();
Иначе
НовыйОбъект = ПланыВидовРасчета[ИмяОбъекта].СоздатьВидРасчета();
НовыйОбъект.УстановитьСсылкуНового(НоваяСсылка);
КонецЕсли;
ИначеЕсли ТипОбъекта = "ПланОбмена" Тогда
НоваяСсылка = ПланыОбмена[ИмяОбъекта].ПолучитьСсылку(UUID);
Если  Найти(СокрЛП(НоваяСсылка),"<Объект не найден>")=0 Тогда
НовыйОбъект=НоваяСсылка.ПолучитьОбъект();
Иначе
НовыйОбъект = ПланыОбмена[ИмяОбъекта].СоздатьУзел();
НовыйОбъект.УстановитьСсылкуНового(НоваяСсылка);
КонецЕсли;
ИначеЕсли ТипОбъекта = "БизнесПроцесс" Тогда
НоваяСсылка = БизнесПроцессы[ИмяОбъекта].ПолучитьСсылку(UUID);
Если  Найти(СокрЛП(НоваяСсылка),"<Объект не найден>")=0 Тогда
НовыйОбъект=НоваяСсылка.ПолучитьОбъект();
Иначе
НовыйОбъект = БизнесПроцессы[ИмяОбъекта].СоздатьБизнесПроцесс();
НовыйОбъект.УстановитьСсылкуНового(НоваяСсылка);
КонецЕсли;
ИначеЕсли ТипОбъекта = "Задача" Тогда
НоваяСсылка = Задачи[ИмяОбъекта].ПолучитьСсылку(UUID);
Если  Найти(СокрЛП(НоваяСсылка),"<Объект не найден>")=0 Тогда
НовыйОбъект=НоваяСсылка.ПолучитьОбъект();
Иначе
НовыйОбъект = Задачи[ИмяОбъекта].СоздатьЗадачу();
НовыйОбъект.УстановитьСсылкуНового(НоваяСсылка);
КонецЕсли;
Иначе
Сообщение =Новый СообщениеПользователю;
Сообщение.Текст="Неизвестный тип объекта. При получении Объекта по GUID";
Сообщение.Сообщить();
Возврат Неопределено;
КонецЕсли;
Возврат НовыйОбъект;
КонецФункции


2 Comments

  1. sanfoto

    Что-то я начинаю склонятся к использованию данной технологии «удаленного COM+» на Терминалах Сбора Данных(ТСД).

    Удивительно но факт:

    1)Создал данный объект

    2)Подключился к БД и вызвал паузу)) (Предупреждение(«»))

    3)Отключил сеть

    4)Включил сеть и дождался с помощью «ping УдаленныйСервер» доступности

    5)Продолжил исполнение команды… и о ЧУДО «Удаленный COM+» НЕ ОТВАЛИЛСЯ!!!

    ——————————————

    т.е. по сути Надо на ТСД сделать в приложении отдельный поток который следит за доступностью сервера и пока недоступен держать на паузе поток работающий с 1С-кой.

    Reply
  2. sanfoto

    хм..небольшая проблемка с компьютерами вне домена, при условии что «удаленный COM+» на компьютере в домене,

    но вызвать хотите с компьютера вне домена…. бесопасность бреет((

    решается прописыванием ЛОКАЛЬНОГО пользователя с паролем на компе где COM+ и в нужную группу)).. пользователь и пароль такой же как на компе вне домена.

    С обычной Windows получилось….. добратся бы до ТСД…но не дают все в работе)).

    Пожалуй попробую с эмулятором Win CE.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *