Вот такую вещь нужно сделать: находясь в одной базе 1С, программным образом в базе-приемнике создать некий элемент справочника и открыть его форму. При этом нужно в открываемую форму передать некоторые параметры.
Делаю так :
V83appl = Новый COMОбъект("V83.Application");
Если V83appl.Connect(мояСтрокаСоединения) тогда
ПараметрыФормыДО = Новый Структура;
ПараметрыФормыДО.Вставить("Ключ", новДок.Ref);
ПараметрыФормыДО.Вставить("НекийПараметр", Истина);
V83appl.ОткрытьФорму("Справочник.МойСправочник.Форма.ФормаЭлемента", ПараметрыФормыДО) ;
КонецЕСли;
Здесь приведен только релевантный код. Со строкой соединения все в порядке. НовДок уже создан и записан в базе-приемнике перед этим куском кода.
Интересно, что V83appl.ОткрытьФорму("Справочник.МойСправочник.Форма.ФормаЭлемента") отрабатывает нормально, открывая, как и положено, форму нового элемента, но мне, разумеется, она не нужна.
Видимо, проблема именно в параметрах, например в том, что новДок.Ref (новДок.Ссылка) имеют тип ComОбъект, а не ...Ссылка, что и вызывает сбой ОткрытьФорму.
Как действовать в этой ситуации? Как открыть форму уже записанного элемента, передав параметры? Из-за параметров не могу пользоваться ОткрытьЗначение() и ПерейтиПоНавигационнойСсылке(). Кроме того, крайне нежелательно менять конфигурацию базы-приемника, и поэтому я не могу впихнуть нужные мне параметры прямо в справочник и обработать в ПриСозданииНаСервере
(1) e9953,
вопрос 1: ЗАЧЕМ открывать в удаленной базе форму?
вопрос 2: КАК вы себе представляете форму в удаленной базе, не имеющей юзерского интерфейса?
(8) sssss_aaaaa_2011,
1) жизнь сложилась так, что часть нужного функционала в одной конфигурации, а часть - в другой. При этом многое из нужного функционала отрабатывает после интерактивных действий пользователя. Поэтому нужно не просто записать объект в базу, а показать форму, чтобы пользователь что-то доделал.
2) В честь того, что нужна именно форма, запускается V83.Application, которое есть клиентское приложение, и таким образом, доступен интерфейс.
(9) RustamZz, новДок.Ref у меня получился как ComОбъект. Но для того, чтобы сработало ОткрытьФорму, нужно было его как-то превратить в ссылку. А это-то у меня и не вышло.
Как быть, если в форме в базе-приемнике мне нужно указать ссылку? Допустим, я через com найду нужную ссылку. Я смогу положить ее в реквизит формы, причем в табличной части?
Временно было найдено решение задачи заказчика другими методами, которые не требуют передачи специфических параметров в форму. Спасибо всем откликнувшимся!
(15) МимохожийОднако,
Собственно, исходно было вот что: был доработанный УПП на обычных формах и Документооборот КОРП на управляемых. По данным УПП нужно было создавать т.н. внутренние документы в ДО и стартовать для них сложные процессы согласования. При этом может потребоваться дозаполнение документа в ДО.
Сейчас это предполагается делать так: 1) в УПП берется V83.ComConnector к ДО, 2) в этом ComConnector создается и записывается внутренний документ ДО, 3) получаем навигационную ссылку на ДО, 4)передаем в V83.Application для ДО и через команду ПерейтиПоНавигационнойСссылке - показываем форму со свежесозданным объектом. 5) пользователь делает свое дело 6) когда решает отправить на согласование - нажимает кнопку регистрации, при этом стартует рекомендованный для этого документа процесс.
В чем был трабл раньше - в ДО настройки были такие, что процесс стартовал сам, когда пользователь закрывал карточку свежесозданного документа. Ну а у нас-то получалось только открытие заранее записанного документа, не свежесозданного! Курение конфигурации ДО показало, что можно обмануть ДО, подсунув при открытии формы параметр ТолькоЧтоСозданныйДокумент=Истина. Поэтому и предпринимались попытки использовать ОткрытьФорму с параметрами, но это путь оказался слишком тернист... Теперь ДО перенастроим так, что процессы будут стартовать не при закрытии карточки, а при присвоении пользователем рег.номера. Пользователям это обойдется в три лишних клика мышкой, что, конечно, не очень хорошо, но пока лучшее из того, чего удалось добиться.
Вот я о том же самом думала, но уже много позже. Тогда уже тема перестала быть актуальной, и подходящих баз под рукой, чтобы проверить, не было. Разворачивать стенды было лень ))) А тут Вы написали, и подтвердили мои мысли, так что спасибо большое.
Такая же задача успешно была решена посредством Com-соединения 2х 1С баз. Пока они работали на одинаковых платформах. Теперь работают на разных 8.3 платформах, при чем разной разрядности: у одной клиентская часть 32-х разрядная. Может эту задачу решить по другому, например, использовать Web-сервис? У кого есть опыт решения такой задачи?
Это может не обычный пользователь, а с административными правами. И если один пользователь уже работает с базой на одной платформе, а другому пользователю потребуется соединиться с базой на другой платформе, то как?
(29) Смотрел эту статью, пробовал. V83.COMConnector с ограниченными возможностями меня не устраивает из-за нехватки функционала. Нужны OLE соединения V83.Application. Они не получились...
На команду "C:\Program Files\1cv8\8.3.14.1779\bin\1cv8.exe" /regserver система не реагирует, сервер перезагружал. Пытаюсь подключиться к базе PatrERP (КА2), она на сервере с нестандартным диапазоном портов 16хх - не находит ее!?
(32) Поднять версию серверной части нашел как: в СтрокаПодключения к ИмяСервера приписал ":1640". Теперь при Com-соединении получаю ошибку: "Несоответствие версий клиента и сервера 1С:Предприятия".
Да, на команду C:\Windows\SysWOW64\regsvr32 "c:\Program Files\1cv8\8.3.14.1779\bin\comcntr.dll" пишет: Успешно выполнено DllRtgisterServer в c:\Program Files\1cv8\8.3.14.1779\bin\comcntr.dll, но на самом деле все по старому, не подключается к 8.3.14.1779. Решил по аналогии с COM соединения к базам 1С на различных версиях платформы, написал:
Процедура СменитьВерсиюПлатформы(СтруктураПодключения, СтрокаПодключения, ВерсияПриложения)
Если Найти(СтрокаПодключения, "PatrERP") > 0 Тогда
СтрокаПодключения = СтрЗаменить(СтрокаПодключения, СтруктураПодключения.ИмяСервера, СтруктураПодключения.ИмяСервера + ":1640");
КонецЕсли;
ТребуемаяВерсия = ?(Найти(СтрокаПодключения, "PatrERP") = 0, "8.3.10.2466", "8.3.14.1779");
Ключ = "HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{181E893D-73A4-4722-B61D-D604B3D67D47}\InprocServer32\";
WshShell = Новый COMОбъект("WScript.Shell");
Значение = WshShell.RegRead(Ключ);
Если Найти(Значение, ТребуемаяВерсия) > 0 Тогда
ВерсияПриложения = ТребуемаяВерсия;
Возврат;
КонецЕсли;
СисИнфо = Новый СистемнаяИнформация;
Значение = СтрЗаменить(Значение, СисИнфо.ВерсияПриложения, ТребуемаяВерсия);
WshShell.RegWrite(Ключ, Значение);
ЗапуститьПриложение("taskkill.exe /f /im dllhost.exe",, Истина);
КонецПроцедуры // СменитьВерсиюПлатформы()
Показать
Значение ключа взял из реестра поиском по C:\Program Files (x86)\1cv8\8.3.10.2466\bin\comcntr.dll, меняю версию платформы, и выполняю: taskkill.exe /f /im dllhost.exe. Но по прежнему: "Несоответствие версий клиента и сервера 1С:Предприятия", версия клиента остается 8.3.10.2466.
(39) В 1-м методе: COM соединения к базам 1С на различных версиях платформы производится перезапись ссылки на comcntr.dll требуемой версии. Во 2-м: COM соединения с базами 1С на различных версиях платформы "Без перерегистрации и СМС" - создание дополнительной компоненты V83.COMConnector_ТребуемойВерсии (со ссылкой на comcntr.dll требуемой версии), и переключения между ними, при этом не требуются административные права. В том и другом случае нужно правильно определить ключ к этой ссылке. У меня их оказалось несколько. Как определить правильный? Пока остается перебрать их...
Для начала создадим для коннектора обертку COM+, чтобы вызовы происходили не в контексте 1cv8.exe (1cv8c.exe), а в контексте dllhost.exe. В интернете достаточно публикаций на тему как это сделать...
И приводится картинка со свойствами V83.COMConnector.1. По ней определяется CLSID, по которому определяется ключ реестра, в котором меняется ссылка на comcntr.dll требуемой версии. В моем случае перебор возможных ключей с конкретным CLSID ничего не дал. Так вот, в службе компонентов в последнее время ничего не создавал. Может я пропустил что-то важное, и поэтому не могу соединиться с другой платформой?
(43) В статье COM соединения с базами 1С на различных версиях платформы "Без перерегистрации и СМС" дополнительно создаются компоненты V83.COMConnector_НомерВерсии, к ним привязываются comcntr.dll требуемой версии, используя ссылки реестра (не вполне понятно какие).
Чтобы не мучить рабочие сервера, стал использовать свой комп. На нем установил 2 платформы 8.3, и создал файловую базу (перенес процедуры подключения по Com). Запускаю ее что под 8.3.10.2466, что под 8.3.14.1779, результат один: с базой на 8.3.10.2466 нормально соединяется - открывает ее объекты. А при Com-соединении с базой на 8.3.14.1779 ошибку: "Несоответствие версий клиента и сервера 1С:Предприятия" (8.3.10.2466 - 8.3.14.1779). Т.е. клиентская часть Com-соединения определяется не версией платформы, из которой оно запускается. А чем?
Если используете разные версии работать с ними нужно только через COM+
Это с самого начала было понятно, но у меня не получается...
Какую DLL последней зарегистрировали, та и вызывается.
Можно ли до начала Com-соединения как-то определить (через регистры): какая DLL (ее версию) в данный момент действует?
И можно ли ее поменять на нужной версии другими способами? (с админ. правами)
(50) Вот сделал за 10 минут включая написание кода. Первая строка ConnectAgent проходит без ошибки, вторая с ошибкой не совпадает версия клиента и сервера.
(51) Это решение соответствует теме, открывает формы объектов (справочники, документы) других баз разных по версии платформы 8.3 и разрядности?
Просьба уточнить, что писать в модуле COM-подключения вместо
Попытка
БазаКА = Новый COMОбъект("V83.Application");
ТекCOMОбъект = БазаКА.Connect(СтрокаПодключения);
СтрокаСообщенияОбОшибке = "";
Состояние("Соедининение с " + БазаОрганизации(Организация) + "через COM-Объект выполнено");
Исключение
СтрокаСообщенияОбОшибке = "При попытке соединения с COM-сервером произошла следующая ошибка:" + Символы.ПС + ОписаниеОшибки() + Символы.ПС + "Строка подключения: " + СтрокаПодключения;
Возврат Неопределено;
КонецПопытки;
Показать
Пока при подключении к базе на другой платформе в СтрокаПодключения к ИмяСервера дописываю порт.
И неплохо бы инструкцию, по которой вы создавали компоненты V83.ComConnector, надо бы разобраться с правами этих компонент.
Вопрос данной темы открытый, лишь уточню: По какому принципу запускается именно клиентская часть, например 8.3.10.2466 для COM соединения? (а не той версии базы, на которой работает база открываемого объекта). Ну и 2-й вопрос: как поменять эту версию до начала COM соединения?
По какому принципу запускается именно клиентская часть
Какой версии зарегистрирована, та и запускается. Можно посмотреть в реестре (у меня в HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{e92b75e3-2ea1-4fec-b493-cef3ec59fca6}\LocalServer32). Поменять ее возможно лишь пользователям с административными правами.