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

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). Поменять ее возможно лишь пользователям с административными правами.
Оставьте свое сообщение
Вакансии
1С аналитик
Москва
зарплата от 210 000 руб.
Полный день

Руководитель направления 1С
Москва
зарплата от 350 000 руб.
Полный день

1С Программист
Москва
зарплата от 180 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)