Открыть форму существующего объекта в другой базе

1. e9953 23.06.14 12:36 Сейчас в теме
Добрый день!

Вот такую вещь нужно сделать: находясь в одной базе 1С, программным образом в базе-приемнике создать некий элемент справочника и открыть его форму. При этом нужно в открываемую форму передать некоторые параметры.

Делаю так :
V83appl = Новый COMОбъект("V83.Application");
Если V83appl.Connect(мояСтрокаСоединения) тогда
ПараметрыФормыДО = Новый Структура;
ПараметрыФормыДО.Вставить("Ключ", новДок.Ref);
ПараметрыФормыДО.Вставить("НекийПараметр", Истина);
V83appl.ОткрытьФорму("Справочник.МойСправочник.Форма.ФормаЭлемента", ПараметрыФормыДО) ;
КонецЕСли;

Здесь приведен только релевантный код. Со строкой соединения все в порядке. НовДок уже создан и записан в базе-приемнике перед этим куском кода.
Интересно, что V83appl.ОткрытьФорму("Справочник.МойСправочник.Форма.ФормаЭлемента") отрабатывает нормально, открывая, как и положено, форму нового элемента, но мне, разумеется, она не нужна.
Видимо, проблема именно в параметрах, например в том, что новДок.Ref (новДок.Ссылка) имеют тип ComОбъект, а не ...Ссылка, что и вызывает сбой ОткрытьФорму.

Как действовать в этой ситуации? Как открыть форму уже записанного элемента, передав параметры? Из-за параметров не могу пользоваться ОткрытьЗначение() и ПерейтиПоНавигационнойСсылке(). Кроме того, крайне нежелательно менять конфигурацию базы-приемника, и поэтому я не могу впихнуть нужные мне параметры прямо в справочник и обработать в ПриСозданииНаСервере
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
8. sssss_aaaaa_2011 23.06.14 16:01 Сейчас в теме
(1) e9953,
вопрос 1: ЗАЧЕМ открывать в удаленной базе форму?
вопрос 2: КАК вы себе представляете форму в удаленной базе, не имеющей юзерского интерфейса?
11. e9953 24.06.14 10:50 Сейчас в теме
(8) sssss_aaaaa_2011,
1) жизнь сложилась так, что часть нужного функционала в одной конфигурации, а часть - в другой. При этом многое из нужного функционала отрабатывает после интерактивных действий пользователя. Поэтому нужно не просто записать объект в базу, а показать форму, чтобы пользователь что-то доделал.
2) В честь того, что нужна именно форма, запускается V83.Application, которое есть клиентское приложение, и таким образом, доступен интерфейс.
9. RustamZz 23.06.14 16:07 Сейчас в теме
(1) Новый Структура надо тоже делать через COM.
новДок.Ref какого тип реквизит? Должен быть COMОбъект!
starik-2005; kraynev-navi; +2 Ответить
13. e9953 24.06.14 10:58 Сейчас в теме
(9) RustamZz, новДок.Ref у меня получился как ComОбъект. Но для того, чтобы сработало ОткрытьФорму, нужно было его как-то превратить в ссылку. А это-то у меня и не вышло.
2. VasMart 23.06.14 12:51 Сейчас в теме
Рисовать форму в открытой базе, запросом через сом получать данные и заполнять. Данные можно получить только примитивных типов - строка, число, булеов
3. e9953 23.06.14 12:58 Сейчас в теме
Как быть, если в форме в базе-приемнике мне нужно указать ссылку? Допустим, я через com найду нужную ссылку. Я смогу положить ее в реквизит формы, причем в табличной части?
4. Dimon93dimon 23.06.14 13:08 Сейчас в теме
(3) e9953, в Документообороте такое вроде реализовано, если не ошибаюсь.
5. e9953 23.06.14 13:20 Сейчас в теме
Dimon93dimon, а можно немножко поподробнее?
6. e9953 23.06.14 13:32 Сейчас в теме
И еще одно мое особое обстоятельство : база-источник у меня - обычное приложение, толстый клиент, база-приемник - управляемые формы, тонкий клиент
7. Dimon93dimon 23.06.14 13:41 Сейчас в теме
(6) e9953, http://v8.1c.ru/doc8/integrate.htm - это всё что я знаю. самому не приходилось реализовать, только видел частично веб-сервисы.
10. МимохожийОднако 141 23.06.14 16:14 Сейчас в теме
В внешнего соединения нет формы. Можно сделать только свою форму и заполнять полученными данными. Вопрос: Зачем?
12. e9953 24.06.14 10:56 Сейчас в теме
(10) МимохожийОднако, см.выше
14. e9953 24.06.14 11:00 Сейчас в теме
Временно было найдено решение задачи заказчика другими методами, которые не требуют передачи специфических параметров в форму. Спасибо всем откликнувшимся!
15. МимохожийОднако 141 24.06.14 12:31 Сейчас в теме
(14) e9953, колись )) Как обошли проблемку?
16. e9953 24.06.14 18:02 Сейчас в теме
(15) МимохожийОднако,
Собственно, исходно было вот что: был доработанный УПП на обычных формах и Документооборот КОРП на управляемых. По данным УПП нужно было создавать т.н. внутренние документы в ДО и стартовать для них сложные процессы согласования. При этом может потребоваться дозаполнение документа в ДО.

Сейчас это предполагается делать так: 1) в УПП берется V83.ComConnector к ДО, 2) в этом ComConnector создается и записывается внутренний документ ДО, 3) получаем навигационную ссылку на ДО, 4)передаем в V83.Application для ДО и через команду ПерейтиПоНавигационнойСссылке - показываем форму со свежесозданным объектом. 5) пользователь делает свое дело 6) когда решает отправить на согласование - нажимает кнопку регистрации, при этом стартует рекомендованный для этого документа процесс.

В чем был трабл раньше - в ДО настройки были такие, что процесс стартовал сам, когда пользователь закрывал карточку свежесозданного документа. Ну а у нас-то получалось только открытие заранее записанного документа, не свежесозданного! Курение конфигурации ДО показало, что можно обмануть ДО, подсунув при открытии формы параметр ТолькоЧтоСозданныйДокумент=Истина. Поэтому и предпринимались попытки использовать ОткрытьФорму с параметрами, но это путь оказался слишком тернист... Теперь ДО перенастроим так, что процессы будут стартовать не при закрытии карточки, а при присвоении пользователем рег.номера. Пользователям это обойдется в три лишних клика мышкой, что, конечно, не очень хорошо, но пока лучшее из того, чего удалось добиться.
МимохожийОднако; +1 Ответить
17. FirePyres 70 26.08.15 13:44 Сейчас в теме
Если актуально конечно,
Проблема в том что "Структура" создается в контексте текущей базы
надо так:

Элемент_appl = V83appl.Справочники.МойСправочник.НайтиПоНаименованию("Некий элемент");
ПараметрыФормыДО = V83appl.NewObject("Структура", "Ключ", Элемент_appl);


вставить куда нужно и всё взлетит
18. e9953 28.08.15 10:28 Сейчас в теме
Вот я о том же самом думала, но уже много позже. Тогда уже тема перестала быть актуальной, и подходящих баз под рукой, чтобы проверить, не было. Разворачивать стенды было лень ))) А тут Вы написали, и подтвердили мои мысли, так что спасибо большое.
20. M_Volkov 5 12.01.20 14:01 Сейчас в теме
Такая же задача успешно была решена посредством Com-соединения 2х 1С баз. Пока они работали на одинаковых платформах. Теперь работают на разных 8.3 платформах, при чем разной разрядности: у одной клиентская часть 32-х разрядная. Может эту задачу решить по другому, например, использовать Web-сервис? У кого есть опыт решения такой задачи?
21. RustamZz 13.01.20 09:12 Сейчас в теме
(20) Зарегистрировать dll нужной версии в COM+. Разрядность платформы не важна лучше использовать для обоих баз одинаковую.
22. M_Volkov 5 13.01.20 13:45 Сейчас в теме
(21)
Зарегистрировать dll нужной версии в COM+

Это может не обычный пользователь, а с административными правами. И если один пользователь уже работает с базой на одной платформе, а другому пользователю потребуется соединиться с базой на другой платформе, то как?
23. RustamZz 13.01.20 14:34 Сейчас в теме
(22) На одном компьютере несколько пользователей по очереди работают?
24. M_Volkov 5 13.01.20 14:38 Сейчас в теме
(23) Нет, терминал. К тому же одному и тому же пользователю может потребоваться сперва соединение с базой на одной платформе, затем на другой.
25. RustamZz 13.01.20 14:50 Сейчас в теме
(24) Терминал и несколько платформ нужно использовать из этого только одно.
26. M_Volkov 5 13.01.20 14:59 Сейчас в теме
(25) Печально. А другой технологией, например, Веб-сервисом можно Открыть форму существующего объекта в другой базе? (желательно пример)
27. RustamZz 13.01.20 16:12 Сейчас в теме
(26) Веб-сервисом вы может передать данные в формате xml. Форму не получится.
28. M_Volkov 5 13.01.20 17:40 Сейчас в теме
(27) Ну не веб, другими технологиями, только COM? А можно сразу две зарегистрировать dll нужных версий в COM+, и переключаться между ними?
30. M_Volkov 5 13.01.20 18:53 Сейчас в теме
(29) Смотрел эту статью, пробовал. V83.COMConnector с ограниченными возможностями меня не устраивает из-за нехватки функционала. Нужны OLE соединения V83.Application. Они не получились...
31. M_Volkov 5 15.01.20 15:19 Сейчас в теме
(25) На терминале мне никак не открыть форму объекта другой платформы?
32. RustamZz 15.01.20 17:15 Сейчас в теме
(31) Application зарегистрируйте нужной версии (C:\Program Files\1cv8\[версия платформы]\bin\1cv8.exe" /regserver )
33. M_Volkov 5 16.01.20 09:19 Сейчас в теме
(32)
Application зарегистрируйте нужной версии
На команду "C:\Program Files\1cv8\8.3.14.1779\bin\1cv8.exe" /regserver система не реагирует, сервер перезагружал. Пытаюсь подключиться к базе PatrERP (КА2), она на сервере с нестандартным диапазоном портов 16хх - не находит ее!?
34. M_Volkov 5 16.01.20 14:41 Сейчас в теме
(32) Поднять версию серверной части нашел как: в СтрокаПодключения к ИмяСервера приписал ":1640". Теперь при Com-соединении получаю ошибку: "Несоответствие версий клиента и сервера 1С:Предприятия".
35. RustamZz 16.01.20 16:53 Сейчас в теме
(34) Правильно называть такое соединение не COM, а OLE. Не соответствие версий, а /regserver отработал?
36. M_Volkov 5 18.01.20 18:06 Сейчас в теме
(35)
а /regserver отработал?
Да, на команду 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.
37. RustamZz 20.01.20 08:32 Сейчас в теме
(36) Это COM так регистрируется. Если нужно несколько версий COM, надо делать через COM+, в реестр писать ничего не нужно будет.
38. M_Volkov 5 20.01.20 18:41 Сейчас в теме
(37)
Если нужно несколько версий COM, надо делать через COM+
Это как, чтобы версия платформы подключения была требуемой?
39. RustamZz 21.01.20 09:23 Сейчас в теме
40. M_Volkov 5 22.01.20 12:34 Сейчас в теме
(39) В 1-м методе: COM соединения к базам 1С на различных версиях платформы производится перезапись ссылки на comcntr.dll требуемой версии. Во 2-м: COM соединения с базами 1С на различных версиях платформы "Без перерегистрации и СМС" - создание дополнительной компоненты V83.COMConnector_ТребуемойВерсии (со ссылкой на comcntr.dll требуемой версии), и переключения между ними, при этом не требуются административные права. В том и другом случае нужно правильно определить ключ к этой ссылке. У меня их оказалось несколько. Как определить правильный? Пока остается перебрать их...
41. RustamZz 22.01.20 15:41 Сейчас в теме
(40) Так это же нужно знать какая платформа на той стороне. Человек должен знать. Надо дать возможность выбрать версию пользователю.
42. M_Volkov 5 24.01.20 14:07 Сейчас в теме
(41)
Надо дать возможность выбрать версию пользователю.
Это конечно сделано: пользователь выбирает организацию, с базой какой хочет установить связь, по параметрам базы определяется версия платформы.
В статье COM соединения к базам 1С на различных версиях платформы Сказано:
Для начала создадим для коннектора обертку COM+, чтобы вызовы происходили не в контексте 1cv8.exe (1cv8c.exe), а в контексте dllhost.exe. В интернете достаточно публикаций на тему как это сделать...
И приводится картинка со свойствами V83.COMConnector.1. По ней определяется CLSID, по которому определяется ключ реестра, в котором меняется ссылка на comcntr.dll требуемой версии. В моем случае перебор возможных ключей с конкретным CLSID ничего не дал. Так вот, в службе компонентов в последнее время ничего не создавал. Может я пропустил что-то важное, и поэтому не могу соединиться с другой платформой?
Прикрепленные файлы:
43. RustamZz 24.01.20 14:28 Сейчас в теме
(42)
НомерВерсии = "8.3.9.2033";
Соединитель = Новый ComОбъект("V83.COMConnector_" + НомерВерсии);
44. M_Volkov 5 30.01.20 13:51 Сейчас в теме
(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-соединения определяется не версией платформы, из которой оно запускается. А чем?
45. RustamZz 30.01.20 18:09 Сейчас в теме
(44) Какую DLL последней зарегистрировали, та и вызывается. Если используете разные версии работать с ними нужно только через COM+.
46. M_Volkov 5 01.02.20 11:03 Сейчас в теме
(45)
Если используете разные версии работать с ними нужно только через COM+
Это с самого начала было понятно, но у меня не получается...
Какую DLL последней зарегистрировали, та и вызывается.
Можно ли до начала Com-соединения как-то определить (через регистры): какая DLL (ее версию) в данный момент действует?
И можно ли ее поменять на нужной версии другими способами? (с админ. правами)
47. RustamZz 01.02.20 11:29 Сейчас в теме
(46) А скрин на (42) не ваш? Покажите как у вас COM+ настроен. DLL для COM+ не нужно регистрировать обычным способом.
48. M_Volkov 5 01.02.20 14:12 Сейчас в теме
(47)
DLL для COM+ не нужно регистрировать обычным способом.
Да, мой скрин (42). Что именно показать? А каким способом?
49. RustamZz 01.02.20 14:22 Сейчас в теме
(48) Нужно каждую версию в своем приложении делать.
50. M_Volkov 5 01.02.20 15:29 Сейчас в теме
(49)
Нужно каждую версию в своем приложении делать.
Как именно?
Прикрепленные файлы:
51. RustamZz 02.02.20 17:47 Сейчас в теме
(50) Вот сделал за 10 минут включая написание кода. Первая строка ConnectAgent проходит без ошибки, вторая с ошибкой не совпадает версия клиента и сервера.
Прикрепленные файлы:
53. M_Volkov 5 03.02.20 07:19 Сейчас в теме
(51) Это решение соответствует теме, открывает формы объектов (справочники, документы) других баз разных по версии платформы 8.3 и разрядности?
Просьба уточнить, что писать в модуле COM-подключения вместо
Попытка
	БазаКА = Новый COMОбъект("V83.Application");
	ТекCOMОбъект = БазаКА.Connect(СтрокаПодключения);
	СтрокаСообщенияОбОшибке = "";
	Состояние("Соедининение с " + БазаОрганизации(Организация) + "через COM-Объект выполнено");
Исключение
	СтрокаСообщенияОбОшибке = "При попытке соединения с COM-сервером произошла следующая ошибка:" + Символы.ПС + ОписаниеОшибки() + Символы.ПС + "Строка подключения: " + СтрокаПодключения;
	Возврат Неопределено;   	
КонецПопытки;
Показать
Пока при подключении к базе на другой платформе в СтрокаПодключения к ИмяСервера дописываю порт.
И неплохо бы инструкцию, по которой вы создавали компоненты V83.ComConnector, надо бы разобраться с правами этих компонент.
54. RustamZz 03.02.20 09:06 Сейчас в теме
(53) V83.Application это не COM, а OLE через COM+ не заработает.
55. RustamZz 03.02.20 09:10 Сейчас в теме
56. M_Volkov 5 03.02.20 10:22 Сейчас в теме
(55)
OLE через COM+ не заработает.
Жаль, поэтому статью COM соединения с базами 1С на различных версиях платформы "Без перерегистрации и СМС" глубоко не рассматривал, не решает она задачу данной темы.
52. RustamZz 02.02.20 17:50 Сейчас в теме
(50) + к 51 одна компонента 32 битная, другая 64. Клиент 64 битный.
57. M_Volkov 5 09.02.20 14:10 Сейчас в теме
Вопрос данной темы открытый, лишь уточню: По какому принципу запускается именно клиентская часть, например 8.3.10.2466 для COM соединения? (а не той версии базы, на которой работает база открываемого объекта). Ну и 2-й вопрос: как поменять эту версию до начала COM соединения?
58. M_Volkov 5 05.03.20 13:40 Сейчас в теме
(57)
По какому принципу запускается именно клиентская часть
Какой версии зарегистрирована, та и запускается. Можно посмотреть в реестре (у меня в HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{e92b75e3-2ea1-4fec-b493-cef3ec59fca6}\LocalServer32). Поменять ее возможно лишь пользователям с административными правами.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот