1с тип comобъект не может использоваться в данных формы
Описан способ внеконтекстного вызова методов объекта обработки (отчета) в управляемой форме для выполнения некоторых действий или возврата результатов каких-то вычислений, зависящих только от значений переданных методу параметров. Обсуждена применимость предлагаемого способа. Предлагаются способы обхода ограничений для случая запуска обработки в фоновом задании.
Сразу хочется отметить, что речь пойдет о повторном использовании методов, которые фактически являются «статическими» в терминологии ООП, то есть не связанных с конкретным экземпляром объекта. Такие методы, не изменяя состояния (данных) самого объекта, выполняют некоторые действия или (и) возвращают результаты каких-то вычислений.
Как известно, платформа 1С-8.2/8.3 предоставляет возможность повторного использования кода путем размещения его в экспортных процедурах и функциях в следующих местах конфигурации:
- Модули объектов "Форма" и "УправляемаяФорма" ;
- Общие модули конфигурации;
- Модули менеджеров объектов;
- Модули объектов;
Рассмотрим подробней каждый из вариантов с точки зрения использования в управляемых формах в обработках или отчетах.
Модули объектов форм (по замечанию awk):
Этот вариант переиспользования не очень удобен по ряду причин:
- Объекты "Форма" или "УправляемаяФорма" отдельно создать можно только на стороне клиентов (метод ПолучитьФорму () не доступен на сервере). Поэтому на стороне сервера применение этого варианта переиспользования кода ограничено серверным контекстом управляемых форм.
- В силу узкой специализации объектов "Форма" или "УправляемаяФорма" , призванных решать интерфейсные задачи.
На практике этот вариант переиспользования кода в основном используется для нестандартного начального заполнения данных формы до ее открытия или как один из возможных вариантов организации взаимодействия между между формами (в подчиненной форме через атрибут "ВладелецФормы" можно вызвать экспортный метод формы-владельца).
Общие модули конфигурации:
Этот вариант является самым простым с точки зрения использования на стороне клиента в управляемых формах, поскольку общие модули и их методы можно сделать непосредственно доступными для использования на клиенте:
Недостаток размещения кода в общих модулях заключается в уменьшении универсальности обработки (отчета).
Ее функционал «размазывается» по конфигурации. При переносе функционала в другое прикладное решение приходится помнить, что кроме самой обработки также требуется подтянуть «то, пятое, десятое».
А для универсальных обработок, используемых в качестве внешних, такая зависимость от общих модулей может оказаться вообще неприемлемой.
Модули менеджеров объектов:
Модуль менеджера объекта является естественным местом размещения кода общего назначения, не связанного с конкретным экземпляром объекта.
К сожалению, в нынешней реализации управляемого приложения модуль менеджера объекта не доступен на стороне клиента.
Поэтому вызов методов этого модуля приходится выполнять через вспомогательные серверные внеконтекстные методы формы:
В принципе такой вариант размещения кода является приемлемым для обработки с точки зрения производительности и переносимости. Но здесь возникает затруднение, если предполагается использовать обработку (отчет) в качестве внешней обработки (внешнего отчета).
Дело в том, что у внешних обработок и отчетов нет менеджера объекта как такового.
А при сохранении встроенной обработки во внешнюю обработку модуль ее менеджера попросту теряется (кстати, без предупреждения).
В этом случае остается единственное место для размещения повторно используемого кода – модуль объекта обработки (отчета).
Модули объектов:
Модуль объекта также не доступен на стороне клиента в управляемой форме.
Вызов методов объекта в общем случае возможен через вспомогательные серверные, но уже контекстные методы формы:
Серверные контекстные вызовы являются «затратными». Их использование оправдано, если в массовом порядке изменяются данные формы или когда для выполнения каких-то действий требуются данные всей формы или связанного с ней объекта.
Поэтому рекомендуется по возможности избегать использования серверных контекстных вызовов.
Что же делать, если метод объекта фактически является «статическим» и не использует данные самого объекта?
Например, пусть метод возвращает список значений меню, динамически зависящего только от значений переданных методу параметров. Ясно, что использование контекстного серверного вызова в этой ситуации явно неоправданно.
В специально предназначенном строковом реквизите обработки при инициализации модуля объекта сохраняется внутреннее строковое представление типа объекта обработки/отчета:
// установим внутреннее строковое представление типа значения объекта обработки
ЭтотОбъект . ОбработкаТип = ЗначениеВСтрокуВнутр ( ТипЗнч ( ЭтотОбъект ));
Этот способ хорош тем, что "сразу" инициалициализирует нужный реквизит объекта обработки/отчета во всех формах, где объект обработки/отчета используется.
В принципе реквизит обработки можно заменить реквизитом самой формы.
Тогда описанное выше действие нужно будет выполнять в обработчике «ПриСозданииНаСервере» :
&НаСервере
Процедура ПриСозданииНаСервере ( Отказ , СтандартнаяОбработка )
Обработка = РеквизитФормыВЗначение ( "Объект" );
// установим внутреннее строковое представление типа значения объекта обработки
ЭтаФорма . ОбработкаТип = ЗначениеВСтрокуВнутр ( ТипЗнч ( Обработка ));
ЗначениеВРеквизитФормы ( Обработка , "Объект" );
КонецПроцедуры
Значение этого реквизита в дальнейшем используется во вспомогательных внеконтекстных серверных методах формы для создания объекта обработки. Ну, а сам вызов методов объекта обработки на стороне клиента выглядит следующим образом:
Таким образом, решается поставленная задача:
вызовы методов объекта осуществляется при внеконтекстных серверных вызовах со стороны клиента в управляемой форме.
Кроме этого описанный выше подход более универсален, чем использование модуля менеджера объекта.
Так как при таком создании объекта в явном виде не используется информация о том, что за объект создается (объект обработки, отчета или чего другого), а также информация об имени метаданных объекта.
Применение:
Описанный в данной публикации подход может оказаться полезным, если у разрабатывемого объекта планируется создание как управляемого, так и обычного интерфейса.
Ограничения применения:
В случае внешних отчетов и обработок предлагаемый подход можно использовать только в том соединении с информационной базой, в котором был открыт файл обработки/отчета (был откомпилирован модуль объекта из файла).
При использовании в другом соединении (например, в фоновом задании или во внешнем соединении) у нас не получится создать объект внешней обработки/отчета по переданному внутреннему строковому представлению типа объекта обработки/отчета (смотрите первый пример ниже по тексту).
Поскольку в этом случае функция ЗначениеИзСтрокиВнут () вернет значение Тип ( “Неопределено” ) вместо типа нужного нам объекта.
Например, может возникнуть вполне естественное желание запустить на выполнение обработку в фоновом задании.
Для этого потребуется экспортный метод некоего общего модуля, позволяющего выполнять произвольный код на стороне сервера.
Пусть это будет общий модуль «УТР_Сервер» и метод «ВыполнитьНаСервере» (реальный пример из конфигурации «Управление аптечной сетью» ):
Процедура ВыполнитьНаСервере ( Строка , ПереданноеЗначение =Неопределено) Экспорт
Выполнить( Строка );
КонецПроцедуры
Запустить обработку на выполнение в фоновом задании с передачей типа объекта обработки для его создания можно попытаться так:
стПараметры = Новый Структура ( "А" , стАргументы );
стПараметры . Вставить ( "ОбработкаТип" , ОбработкаТип );
КодВыполнения =
"П = ПереданноеЗначение;
|// по переданному типу объекта обработки - НЕ РАБОТАЕТ .
|Обработка = Новый(ЗначениеИзСтрокиВнутр(П.ОбработкаТип));
|Обработка.МетодПроцедура2(П.А.Арг1,П.А.Арг2,П.А.Арг3);
|" ;
ИмяМетодаФЗ = "УТР_Сервер.ВыполнитьНаСервере" ;
ПараметрыФЗ = Новый Массив ;
ПараметрыФЗ . Добавить ( КодВыполнения ); // исполняемый код, запускающий обработку на сервере
ПараметрыФЗ . Добавить ( стПараметры ); // параметры исполняемого кода
ЕррорИнфо = "" ;
Попытка
Задание = ФоновыеЗадания . Выполнить (
ИмяМетодаФЗ , ПараметрыФЗ , ОбработкаИмя + "_" + ФоновоеЗаданиеКлюч , "Выполнение обработки """ + ОбработкаИмя + """" );
Если ТаймаутФЗ > 0 Тогда
Задание . ОжидатьЗавершения ( ТаймаутФЗ );
КонецЕсли;
ЗаданиеGUID = Задание . УникальныйИдентификатор ;;
Исключение
ЗаданиеGUID = Неопределено;
ЕррорИнфо = ОписаниеОшибки ();
КонецПопытки;
Возврат ЗаданиеGUID ;
КонецФункции
Обход ограничений:
Что же делать, если очень хочется выполнить метод объекта внешней обработки/отчета именно в фоновом задании?
Тогда придется как-то передать фоновому заданию двоичные данные обработки (отчета) для создания ее (его) объекта.
Для этого есть три основных способа:
1) Передать через аргумент метода фонового задания навигационную ссылку на данные обработки/отчета в информационной базе
(для этого обработка должна быть сохранена в информационное базе,
например, в справочнике «ДополнительныеОтчетыИОбработки» ):
&НаСервереБезКонтекста
Функция ПолучитьНавигационнуюСсылкуДопОбработки ( ИмяОбработки )
УстановитьПривилегированныйРежим (Истина);
Запрос = Новый Запрос ;
Запрос . Текст =
"ВЫБРАТЬ
| Т.Ссылка КАК Ссылка
|ИЗ
| Справочник.ДополнительныеОтчетыИОбработки КАК Т
|ГДЕ
| Т.ПометкаУдаления = ЛОЖЬ
| И Т.ИмяОбъекта = """ + ИмяОбработки + """
| И Т.Вид = ЗНАЧЕНИЕ(Перечисление.ВидыДополнительныхОтчетовИОбработок.ДополнительнаяОбработка)
| И Т.Публикация = ЗНАЧЕНИЕ(Перечисление.ВариантыПубликацииДополнительныхОтчетовИОбработок.Используется)" ;
Выборка = Запрос . Выполнить (). Выбрать ();
Пока Выборка . Количество () = 0 Цикл
Возврат "" ;
КонецЦикла;
Выборка . Следующий ();
Возврат ПолучитьНавигационнуюСсылку ( Выборка . Ссылка , "ХранилищеОбработки" );
КонецФункции
стПараметры = Новый Структура ( "А" , стАргументы );
стПараметры . Вставить ( "ОбработкаАдрес" , ПолучитьНавигационнуюСсылкуДопОбработки ( ОбработкаИмя ));
КодВыполнения =
"П = ПереданноеЗначение;
|// по навигационной ссылке двоичных данных обработки в ИБ
|Обработка = ВнешниеОбработки.Создать(ВнешниеОбработки.Подключить(П.ОбработкаАдрес,,Ложь));
|Обработка.МетодПроцедура2(П.А.Арг1,П.А.Арг2,П.А.Арг3);
|" ;
ИмяМетодаФЗ = "УТР_Сервер.ВыполнитьНаСервере" ;
ПараметрыФЗ = Новый Массив ;
ПараметрыФЗ . Добавить ( КодВыполнения ); // исполняемый код, запускающий обработку на сервере
ПараметрыФЗ . Добавить ( стПараметры ); // параметры исполняемого кода
ЕррорИнфо = "" ;
Попытка
Задание = ФоновыеЗадания . Выполнить (
ИмяМетодаФЗ , ПараметрыФЗ , ОбработкаИмя + "_" + ФоновоеЗаданиеКлюч , "Выполнение обработки """ + ОбработкаИмя + """" );
Если ТаймаутФЗ > 0 Тогда
Задание . ОжидатьЗавершения ( ТаймаутФЗ );
КонецЕсли;
ЗаданиеGUID = Задание . УникальныйИдентификатор ;;
Исключение
ЗаданиеGUID = Неопределено;
ЕррорИнфо = ОписаниеОшибки ();
КонецПопытки;
Возврат ЗаданиеGUID ;
КонецФункции
2) Передать через аргумент метода фонового задания полный путь к файлу обработки/отчета
(полный путь можно получить из атрибута объекта “ИспользуемоеИмяФайла”,
этот путь должен быть доступен на стороне сервера):
стПараметры = Новый Структура ( "А" , стАргументы );
стПараметры . Вставить ( "ОбработкаПутьФайла" , Обработка . ИспользуемоеИмяФайла );
КодВыполнения =
"П = ПереданноеЗначение;
|// по пути к файлу обработки
|Обработка = ВнешниеОбработки.Создать(П.ОбработкаПутьФайла,Ложь);
|Обработка.МетодПроцедура2(П.А.Арг1,П.А.Арг2,П.А.Арг3);
|" ;
ИмяМетодаФЗ = "УТР_Сервер.ВыполнитьНаСервере" ;
ПараметрыФЗ = Новый Массив ;
ПараметрыФЗ . Добавить ( КодВыполнения ); // исполняемый код, запускающий обработку на сервере
ПараметрыФЗ . Добавить ( стПараметры ); // параметры исполняемого кода
ЕррорИнфо = "" ;
Попытка
Задание = ФоновыеЗадания . Выполнить (
ИмяМетодаФЗ , ПараметрыФЗ , ОбработкаИмя + "_" + ФоновоеЗаданиеКлюч , "Выполнение обработки """ + ОбработкаИмя + """" );
Если ТаймаутФЗ > 0 Тогда
Задание . ОжидатьЗавершения ( ТаймаутФЗ );
КонецЕсли;
ЗаданиеGUID = Задание . УникальныйИдентификатор ;;
Исключение
ЗаданиеGUID = Неопределено;
ЕррорИнфо = ОписаниеОшибки ();
КонецПопытки;
Возврат ЗаданиеGUID ;
КонецФункции
В
3) Передать через аргумент метода фонового задания сами двоичные данные файла обработки/отчета
(их можно получить конструктором по значению атрибута объекта “ИспользуемоеИмяФайла”):
стПараметры = Новый Структура ( "А" , стАргументы );
стПараметры . Вставить ( "ОбработкаДанные" ,Новый ДвоичныеДанные ( Обработка . ИспользуемоеИмяФайла ));
КодВыполнения =
"П = ПереданноеЗначение;
|// по двоичным данным обработки
|ИмяФайла = ПолучитьИмяВременногоФайла("".epf"");
|П.ОбработкаДанные.Записать(ИмяФайла);
|Обработка = ВнешниеОбработки.Создать(ИмяФайла,Ложь);
|Обработка.МетодПроцедура2(П.А.Арг1,П.А.Арг2,П.А.Арг3);
|" ;
ИмяМетодаФЗ = "УТР_Сервер.ВыполнитьНаСервере" ;
ПараметрыФЗ = Новый Массив ;
ПараметрыФЗ . Добавить ( КодВыполнения ); // исполняемый код, запускающий обработку на сервере
ПараметрыФЗ . Добавить ( стПараметры ); // параметры исполняемого кода
ЕррорИнфо = "" ;
Попытка
Задание = ФоновыеЗадания . Выполнить (
ИмяМетодаФЗ , ПараметрыФЗ , ОбработкаИмя + "_" + ФоновоеЗаданиеКлюч , "Выполнение обработки """ + ОбработкаИмя + """" );
Если ТаймаутФЗ > 0 Тогда
Задание . ОжидатьЗавершения ( ТаймаутФЗ );
КонецЕсли;
ЗаданиеGUID = Задание . УникальныйИдентификатор ;;
Исключение
ЗаданиеGUID = Неопределено;
ЕррорИнфо = ОписаниеОшибки ();
КонецПопытки;
Возврат ЗаданиеGUID ;
КонецФункции
В
Описание файлов поставки:
Пример.epf – демонстрационная обработка с примерами использования
(в том числе разные варианты выполнения в фоновом задании):
При использовании для доступа к данным 1С:Предприятия 8.0 COM -соединения имеются следующие преимущества по сравнению с использованием Automation сервера:
- Более быстрая установка соединения, так как не требуется создания отдельного процесса операционной системы, а все действия производятся в рамках вызывающего процесса;
- Более быстрое обращение к свойствам и методам объектов 1C:Предприятия, так как для организации обращения не требуется организации межпроцессной коммуникации;
- Меньший расход ресурсов операционной системы.
В общем и целом работа с 1С:Предприятием 8.0 через COM -соединение подобна работе с 1С:Предприятием в режиме Automation сервера. Основные отличия заключаются в следующем:
- В случае Automation сервера запускается полноценное приложение 1С:Предпприятия 8.0, а в случае COM -соединения запускается относительно небольшой внутрипроцессный COM -сервер.
- При работе через COM -соединение недоступны функциональные возможности так или иначе связанные с организацией пользовательского интерфейса 1С:Предприятия 8.0;
- При работе COM -соединения не используется модуль приложения конфигурации 1С:Предприятия 8.0. Его роль при работе с COM -соединением играет модуль внешнего соединения.
1.1 Порядок установки COM-соединения
Для организации доступа к данным 1С:Предприятия 8.0 через COM -соединение, выполняется следующая последовательность действий:
Важно! В связи с отсутствием пользовательского интерфейса в COM-соеденении не все объекты, а также свойства и методы можно использовать в COM -соединении.
Объекты 1С:Предприятия, доступные извне через COM -соединение:
- Экспортируемые переменные и процедуры/функции модуля внешнего соединения
- Экспортируемые переменные и процедуры/функции общих модулей
- Включение и исключение модулей целиком с помощью установки свойств общих модулей
- Включение и исключение фрагментов общих модулей с помощью препроцессора
- Глобальный контекст 1С:Предприятия 8.0, за исключением объектов, жестко связанных с клиентским приложением (ТекстовыйДокумент, ТабличныйДокумент, . )
1.2 Модуль внешнего соединения
Как уже отмечалось обязанности модуля приложения при работе через COM -соединение, выполняет модуль внешнего соединения. Данный модуль может иметь процедуры-обработчики событий ПриНачалеРаботыСистемы() и ПриЗавершенииРаботыСистемы(), в которых могут быть размещены действия, выполняемые при инициализации и завершении соединения, соответственно.
Процедуры, функции и глобальные переменные, определенные в модуле внешнего соединения с ключевым словом Экспорт становятся, как и в случае модуля приложения, частью глобального контекста.
1.3 Общие модули
Для общих модулей введены свойства "Клиент", "Сервер" и "ВнешнееСоединение". Они предназначены для определения в конфигурации использования модулей в клиент - серверном варианте и в режиме COM -соединения.
1.4 Объект "V8.COMConnector"
Строка соединения с ИБ представляет собой цепочку фрагментов вида Параметр=Значение. Фрагменты отделяются друг от друга символами ';'. Если значение содержит пробельные символы, то оно должно быть заключено в двойные кавычки (").
Usr - имя пользователя;
Pwd - пароль.
Для файлового варианта определен параметр:
File - каталог информационной базы.
Для клиент-серверного варианта определены параметры:
Srvr - имя сервера 1С:Предприятия;
Ref - имя информационной базы на сервере.
Метод Connect возвращает ссылку на созданный объект COM -соединения.
Метод Connect устанавливает COM -соединение с информационной базой 1С:Предприятия 8.0 и возвращает ссылку на объект COM -соединение.
// Создается объект-коннектор
V8 = Новый COMObject ("V8.COMConnector");
// создается объект COM -соединение
Соединение = V8.Connect ("File=""c:\InfoBases\Trade""; Usr =""Director"";")
Авторизация доступа через COM -соединение возможна как с помощью параметров строки соединения «Usr» и «Pwd», так и через пользователя Windows, в любом случае должно быть право на «Внешнее соединение».
1.5 Объект "COM-соединение"
COM -соединение с информационной базой 1С:Предприятия предоставляет полный доступ к своему глобальному контексту (см. «Контекст выполнения программного модуля»). Поэтому COM -соединение в качестве своих методов может иметь: системные константы, значения заданных в конфигураторе объектов, доступ к которым осуществляется с помощью менеджеров (например, константы, перечисления, справочники, документы, журналы документов, отчеты, обработки, планы видов характеристик, планы счетов, планы видов расчета, регистры), а также переменные, объявленные в модуле внешнего соединения с ключевым словом Экспорт.
Кроме того, COM -соединение имеет дополнительный метод NewObject, с помощью которого можно создавать значения определенных типов.
тз = Соединение. NewObject ("ТаблицаЗначений");
Метод String Позволяет получать строковые представления значений 1С:Предприятия.
1.6. Особенности работы с COM -соединением
В Automation и в COM -соединении TRUE и FALSE имеют соответственно значения: -1 (минус единица) и 0.
Имеется возможность организации пула COM-соединений. При этом на принимающей на сервере 1С:Предприятия ЗАРАНЕЕ создаются несколько объектов COM-соединения и на установку соединения требуется еще меньше времени, поскольку не нужно создавать новый объект.
Реализован новый объект ПостроительЗапроса, предназначенный для генерации текстов запросов на основании указанных настроек. Данный объект поддерживает функциональность построителя отчета, не относящуюся к выводу отчета в табличный документ и другим задачам, связанным с пользовательским интерфейсом. Данный объект может использоваться на сервере 1С:Предприятия и в COM -соединении.
Доступно использование COM -объектов при работе встроенного языка на сервере 1С:Предприятия.
Значит дело было так. Появилась необходимость подключаться к базам по com соединению, для анализа тамошних объектов метаданных. Проблема оказалась в том, что базы могли работать на разных версиях 1С. Пошел в интернет, искал, читал, но все фигня, в оновном все предлагают держать базы на одной версии, что для меня было невозможным.
Кроме, вот этой статьи. Огромное спасибо автору (Леонид Кириенко) и zakiap
Тут уже интересней, но есть пару минусов
1) 1С должна работать от имени учетки с админскими правами.
2) "Варварское" поведение по отношению dllhost.exe :)
3) Могут возникнуть проблемы при одновременном обращении к базам на разных версиях.
Но, как оказалось, самым для меня полезным, оказалась не сама статья, а один из комментариев к ней.
Если присмотрется, то видно, что у него создано несколько оберток для разных версий. Увидев этот коммент, я тут же обрадовался, думал сейчас все расскажут. Но не тут то было, показать, показал, а рассказать забыл)
Инструкция
1. Идем "Панель управления" - "Администрирование" - "Службы компонентов"
2. В оснастке служб компонентов, "Службы компонентов" - "Компьютеры" - "Мой компьютер" - "Приложения COM+"
3. Создаем новое приложение, правой кнопкой по "Приложения COM+" - "Создать" - "Приложение"
4. Выбираем "Создать новое приложение", называем например "1cv8", тип выбираем "Библиотечное приложение"
должно полчуить так
5. Раскрываем "1cv8", правой кнопкой по "Компоненты" - "Создать" - "Компонент".
6. Выбираем вариант "Установка новых компонентов", находим нашу библиотеку comcntr.dll
Находится она в катлоге BIN установленной платформы, у меня например путь такой
"C:\Program Files (x86)\1cv8\8.3.10.2168\bin\comcntr.dll"
должны получить следующую картину
7. Правой кнопкой по "V83.COMConnector.1" - "Псевдоним. ", меняем наименование с "CopyOf.V83.COMConnector.1" на "V83.COMConnector_8.3.9.2033". Данное действие проделываем для всех нужных версий платформ.
8. Открываем "regedit" через пуск или команду "Выполнить", нажимаем F3 и указываем для поиска строку с наименованием созданой нами обертки, например "V83.COMConnector_8.3.9.2033". Или использум для поиска CLSID созданной обертки.
9. Ищем значение в ветке "HKEY_LOCAL_MACHINE" у меня путь такой HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Wow6432Node\CLSID\\ выглядеть должно так
В ветке "InprocServer32" меняем значение у меня, "C:\Program Files (x86)\1cv8\8.3.10.2168\bin\comcntr.dll" на путь к нужной версии длл, в данном случае "C:\Program Files (x86)\1cv8\8.3.9.2033\bin\comcntr.dll".
Данное дейстие проделываем для всех созданных оберток.
Все готово) Для подключения к конкретной версии базы, в 1С теперь нужно использовать следующую конструкцию
В файлах утилита, которая выполнит все эти действия автоматически. Подходит для тех у кого 1С лежит в каталоге
"C:\Program Files (x86)\1cv8". У кого что то отличается, вот ссылка на GitHub . Запустить утилиту нужно от имени администратора. Надеюсь данный материал будет вам полезен)
Специальные предложения
При регистрации библиотек из разных версий 8.3, в одном СОМ приложении, возможно подключиться только к одной из версий.
(15) Решил проблему, создав компоненты в отдельных приложениях СОМ
(15) Методом проб и ошибок- свойствах приложения-> Активация-> Серверное подключение . Так заводится и создается инстанс без ошибок
Спасибо за статью. Мне она помогла, но если просто сделать как написано, возникали ошибки. Куча комментариев с разными ошибками не дали быстрого решения как именно сделать настройки. Предлагаю слегка скорректированный алгоритм. (*) - измененные шаги. В нем нет последних шагов по работе с реестром. У меня сработало на двух серверах.
Если автор посчитает возможным - можно было бы перенести в шапку.
1. Идем "Панель управления" - "Администрирование" - "Службы компонентов"
2. В оснастке служб компонентов, "Службы компонентов" - "Компьютеры" - "Мой компьютер" - "Приложения COM+"
3. Создаем новое приложение, правой кнопкой по "Приложения COM+" - "Создать" - "Приложение"
4*. Выбираем "Создать новое приложение", называем например "1cv8", тип выбираем "Серверное приложение",
Учетная запись - Текущий пользователь, Пользователь с ролью Owner - поставил администратора компьютера (сервера).
(без этого возможна ошибка -2147024769(0x8007007F): Не найдена указанная процедура)
5*. Нажимаем правой кнопкой по ветке 1cv8 – Свойства – Безопасность:
- Снимаем галку «Принудительная проверка доступа для приложений»
- Ставим галку «Применить политику программных ограничений»
- Уровень ограничений «Неограниченный»
(без этого возможна ошибка -2147024891(0x80070005): Отказано в доступе)
6. Раскрываем "1cv8", правой кнопкой по "Компоненты" - "Создать" - "Компонент".
7. Выбираем вариант "Установка новых компонентов", находим нашу библиотеку comcntr.dll (той версии платформы, к которой надо будет подключаться)
-* Если установка платформы на сервер не требуется, то достаточно скопировать в некую папку на сервере все содержимое папки bin соответствующей платформы и указать comcntr.dll из этой папки
8. Правой кнопкой по "V83.COMConnector.1" - "Псевдоним. ", меняем наименование с "CopyOf.V83.COMConnector.1" на "V83.COMConnector_8.3.9.2033". Данное действие проделываем для всех нужных версий платформ.
Значит дело было так. Появилась необходимость подключаться к базам по com соединению, для анализа тамошних объектов метаданных. Проблема оказалась в том, что базы могли работать на разных версиях 1С. Пошел в интернет, искал, читал, но все фигня, в оновном все предлагают держать базы на одной версии, что для меня было невозможным.
Кроме, вот этой статьи. Огромное спасибо автору (Леонид Кириенко) и zakiap
Тут уже интересней, но есть пару минусов
1) 1С должна работать от имени учетки с админскими правами.
2) "Варварское" поведение по отношению dllhost.exe :)
3) Могут возникнуть проблемы при одновременном обращении к базам на разных версиях.
Но, как оказалось, самым для меня полезным, оказалась не сама статья, а один из комментариев к ней.
Если присмотрется, то видно, что у него создано несколько оберток для разных версий. Увидев этот коммент, я тут же обрадовался, думал сейчас все расскажут. Но не тут то было, показать, показал, а рассказать забыл)
Инструкция
1. Идем "Панель управления" - "Администрирование" - "Службы компонентов"
2. В оснастке служб компонентов, "Службы компонентов" - "Компьютеры" - "Мой компьютер" - "Приложения COM+"
3. Создаем новое приложение, правой кнопкой по "Приложения COM+" - "Создать" - "Приложение"
4. Выбираем "Создать новое приложение", называем например "1cv8", тип выбираем "Библиотечное приложение"
должно полчуить так
5. Раскрываем "1cv8", правой кнопкой по "Компоненты" - "Создать" - "Компонент".
6. Выбираем вариант "Установка новых компонентов", находим нашу библиотеку comcntr.dll
Находится она в катлоге BIN установленной платформы, у меня например путь такой
"C:\Program Files (x86)\1cv8\8.3.10.2168\bin\comcntr.dll"
должны получить следующую картину
7. Правой кнопкой по "V83.COMConnector.1" - "Псевдоним. ", меняем наименование с "CopyOf.V83.COMConnector.1" на "V83.COMConnector_8.3.9.2033". Данное действие проделываем для всех нужных версий платформ.
8. Открываем "regedit" через пуск или команду "Выполнить", нажимаем F3 и указываем для поиска строку с наименованием созданой нами обертки, например "V83.COMConnector_8.3.9.2033". Или использум для поиска CLSID созданной обертки.
9. Ищем значение в ветке "HKEY_LOCAL_MACHINE" у меня путь такой HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Wow6432Node\CLSID\\ выглядеть должно так
В ветке "InprocServer32" меняем значение у меня, "C:\Program Files (x86)\1cv8\8.3.10.2168\bin\comcntr.dll" на путь к нужной версии длл, в данном случае "C:\Program Files (x86)\1cv8\8.3.9.2033\bin\comcntr.dll".
Данное дейстие проделываем для всех созданных оберток.
Все готово) Для подключения к конкретной версии базы, в 1С теперь нужно использовать следующую конструкцию
В файлах утилита, которая выполнит все эти действия автоматически. Подходит для тех у кого 1С лежит в каталоге
"C:\Program Files (x86)\1cv8". У кого что то отличается, вот ссылка на GitHub . Запустить утилиту нужно от имени администратора. Надеюсь данный материал будет вам полезен)
Специальные предложения
При регистрации библиотек из разных версий 8.3, в одном СОМ приложении, возможно подключиться только к одной из версий.
(15) Решил проблему, создав компоненты в отдельных приложениях СОМ
(15) Методом проб и ошибок- свойствах приложения-> Активация-> Серверное подключение . Так заводится и создается инстанс без ошибок
Спасибо за статью. Мне она помогла, но если просто сделать как написано, возникали ошибки. Куча комментариев с разными ошибками не дали быстрого решения как именно сделать настройки. Предлагаю слегка скорректированный алгоритм. (*) - измененные шаги. В нем нет последних шагов по работе с реестром. У меня сработало на двух серверах.
Если автор посчитает возможным - можно было бы перенести в шапку.
1. Идем "Панель управления" - "Администрирование" - "Службы компонентов"
2. В оснастке служб компонентов, "Службы компонентов" - "Компьютеры" - "Мой компьютер" - "Приложения COM+"
3. Создаем новое приложение, правой кнопкой по "Приложения COM+" - "Создать" - "Приложение"
4*. Выбираем "Создать новое приложение", называем например "1cv8", тип выбираем "Серверное приложение",
Учетная запись - Текущий пользователь, Пользователь с ролью Owner - поставил администратора компьютера (сервера).
(без этого возможна ошибка -2147024769(0x8007007F): Не найдена указанная процедура)
5*. Нажимаем правой кнопкой по ветке 1cv8 – Свойства – Безопасность:
- Снимаем галку «Принудительная проверка доступа для приложений»
- Ставим галку «Применить политику программных ограничений»
- Уровень ограничений «Неограниченный»
(без этого возможна ошибка -2147024891(0x80070005): Отказано в доступе)
6. Раскрываем "1cv8", правой кнопкой по "Компоненты" - "Создать" - "Компонент".
7. Выбираем вариант "Установка новых компонентов", находим нашу библиотеку comcntr.dll (той версии платформы, к которой надо будет подключаться)
-* Если установка платформы на сервер не требуется, то достаточно скопировать в некую папку на сервере все содержимое папки bin соответствующей платформы и указать comcntr.dll из этой папки
8. Правой кнопкой по "V83.COMConnector.1" - "Псевдоним. ", меняем наименование с "CopyOf.V83.COMConnector.1" на "V83.COMConnector_8.3.9.2033". Данное действие проделываем для всех нужных версий платформ.
Ошибка при вызове конструктора (COMОбъект): -2147467225(0x80004027): Этот компонент или приложение содержит отключенные компоненты. После установки x64 версии 1С: Предприятия 8
Описание ошибки:
После установки сервера 1С: Предприятия x64-версии. Ошибка при вызове конструктора (COMОбъект): -2147467225(0x80004027): Этот компонент или приложение содержит отключенные компоненты. Для конструктора Новый COMОбъект("MSScriptControl.ScriptControl") в коде механизма версионирования конфигурации 1С: Управление торговлей, ред. 10.3, релиз 10.3.55.1. Релиз платформы 1С: Предприятия - 8.3.13.1809. Версия сервера Windows - Windows Server 2008 R2 Datacenter.
Немного к слову - был удивлен такого рода ошибкой в добавленном в УТ механизме версионирования, который был максимально выдернут из комплексной ред. 1.1 и помещен в Управление торговлей 10.3: при аналогичном переводе конфигурации 1С: Комплексная на сервер x64 на другом сервере (Windows Server 2008 R2 Standart) после перехода ошибка не возникала.
Нажатие на изображении увеличит его
: Ошибка при вызове конструктора (COMОбъект): -2147221164(0x80040154): Этот компонент или приложение содержит отключенные компоненты.
Описание решения проблемы состояло в создании Приложения COM+ с определенным набором параметров, связанных с MSScriptControl.ScriptControl. Последовательность действий следующая:
1. Запускаем "Службу компонентов" через командную строку %windir%\system32\comexp.msc или через "Панель управления" - "Администрирование" - "Службы компонентов".
2. В ветке "Корень консоли" - "Службы компонентов" - "Компьютеры" - "Мой компьютер" - "Приложения COM+" добавляем новое приложение, выбрав пункт контекстного меню "Создать" - "Приложение".
3. Откроется "Мастер установки приложений COM+". На шаге "Установка или создание нового приложения" выбирается вариант "Создать новое приложение".
Нажатие на изображении увеличит его
4. Шаг "Создание нового приложения". Ввести имя нового приложения. Для удобства понимания можно указать "1C_ScriptControl". Так же выбрать значение "Способа активации" - "серверное приложение".
5. На шаге ""Удостоверение приложения" выбрать учетную запись для запуска приложения - значение "Локальная служба - встроенная учетная запись службы".
6. На шаге "Добавление ролей приложения" оставить по умолчанию.
7. На следующем шаге "Добавление пользователей для ролей" через кнопку "Добавить" для ветки "Users" (пользователи) "Все", выполнив поиск среди пользователей и групп.
8. На следующем шаге на строке "Компоненты" в ветке созданного приложения " 1C_ScriptControl " через контекстное меню "Создать" - "Компонент".
Нажатие на изображении увеличит его
Важное замечание, если база серверная, то и пользователь, под которым будет выполняться компонента, должен быть таким же, что и тот, под который работает служба "Агент сервера 1С: Предприятие" в службах. Например, если служба агента сервера запущена под локальной системой (локальной системной учетной записью), то и компонент должен быть настроен под учетную запись локальной службы. Или если агент сервера работает под пользователем по умолчанию USR1CV8, то и компонента должна работать под "указанным пользователем".
Нажатие на изображении увеличит его
Нажатие на изображении увеличит его
Тогда в в ветке "Роли" созданного приложения " 1C_ScriptControl " нужно корректно настроить пользователей. В данном примере будет добавление прав для группы пользователей. Для этого вызываем контекстное меню и в подменю "Создать" выбираем "Пользователь".
Используя форму "Выбор: пользователи или группы", нажимая на кнопку "Дополнительно. ", выполняя "Поиск", находим группу "Все".
И последовательно нажимая кнопки "ОК" в формах в результате увидим, что группа "Все" будет добавлена в "Пользователи". После этого отказа в доступе не должно быть. Так же можете настроить и по каждому пользователю в отдельности. Но, кажется, для стабильной работы приложения - это лишнее, и группы пользователей достаточно.
Читайте также: