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. МимохожийОднако 129 23.06.14 16:14 Сейчас в теме
В внешнего соединения нет формы. Можно сделать только свою форму и заполнять полученными данными. Вопрос: Зачем?
12. e9953 24.06.14 10:56 Сейчас в теме
(10) МимохожийОднако, см.выше
14. e9953 24.06.14 11:00 Сейчас в теме
Временно было найдено решение задачи заказчика другими методами, которые не требуют передачи специфических параметров в форму. Спасибо всем откликнувшимся!
15. МимохожийОднако 129 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 43 26.08.15 13:44 Сейчас в теме
Если актуально конечно,
Проблема в том что "Структура" создается в контексте текущей базы
надо так:

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


вставить куда нужно и всё взлетит
18. e9953 28.08.15 10:28 Сейчас в теме
Вот я о том же самом думала, но уже много позже. Тогда уже тема перестала быть актуальной, и подходящих баз под рукой, чтобы проверить, не было. Разворачивать стенды было лень ))) А тут Вы написали, и подтвердили мои мысли, так что спасибо большое.
20. M_Volkov 2 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 2 13.01.20 13:45 Сейчас в теме
(21)
Зарегистрировать dll нужной версии в COM+

Это может не обычный пользователь, а с административными правами. И если один пользователь уже работает с базой на одной платформе, а другому пользователю потребуется соединиться с базой на другой платформе, то как?
23. RustamZz 13.01.20 14:34 Сейчас в теме
(22) На одном компьютере несколько пользователей по очереди работают?
24. M_Volkov 2 13.01.20 14:38 Сейчас в теме
(23) Нет, терминал. К тому же одному и тому же пользователю может потребоваться сперва соединение с базой на одной платформе, затем на другой.
25. RustamZz 13.01.20 14:50 Сейчас в теме
(24) Терминал и несколько платформ нужно использовать из этого только одно.
26. M_Volkov 2 13.01.20 14:59 Сейчас в теме
(25) Печально. А другой технологией, например, Веб-сервисом можно Открыть форму существующего объекта в другой базе? (желательно пример)
27. RustamZz 13.01.20 16:12 Сейчас в теме
(26) Веб-сервисом вы может передать данные в формате xml. Форму не получится.
28. M_Volkov 2 13.01.20 17:40 Сейчас в теме
(27) Ну не веб, другими технологиями, только COM? А можно сразу две зарегистрировать dll нужных версий в COM+, и переключаться между ними?
30. M_Volkov 2 13.01.20 18:53 Сейчас в теме
(29) Смотрел эту статью, пробовал. V83.COMConnector с ограниченными возможностями меня не устраивает из-за нехватки функционала. Нужны OLE соединения V83.Application. Они не получились...
31. M_Volkov 2 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 2 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 2 16.01.20 14:41 Сейчас в теме
(32) Поднять версию серверной части нашел как: в СтрокаПодключения к ИмяСервера приписал ":1640". Теперь при Com-соединении получаю ошибку: "Несоответствие версий клиента и сервера 1С:Предприятия".
35. RustamZz 16.01.20 16:53 Сейчас в теме
(34) Правильно называть такое соединение не COM, а OLE. Не соответствие версий, а /regserver отработал?
36. M_Volkov 2 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 2 20.01.20 18:41 Сейчас в теме
(37)
Если нужно несколько версий COM, надо делать через COM+
Это как, чтобы версия платформы подключения была требуемой?
39. RustamZz 21.01.20 09:23 Сейчас в теме
40. M_Volkov 2 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 2 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_" + НомерВерсии);
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Консультант по 1С:Документооборот
Санкт-Петербург
зарплата от 120 000 руб. до 150 000 руб.
Полный день

Программист по 1С:Бухгалтерии
Санкт-Петербург
зарплата от 120 000 руб. до 150 000 руб.
Полный день

Программист по 1С:ЗУП
Санкт-Петербург
зарплата от 120 000 руб. до 150 000 руб.
Полный день

Консультант-аналитик 1С
Москва
зарплата от 100 000 руб. до 150 000 руб.
Полный день

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