COm-соединение. GetObject. Программное получение объекта элемента справочника удаленной базы, его изменение и сохранение в удаленной базе

1. parubetssm 19.07.17 10:49 Сейчас в теме
Стоит задача при создании/изменении физического лица в УПП переносить его в другую базу с другой конфигурацией. Если в УПП допустимо внедрение кода, то во вторую базу - нет. Реализация происходит через COM -соединение

Вопросы переноса физлица решены. Удается создание физлица "в другой базе"

Но уже день не могу никак произвести редактирование существующего в удаленной базе физлица.

Конкретика: не судите строго, не понятен механизм получения объекта физлица в удаленной базе, в которую происходит выгрузка данных при их изменении в УПП. Гуглю и читаю справку целый день.

Ссылку на объект физлица в удаленной базе получить удается...

Но попытки используя GetObject, получить по ней объект приводят к ошибке..

Пробовал так (разные варианты):
//ОбъектФизлицаБазаПолучатель = Соединение.GetObject(СсылкаДляФизлицаРедактируемогоНаПолучателе);
		//ОбъектФизлицаБазаПолучатель = Соединение.ФизическиеЛица.NewObject("","",СсылкаДляФизлицаРедактируемогоНаПолучателе);
		//ОбъектФизлицаБазаПолучатель = Соединение.ПолучитьОбъект(СсылкаДляФизлицаРедактируемогоНаПолучателе);
		//ОбъектФизлицаБазаПолучатель = Соединение.ФизическиеЛица.GetObject(СсылкаДляФизлицаРедактируемогоНаПолучателе);

Лезут ошибки вида "{Форма.Форма.Форма(...)}: Метод объекта не обнаружен"

Пробовал так:
СтруктураОтбора = Соединение.NewObject("Структура", "Ref", СсылкаДляФизлицаРедактируемогоНаПолучателе);
ВыборкаСправочникаФизлица = Соединение.ФизическиеЛица.Выбрать(,,СтруктураОтбора);
ВыборкаСправочникаФизлица.Следующий();
ОбъектФизлицаРедактируемогоНаПолучателе = ВыборкаСправочникаФизлица.ПолучитьОбъект();


Лезет ошибка
"{Форма.Форма.Форма(188)}: Метод объекта не обнаружен (Выбрать)
ВыборкаСправочникаФизлица = Соединение.ФизическиеЛица.Выбрать(,,СтруктураОтбора);"


Подскажите, что я делаю не так? Выбранный путь, вообще, позволит редактировать объекты удаленной базы, или нет?

Справку анализировал. Не судите строго начинающего подмастерья...
Найденные решения
10. r.moschenskiy 23 19.07.17 12:14 Сейчас в теме
(9)Для редактирования через COM нужно также передавать не ссылку, а УИД:
СтрокаУИДФизлицаВИсточнике = Строка(СсылкаФизЛицоИсточник.УникальныйИдентификатор());
УИДНаПолучателе = Соединение.NewObject("УникальныйИдентификатор",СтрокаУИДФизлицаВИсточнике);
СсылкаДляЭлементаНаПолучателе = Соединение.Справочники.ФизическиеЛица.ПолучитьСсылку(УИДНаПолучателе);
ОбъектФизлицаБазаПолучатель = СсылкаДляЭлементаНаПолучателе.ПолучитьОбъект();
mc2; hcooh; +2 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. r.moschenskiy 23 19.07.17 10:54 Сейчас в теме
Может Справочники пропустили?
ВыборкаСправочникаФизлица = Соединение.Справочники.ФизическиеЛица.Выбрать(,,СтруктураОтбора);
4. parubetssm 19.07.17 11:29 Сейчас в теме
(2) Отчитываюсь. поправил так:

//ОбъектФизлицаБазаПолучатель = Соединение.Справочники.ФизическиеЛица.GetObject(СсылкаДляФизлицаРедактируемогоНаПолучателе);
		//ОбъектФизлицаБазаПолучатель = Соединение.Справочники.ФизическиеЛица.ПолучитьОбъект(СсылкаДляФизлицаРедактируемогоНаПолучателе);


Ошибка осталась прежней: Метод не найден...

А вот в части следующего фрагмента кода (в части следующей попытки реализации) произошли изменения
СтруктураОтбора = Соединение.NewObject("Структура");
		СтруктураОтбора.Вставить("Ref", СсылкаДляФизлицаРедактируемогоНаПолучателе);
		ВыборкаСправочникаФизлица = Соединение.Справочники.ФизическиеЛица.Выбрать(,,СтруктураОтбора);
		ВыборкаСправочникаФизлица.Следующий();
		ОбъектФизлицаБазаПолучатель = ВыборкаСправочникаФизлица.ПолучитьОбъект();

Идет другая ошибка (**):
{Форма.Форма.Форма(204)}: Ошибка при вызове метода контекста (Выбрать)
ВыборкаСправочникаФизлица = Соединение.Справочники.ФизическиеЛица.Выбрать(,,СтруктураОтбора);
по причине:
Произошла исключительная ситуация (1C:Enterprise 8.3.7.1845): Недопустимое значение параметра (параметр номер '3')

Структуру пробовал формировать и с ключом "Ссылка", в том числе и так:
[1C-CODE]СтруктураОтбора = Соединение.NewObject("Структура", "Ref", СсылкаДляФизлицаРедактируемогоНаПолучателе);
Ошибка та же, что и (**)...
Структуру неправильно формирую?
3. parubetssm 19.07.17 10:57 Сейчас в теме
Обидно, если на таком поскальзываюсь. Просто уже затык немного. Сейчас попробую
5. r.moschenskiy 23 19.07.17 11:33 Сейчас в теме
А откуда берется СсылкаДляФизлицаРедактируемогоНаПолучателе?
6. r.moschenskiy 23 19.07.17 11:36 Сейчас в теме
Как создается физлицо в другой базе? Можно код?
8. parubetssm 19.07.17 11:59 Сейчас в теме
(6)

УИДФизлицаВИсточнике = СсылкаФизЛицоИсточник.УникальныйИдентификатор();
	СтрокаУИДФизлицаВИсточнике = Строка(УИДФизлицаВИсточнике);
						
	УИДНаПолучателе = Соединение.NewObject("УникальныйИдентификатор",СтрокаУИДФизлицаВИсточнике);
	СсылкаДляЭлементаСоздаваемогоНаПолучателе = Соединение.Справочники.ФизическиеЛица.ПолучитьСсылку(УИДНаПолучателе);
	
	// проверка сущестования физлица в базе-получателе с такой же ссылкой		
	Запрос1 = Соединение.NewObject("Запрос");
				Запрос1.Текст = 
					"ВЫБРАТЬ
					|	ФизическиеЛица.Ссылка КАК Ссылка,
					|	ФизическиеЛица.Наименование
					|ИЗ
					|	Справочник.ФизическиеЛица КАК ФизическиеЛица
					|ГДЕ
					|	ФизическиеЛица.Ссылка = &Ссылка";
			
				Запрос1.УстановитьПараметр("Ссылка", СсылкаДляЭлементаСоздаваемогоНаПолучателе);
			
	РезультатЗапроса1НаПоискФизлицаВПолучателе = Запрос1.Выполнить();
			
	
	если РезультатЗапроса1НаПоискФизлицаВПолучателе.Пустой() тогда
		// создание пока пустого объекта в базе-получателе при отсутствии по месту назначения элемента с заданной ссылкой
		//Тут код создания элемента в базе получателе при отсутствии физлица в базе получателе : Код работает как надо


	иначе
		
		/////////////  Вот тут не могу получить объект существующего в базе источника физлица
		// Код, вызывающий ошибки ранее приведен
		СсылкаДляФизлицаРедактируемогоНаПолучателе = РезультатЗапроса1НаПоискФизлицаВПолучателе.Ссылка;

	КонецЕсли;


Показать
9. parubetssm 19.07.17 12:02 Сейчас в теме
(6) СсылкаФизЛицоИсточник - получается правильная, эта ссылка находится так
СсылкаФизЛицоИсточник = Справочники.ФизическиеЛицаНайтиПоНаименованию("Слотов Разьем Штепселевич");
В дальнейшем способ передачи значения в переменную будет другой. Но пока в этой части все срабатывает как надо...
10. r.moschenskiy 23 19.07.17 12:14 Сейчас в теме
(9)Для редактирования через COM нужно также передавать не ссылку, а УИД:
СтрокаУИДФизлицаВИсточнике = Строка(СсылкаФизЛицоИсточник.УникальныйИдентификатор());
УИДНаПолучателе = Соединение.NewObject("УникальныйИдентификатор",СтрокаУИДФизлицаВИсточнике);
СсылкаДляЭлементаНаПолучателе = Соединение.Справочники.ФизическиеЛица.ПолучитьСсылку(УИДНаПолучателе);
ОбъектФизлицаБазаПолучатель = СсылкаДляЭлементаНаПолучателе.ПолучитьОбъект();
mc2; hcooh; +2 Ответить
16. parubetssm 19.07.17 14:29 Сейчас в теме
Это ужасно: (10) РЕАЛЬНО ПРОКАТЫВАЕТ. Мы конечно звезд с неба не хватаем, но чтоб та-а-а-ак... вляпываться.

Реально пробовал самым первым, пробовал как самое очевидное, пробовал , правда в одном варианте: генерация объекта по ссылке из запроса... Хотя стоило бы проверить еще вариант, когда ссылка берется не из запроса, а после того, как ее сгенерировали по УИД, но это чисто эмоции. Кстати, после того как не пошло, где-то вычитал, что скорее всего в рамках COM надо англоязычный вариант команды применять... А дальше - понеслось... Информации мало, как применить толком непонятно, если хотим с аргументом...Хэх...

По существу ситуация показывает косяки в коде, которые некоторое время назад там присутствовали и которые теперь оказались исправленными. Самое нехорошее, что не знаю в чем они состояли. Неужели не упоминал "Справочники" в цепочке "Соединение.Справочники.ФизическиеЛица"?...

Данным вопросом подчеркнул свою криворукость, и прошу прощения у почтенных джентелеменов за недостойные проявления. Нет мне прощения

Спасибо, r.moschenskiy! Что мучился со мной позорным...
17. prog2019 48 25.10.24 16:12 Сейчас в теме
(10) Какие-то жуткие манипуляции с УИД!
Зачем они нужны?
Прекрасно работает "ВнешняяСсылка.ПолучитьОбъект()"!

					КонтрагентВнеш = ПодключениеБД.Справочники.Контрагенты.НайтиПоРеквизиту("ИНН", ВыборкаУТ.ИНН); 
					КонтрагентВнешОбъект = КонтрагентВнеш.ПолучитьОбъект();
					КонтрагентВнешОбъект.ИндивидуальныйПредприниматель = Истина;
					КонтрагентВнешОбъект.Записать();
7. parubetssm 19.07.17 11:36 Сейчас в теме
Сейчас - сбегаю за кодом. Вообще, делаю так. Мне важно, чтоб УИД на обеих базах совпадали. Я НАХОЖУ УИД ФИЗЛИЦА В БАЗЕ ИСТОЧНИКА ПО ссылке физлица. Передаю в базу получатель Строка(УИД), по ней генерю УИД на базе получателе и создаю ссылку на базе получателе. Как показывает опыт: уиды одинаковы в обеих базах, а ссылки отличны, но на основе Одного и того же УИД в каждой базе создается своя фиксировання ссылка. Т.е. можно говорить о неизменной паре {СсылкаНаБазеИсточнике, СсылкаНаБазеПолучателе} для обеих баз.

На базе получателя физлица создаются только переносом (не ручками), поэтому УИД будет предопределять строго фиксированную ссылку у данного физлица на получателе (ведь я сгенерировал ссылку на основе УИД, а объект создаю с всегда заданной ссылкой).

В коде происходит расчет ссылки в базе получателе с целью:
0) проверить по этой ссылке, создан ли уже объект в базе получателе,
1) при отсутствии объекта в базе получателе использовать данную ссылку для создания данного физлица в базе получателе
2) при существовании объекта в базе для его редактирования

Щас конкретику выложу
11. parubetssm 19.07.17 12:38 Сейчас в теме
Я передаю как раз не ссылку, а строковое представление УИД
12. parubetssm 19.07.17 12:45 Сейчас в теме
Вариант с таким кодом не подходит:

СтруктураОтбора = Соединение.NewObject("Структура");
        СтруктураОтбора.Вставить("Ref", СсылкаДляФизлицаРедактируемогоНаПолучателе);
        ВыборкаСправочникаФизлица = Соединение.Справочники.ФизическиеЛица.Выбрать(,,СтруктураОтбора);
        ВыборкаСправочникаФизлица.Следующий();
        ОбъектФизлицаБазаПолучатель = ВыборкаСправочникаФизлица.ПолучитьОбъект();


Структура отбора может быть сформирована только по полям "Код", "Наименование" или индексируемым полям (ссылка сюда, походу не входит). Поэтому, походу, и ругалось... В базе получателе у физлиц в справочнике поле "Код" отсутствует, а остальные поля не являются уникальными, чтобы вынуть одного конкретного человечка (физлицо). Доп реквизиты создавать не хотелось бы. Менять конфу нельзя тем более (таковы правила игры).

Значит, остается только вариант с GetObject, если я не ошибаюсь....

Блин... второй день.... Да как так!!!...
14. r.moschenskiy 23 19.07.17 12:50 Сейчас в теме
(12)Выборка не нужна, я же написал в (10) как нужно делать.
15. parubetssm 19.07.17 12:52 Сейчас в теме
(14)Прошу прощения, что не отреагировал. Насколько я помню, это мной уже опробировалось самым первым. Сейчас перепроверю...
13. parubetssm 19.07.17 12:49 Сейчас в теме
Граждане, кто применял GetObject по элементу справочника в рамках COm соединения для редактирования этого элемента базы -получателя (удаленной, к которой коннектимся)??
А-а-а-а!!1!

Примеры "около того" имеются в сети, но все не срабатывает именно для этой ситуации... Что делаю не так?
Оставьте свое сообщение

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