COm-соединение. GetObject. Программное получение объекта элемента справочника удаленной базы, его изменение и сохранение в удаленной базе
Стоит задача при создании/изменении физического лица в УПП переносить его в другую базу с другой конфигурацией. Если в УПП допустимо внедрение кода, то во вторую базу - нет. Реализация происходит через COM -соединение
Вопросы переноса физлица решены. Удается создание физлица "в другой базе"
Но уже день не могу никак произвести редактирование существующего в удаленной базе физлица.
Конкретика: не судите строго, не понятен механизм получения объекта физлица в удаленной базе, в которую происходит выгрузка данных при их изменении в УПП. Гуглю и читаю справку целый день.
Ссылку на объект физлица в удаленной базе получить удается...
Но попытки используя GetObject, получить по ней объект приводят к ошибке..
Пробовал так (разные варианты):
Лезут ошибки вида "{Форма.Форма.Форма(...)}: Метод объекта не обнаружен"
Пробовал так:
Лезет ошибка
Подскажите, что я делаю не так? Выбранный путь, вообще, позволит редактировать объекты удаленной базы, или нет?
Справку анализировал. Не судите строго начинающего подмастерья...
Вопросы переноса физлица решены. Удается создание физлица "в другой базе"
Но уже день не могу никак произвести редактирование существующего в удаленной базе физлица.
Конкретика: не судите строго, не понятен механизм получения объекта физлица в удаленной базе, в которую происходит выгрузка данных при их изменении в УПП. Гуглю и читаю справку целый день.
Ссылку на объект физлица в удаленной базе получить удается...
Но попытки используя GetObject, получить по ней объект приводят к ошибке..
Пробовал так (разные варианты):
//ОбъектФизлицаБазаПолучатель = Соединение.GetObject(СсылкаДляФизлицаРедактируемогоНаПолучателе);
//ОбъектФизлицаБазаПолучатель = Соединение.ФизическиеЛица.NewObject("","",СсылкаДляФизлицаРедактируемогоНаПолучателе);
//ОбъектФизлицаБазаПолучатель = Соединение.ПолучитьОбъект(СсылкаДляФизлицаРедактируемогоНаПолучателе);
//ОбъектФизлицаБазаПолучатель = Соединение.ФизическиеЛица.GetObject(СсылкаДляФизлицаРедактируемогоНаПолучателе);
Лезут ошибки вида "{Форма.Форма.Форма(...)}: Метод объекта не обнаружен"
Пробовал так:
СтруктураОтбора = Соединение.NewObject("Структура", "Ref", СсылкаДляФизлицаРедактируемогоНаПолучателе);
ВыборкаСправочникаФизлица = Соединение.ФизическиеЛица.Выбрать(,,СтруктураОтбора);
ВыборкаСправочникаФизлица.Следующий();
ОбъектФизлицаРедактируемогоНаПолучателе = ВыборкаСправочникаФизлица.ПолучитьОбъект();
Лезет ошибка
"{Форма.Форма.Форма(188)}: Метод объекта не обнаружен (Выбрать)
ВыборкаСправочникаФизлица = Соединение.ФизическиеЛица.Выбрать(,,СтруктураОтбора);"
ВыборкаСправочникаФизлица = Соединение.ФизическиеЛица.Выбрать(,,СтруктураОтбора);"
Подскажите, что я делаю не так? Выбранный путь, вообще, позволит редактировать объекты удаленной базы, или нет?
Справку анализировал. Не судите строго начинающего подмастерья...
Найденные решения
(9)Для редактирования через COM нужно также передавать не ссылку, а УИД:
СтрокаУИДФизлицаВИсточнике = Строка(СсылкаФизЛицоИсточник.УникальныйИдентификатор());
УИДНаПолучателе = Соединение.NewObject("УникальныйИдентификатор",СтрокаУИДФизлицаВИсточнике);
СсылкаДляЭлементаНаПолучателе = Соединение.Справочники.ФизическиеЛица.ПолучитьСсылку(УИДНаПолучателе);
ОбъектФизлицаБазаПолучатель = СсылкаДляЭлементаНаПолучателе.ПолучитьОбъект();
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(2) Отчитываюсь. поправил так:
Ошибка осталась прежней: Метод не найден...
А вот в части следующего фрагмента кода (в части следующей попытки реализации) произошли изменения
Идет другая ошибка (**):
Структуру пробовал формировать и с ключом "Ссылка", в том числе и так:
[1C-CODE]СтруктураОтбора = Соединение.NewObject("Структура", "Ref", СсылкаДляФизлицаРедактируемогоНаПолучателе);
Ошибка та же, что и (**)...
Структуру неправильно формирую?
//ОбъектФизлицаБазаПолучатель = Соединение.Справочники.ФизическиеЛица.GetObject(СсылкаДляФизлицаРедактируемогоНаПолучателе);
//ОбъектФизлицаБазаПолучатель = Соединение.Справочники.ФизическиеЛица.ПолучитьОбъект(СсылкаДляФизлицаРедактируемогоНаПолучателе);
Ошибка осталась прежней: Метод не найден...
А вот в части следующего фрагмента кода (в части следующей попытки реализации) произошли изменения
СтруктураОтбора = Соединение.NewObject("Структура");
СтруктураОтбора.Вставить("Ref", СсылкаДляФизлицаРедактируемогоНаПолучателе);
ВыборкаСправочникаФизлица = Соединение.Справочники.ФизическиеЛица.Выбрать(,,СтруктураОтбора);
ВыборкаСправочникаФизлица.Следующий();
ОбъектФизлицаБазаПолучатель = ВыборкаСправочникаФизлица.ПолучитьОбъект();
Идет другая ошибка (**):
{Форма.Форма.Форма(204)}: Ошибка при вызове метода контекста (Выбрать)
ВыборкаСправочникаФизлица = Соединение.Справочники.ФизическиеЛица.Выбрать(,,СтруктураОтбора);
по причине:
Произошла исключительная ситуация (1C:Enterprise 8.3.7.1845): Недопустимое значение параметра (параметр номер '3')
ВыборкаСправочникаФизлица = Соединение.Справочники.ФизическиеЛица.Выбрать(,,СтруктураОтбора);
по причине:
Произошла исключительная ситуация (1C:Enterprise 8.3.7.1845): Недопустимое значение параметра (параметр номер '3')
Структуру пробовал формировать и с ключом "Ссылка", в том числе и так:
[1C-CODE]СтруктураОтбора = Соединение.NewObject("Структура", "Ref", СсылкаДляФизлицаРедактируемогоНаПолучателе);
Ошибка та же, что и (**)...
Структуру неправильно формирую?
(6)
УИДФизлицаВИсточнике = СсылкаФизЛицоИсточник.УникальныйИдентификатор();
СтрокаУИДФизлицаВИсточнике = Строка(УИДФизлицаВИсточнике);
УИДНаПолучателе = Соединение.NewObject("УникальныйИдентификатор",СтрокаУИДФизлицаВИсточнике);
СсылкаДляЭлементаСоздаваемогоНаПолучателе = Соединение.Справочники.ФизическиеЛица.ПолучитьСсылку(УИДНаПолучателе);
// проверка сущестования физлица в базе-получателе с такой же ссылкой
Запрос1 = Соединение.NewObject("Запрос");
Запрос1.Текст =
"ВЫБРАТЬ
| ФизическиеЛица.Ссылка КАК Ссылка,
| ФизическиеЛица.Наименование
|ИЗ
| Справочник.ФизическиеЛица КАК ФизическиеЛица
|ГДЕ
| ФизическиеЛица.Ссылка = &Ссылка";
Запрос1.УстановитьПараметр("Ссылка", СсылкаДляЭлементаСоздаваемогоНаПолучателе);
РезультатЗапроса1НаПоискФизлицаВПолучателе = Запрос1.Выполнить();
если РезультатЗапроса1НаПоискФизлицаВПолучателе.Пустой() тогда
// создание пока пустого объекта в базе-получателе при отсутствии по месту назначения элемента с заданной ссылкой
//Тут код создания элемента в базе получателе при отсутствии физлица в базе получателе : Код работает как надо
иначе
///////////// Вот тут не могу получить объект существующего в базе источника физлица
// Код, вызывающий ошибки ранее приведен
СсылкаДляФизлицаРедактируемогоНаПолучателе = РезультатЗапроса1НаПоискФизлицаВПолучателе.Ссылка;
КонецЕсли;
Показать
(6) СсылкаФизЛицоИсточник - получается правильная, эта ссылка находится так
СсылкаФизЛицоИсточник = Справочники.ФизическиеЛицаНайтиПоНаименованию("Слотов Разьем Штепселевич");
В дальнейшем способ передачи значения в переменную будет другой. Но пока в этой части все срабатывает как надо...
СсылкаФизЛицоИсточник = Справочники.ФизическиеЛицаНайтиПоНаименованию("Слотов Разьем Штепселевич");
В дальнейшем способ передачи значения в переменную будет другой. Но пока в этой части все срабатывает как надо...
(9)Для редактирования через COM нужно также передавать не ссылку, а УИД:
СтрокаУИДФизлицаВИсточнике = Строка(СсылкаФизЛицоИсточник.УникальныйИдентификатор());
УИДНаПолучателе = Соединение.NewObject("УникальныйИдентификатор",СтрокаУИДФизлицаВИсточнике);
СсылкаДляЭлементаНаПолучателе = Соединение.Справочники.ФизическиеЛица.ПолучитьСсылку(УИДНаПолучателе);
ОбъектФизлицаБазаПолучатель = СсылкаДляЭлементаНаПолучателе.ПолучитьОбъект();
Это ужасно: (10) РЕАЛЬНО ПРОКАТЫВАЕТ. Мы конечно звезд с неба не хватаем, но чтоб та-а-а-ак... вляпываться.
Реально пробовал самым первым, пробовал как самое очевидное, пробовал , правда в одном варианте: генерация объекта по ссылке из запроса... Хотя стоило бы проверить еще вариант, когда ссылка берется не из запроса, а после того, как ее сгенерировали по УИД, но это чисто эмоции. Кстати, после того как не пошло, где-то вычитал, что скорее всего в рамках COM надо англоязычный вариант команды применять... А дальше - понеслось... Информации мало, как применить толком непонятно, если хотим с аргументом...Хэх...
По существу ситуация показывает косяки в коде, которые некоторое время назад там присутствовали и которые теперь оказались исправленными. Самое нехорошее, что не знаю в чем они состояли. Неужели не упоминал "Справочники" в цепочке "Соединение.Справочники.ФизическиеЛица"?...
Данным вопросом подчеркнул свою криворукость, и прошу прощения у почтенных джентелеменов за недостойные проявления. Нет мне прощения
Спасибо, r.moschenskiy! Что мучился со мной позорным...
Реально пробовал самым первым, пробовал как самое очевидное, пробовал , правда в одном варианте: генерация объекта по ссылке из запроса... Хотя стоило бы проверить еще вариант, когда ссылка берется не из запроса, а после того, как ее сгенерировали по УИД, но это чисто эмоции. Кстати, после того как не пошло, где-то вычитал, что скорее всего в рамках COM надо англоязычный вариант команды применять... А дальше - понеслось... Информации мало, как применить толком непонятно, если хотим с аргументом...Хэх...
По существу ситуация показывает косяки в коде, которые некоторое время назад там присутствовали и которые теперь оказались исправленными. Самое нехорошее, что не знаю в чем они состояли. Неужели не упоминал "Справочники" в цепочке "Соединение.Справочники.ФизическиеЛица"?...
Данным вопросом подчеркнул свою криворукость, и прошу прощения у почтенных джентелеменов за недостойные проявления. Нет мне прощения
Спасибо, r.moschenskiy! Что мучился со мной позорным...
(10) Какие-то жуткие манипуляции с УИД!
Зачем они нужны?
Прекрасно работает "ВнешняяСсылка.ПолучитьОбъект()"!
Зачем они нужны?
Прекрасно работает "ВнешняяСсылка.ПолучитьОбъект()"!
КонтрагентВнеш = ПодключениеБД.Справочники.Контрагенты.НайтиПоРеквизиту("ИНН", ВыборкаУТ.ИНН);
КонтрагентВнешОбъект = КонтрагентВнеш.ПолучитьОбъект();
КонтрагентВнешОбъект.ИндивидуальныйПредприниматель = Истина;
КонтрагентВнешОбъект.Записать();
Сейчас - сбегаю за кодом. Вообще, делаю так. Мне важно, чтоб УИД на обеих базах совпадали. Я НАХОЖУ УИД ФИЗЛИЦА В БАЗЕ ИСТОЧНИКА ПО ссылке физлица. Передаю в базу получатель Строка(УИД), по ней генерю УИД на базе получателе и создаю ссылку на базе получателе. Как показывает опыт: уиды одинаковы в обеих базах, а ссылки отличны, но на основе Одного и того же УИД в каждой базе создается своя фиксировання ссылка. Т.е. можно говорить о неизменной паре {СсылкаНаБазеИсточнике, СсылкаНаБазеПолучателе} для обеих баз.
На базе получателя физлица создаются только переносом (не ручками), поэтому УИД будет предопределять строго фиксированную ссылку у данного физлица на получателе (ведь я сгенерировал ссылку на основе УИД, а объект создаю с всегда заданной ссылкой).
В коде происходит расчет ссылки в базе получателе с целью:
0) проверить по этой ссылке, создан ли уже объект в базе получателе,
1) при отсутствии объекта в базе получателе использовать данную ссылку для создания данного физлица в базе получателе
2) при существовании объекта в базе для его редактирования
Щас конкретику выложу
На базе получателя физлица создаются только переносом (не ручками), поэтому УИД будет предопределять строго фиксированную ссылку у данного физлица на получателе (ведь я сгенерировал ссылку на основе УИД, а объект создаю с всегда заданной ссылкой).
В коде происходит расчет ссылки в базе получателе с целью:
0) проверить по этой ссылке, создан ли уже объект в базе получателе,
1) при отсутствии объекта в базе получателе использовать данную ссылку для создания данного физлица в базе получателе
2) при существовании объекта в базе для его редактирования
Щас конкретику выложу
Вариант с таким кодом не подходит:
Структура отбора может быть сформирована только по полям "Код", "Наименование" или индексируемым полям (ссылка сюда, походу не входит). Поэтому, походу, и ругалось... В базе получателе у физлиц в справочнике поле "Код" отсутствует, а остальные поля не являются уникальными, чтобы вынуть одного конкретного человечка (физлицо). Доп реквизиты создавать не хотелось бы. Менять конфу нельзя тем более (таковы правила игры).
Значит, остается только вариант с GetObject, если я не ошибаюсь....
Блин... второй день.... Да как так!!!...
СтруктураОтбора = Соединение.NewObject("Структура");
СтруктураОтбора.Вставить("Ref", СсылкаДляФизлицаРедактируемогоНаПолучателе);
ВыборкаСправочникаФизлица = Соединение.Справочники.ФизическиеЛица.Выбрать(,,СтруктураОтбора);
ВыборкаСправочникаФизлица.Следующий();
ОбъектФизлицаБазаПолучатель = ВыборкаСправочникаФизлица.ПолучитьОбъект();
Структура отбора может быть сформирована только по полям "Код", "Наименование" или индексируемым полям (ссылка сюда, походу не входит). Поэтому, походу, и ругалось... В базе получателе у физлиц в справочнике поле "Код" отсутствует, а остальные поля не являются уникальными, чтобы вынуть одного конкретного человечка (физлицо). Доп реквизиты создавать не хотелось бы. Менять конфу нельзя тем более (таковы правила игры).
Значит, остается только вариант с GetObject, если я не ошибаюсь....
Блин... второй день.... Да как так!!!...
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот