gifts2017

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

Опубликовал Александр Милютин (sanfoto) в раздел Обмен - Перенос данных из 1С7.7 в 1C8.X

Проблемы (решенные с помощью 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";
		Сообщение.Сообщить();
		Возврат Неопределено;
	КонецЕсли;    
	Возврат НовыйОбъект;  
КонецФункции
 
 

Скачать файлы

Наименование Файл Версия Размер
Удаленный COM+.rar 42
.rar 3,36Mb
29.07.14
42
.rar 3,36Mb Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Александр Милютин (sanfoto) 04.08.14 02:36
Что-то я начинаю склонятся к использованию данной технологии "удаленного COM+" на Терминалах Сбора Данных(ТСД).

Удивительно но факт:
1)Создал данный объект
2)Подключился к БД и вызвал паузу)) (Предупреждение(""))
3)Отключил сеть
4)Включил сеть и дождался с помощью "ping УдаленныйСервер" доступности
5)Продолжил исполнение команды... и о ЧУДО "Удаленный COM+" НЕ ОТВАЛИЛСЯ!!!
-----------------------------------------
т.е. по сути Надо на ТСД сделать в приложении отдельный поток который следит за доступностью сервера и пока недоступен держать на паузе поток работающий с 1С-кой.
2. Александр Милютин (sanfoto) 04.08.14 16:04
хм..небольшая проблемка с компьютерами вне домена, при условии что "удаленный COM+" на компьютере в домене,
но вызвать хотите с компьютера вне домена.... бесопасность бреет((

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

С обычной Windows получилось..... добратся бы до ТСД...но не дают все в работе)).
Пожалуй попробую с эмулятором Win CE.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа