Как определить имя подключенной базы (ComОбъект)? #713045


#0 by Mikhail Volkov
Раньше подключался только к одной ИБ: подключился, ComОбъект в глобальной переменной, и по мере необходимости беру из той ИБ данные. Теперь возникла необходимость цепляться в разным ИБ. Как определить имя текущей подключенной базы? (СтруктураПодключения или СтрокаПодключения сохранять в отдельной гл. переменной нежелательно)
#1 by DmitrO
Глобальный контекст (Global context) СтрокаСоединенияИнформационнойБазы (InfoBaseConnectionString) Синтаксис: СтрокаСоединенияИнформационнойБазы Возвращаемое значение: Тип: Строка. Описание: Возвращает Строка соединения информационной базы, которую, например, можно использовать для запуска 1С:Предприятия средствами встроенного языка в Automation, Менеджер COM-соединений. Пример результата метода: File="C:1cv8Base". Доступность: Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение.
#2 by Mikhail Volkov
А типа СтруктураПодключения.ИмяИБНаСервере никак? Ну, в принципе ComОбъект.СтрокаСоединенияИнформационнойБазы тоже содержит ИмяИБ
#3 by Mikhail Volkov
А GUID через Com-соединение получить можно? Например, подключился, нашел во внешней базе нужный документ. Как получить его GUID? Да и не хотелось бы все (Организация, Склад) по кодам искать...!?
#4 by Mikhail Volkov
Сообщает: Найден с GUID: COMОбъект !?
#5 by Serginio1
COMОбъект.XMLСтрока(НайденныйДокумент.УникальныйИдентификатор))
#6 by Mikhail Volkov
Спс, а в текст запроса как-то GUID можно вставить, ну чтобы не по коду организации отбор делать?
#7 by hhhh
делаете в организации реквизит строковый Гуид, по нему и делаете отбор.
#8 by Serginio1
COMОбъект.Документы.ПоступлениеТоваровУслуг.ПолучитьСсылку А вообще лучше пользоваться внешними отчетами. Премущества отладка в родной среде
#9 by Mikhail Volkov
У меня такая конструкция сработала: Как это написать в запросе? Вместо:     |    И ПоступлениеТоваровУслуг.Организация.Код = &ОрганизацияКод";
#10 by Mikhail Volkov
Дык, надо подставлять в отбор Организация не текущей базы, а подключенной базы COMОбъект! У меня есть такая функция: Запрос.УстановитьПараметр("Организация", НайтиЭлементСправочникаCOMОбъект(Организация, "Организации")); Заработало... Как насчет , нельзя как-то покороче?
#11 by Mikhail Volkov
А что там про внешние отчеты? Чувствую, что придется мне скоро всякие сверки с партнером писать...
#12 by Serginio1
А какие у тебя проблемы с внешними отчетами?
#13 by Mikhail Volkov
С внешними отчетами? Никаких. А как они связаны с COM-Объектами? С COM-Объектами как-то не приходилось работать, думаю нельзя ли их использовать для обмена баз? Обычно использую УниверсальныйОбменДаннымиXML. И сейчас также планировал поступить: ответный документ партнера создан (обновлен) в нашей базе, далее фоновое задание сделает обмен с базой партнера... А сейчас думаю, а нельзя ли сразу после создания (обновления) этого документа предать его в базу партнера? Или вообще его не создавать в своей базе, а создавать (обновлять) прямо в базе партнера, подключенной как COM-Объект? Есть отработанные схемы обмена через COM-Объект, где про них почитать?
#14 by Mikhail Volkov
+ Создавать, используя механизм заполнения на основании, но не записывать
#15 by Serginio1
Я тебе ссылочку в 8 давал. Создаешь внешнийотчет из базы по COM. Вызываешь  метод модуля отчета помеченного как экспорт. Премущества это отладка и простота написания, т.к. отчет вызывается на стороне вызываемой базы.   Если очень хочется онлайн, то проще использовать вэб сервисы, а не ком. Или напрямую писать используя SQL.
#16 by Mikhail Volkov
По ссылке в ничего не понял... Он-лайн не желателен - зачем напрягать пользователя. Когда начинаешь настраивать обмен, 1-м пунктом идет "Есть возможность подключиться к ИБ-приемнику" - это COM? (ни когда не пользовался)
#17 by Serginio1
А что там непонятно? Там все расписано, правда на C#. Вообще то при онлайне пользователь вообще не напрягается, т.к. обмен происходит после записи документа. То, что ты написал в 13.
#18 by Mikhail Volkov
Суть? Через COM-соединение в ИБ-приемнике запускается внешняя обработка подобная УниверсальныйОбменДаннымиXML, которая делает внеочередной обмен (не дожидаясь расписания)?
#19 by Serginio1
Суть в том, что при загрузке через COM если соединение не кэшируется приходится подымать метаданные и более долгая начальная загрузка. При обмене через Веб сервис или http-сервис. Сервис уже запущен и метаданные загружены. Единственно, что для вэб сервиса нужно пройти установкуПараметровСеанса http сервисы должны быть еще легче
#20 by Mikhail Volkov
Да, но еще кроме переноса еще возникает вопрос конвертации. Для УниверсальныйОбменДаннымиXML у меня правила обмена написаны. И все же повторюсь: Когда начинаешь настраивать обмен, 1-м пунктом идет "Есть возможность подключиться к ИБ-приемнику" - это COM?
#21 by Serginio1
А кто тебе мешает из Вэб сервиса вызвать твою внешнюю обработку?
#22 by Mikhail Volkov
Ну, не знаю, не пробовал... остановлюсь на файловом обмене (как и планировал). Тем более, сегодня "Есть возможность подключиться к ИБ-приемнику", а завтра - может и не быть...
#23 by Mikhail Volkov
Понадобилось получать не только ссылки документов из COM присоединенной базы, но и их табличные части: ТЧ выгружаю в ТЗ, далее получаю ее посредством COMОбъект.ЗначениеВСтрокуВнутр/ЗначениеИзСтрокиВнутр. Для примитивных типов сработало, а для справочников - нет. Ну мне сами справочники не нужны, только их GUID-ы. Вставил цикл их замены на: COMОбъект.XMLСтрока(СтрокаТЗ.ЭлСправочника.Ссылка) - не работает!? И так тоже: COMОбъект.XMLСтрока(СтрокаТЗ.ЭлСправочника.Ссылка.УникальныйИдентификатор) Что ни так?
#24 by Mikhail Volkov
+ СсылкаCom - это НайденныйДокумент в
#25 by Mikhail Volkov
Оказалось тип колонок не тот, новые пришлось добавить: Но только коряво все как-то, покрасивши нет решения?
#26 by Mikhail Volkov
А еще не знаю как грамотно передавать Перечисления в присоединенную базу через COM-соединение. В простейшем случае я делаю так: Коряво, да? А если что-то посложнее, например, ВидОперации, которые у каждого типа документов свой, и значений несколько?
#27 by Трик
если имена совпадают есть воможность сконвертировать погугли.
#28 by Serginio1
#29 by Torquader
НИкто не мешает создать переменную и один раз в неё установить значение, а потом передавать её. Если же делается один раз, то как бы не передавалась - скорость работы будет зависеть от других мест.
#30 by Torquader
+ Имя базы лучше всего по строке подключения определять.
#31 by Mikhail Volkov
COMОбъект - глобальная переменная, содержит COM-соединение присоединенной базы. ОбъектCom - объект, создаваемый в Com-базе, которому надо установить реквизит типа ПеречислениеСсылка. Меня пугает, что приходится писать длинные конструкции... или это нормально, просто непривычно? Не очень понял, что предлагает автор: все возможные перечисления собрать в некий справочник, а через COM-соединение передавать коды нужных тебе перечислений?
#32 by Torquader
Просто, с перечислениями есть "засада" - у них нет GUID-а. Если нам хочется работать с данными одной базы в другой базе или другой программе, то мы легко можем хранить вместо самого объекта строковое представление GUID-а. То есть, получив какое-то значение из "далёкой" базы, мы сначала проверяем его тип - если он не ComObject, то у нас строка,дата, число или булево - получается значение, которым легко оперировать. Если мы получаем ComObject, то у всех объектов в базе, кроме перечисления, есть метод УникальныйИдентификатор, который возвращает GUID (который, правда, всё равно ComObject), но из него легко сделать строку ComBase.String(GuidFromFarBase) и ей уже можно прекрасно оперировать. С перечислением сложнее, нужно узнать идентификатор перечисления, а потом получить идентификатор значения перечисления (если мы просто приведём к строке, то получим представление) - соответственно, очень много операций - если все значения перечислений где-то есть, то мы просто ищем значение в этом "списке" и получаем его "представление" для нас. P.S. честно говоря не читал, но другого смысла в использовании справочника всех перечислений не вижу.
#33 by Mikhail Volkov
В пример, я нашел Документ в COM-базе, и копирую его в свою базу. При этом использую такую длинную конструкцию: ComBase.String(GuidFromFarBase) - вижу впервые, как это применить для моего примера?
#34 by Mikhail Volkov
Да, у них нет GUID-а, но есть Имя, а у значения вроде Индекс - их можно передать в COM-базу. Вот только как с их помощью задать нужное Перечисление?
#35 by Serginio1
ну и вычислить. Но я являюсь сторонником внешних отчетов вызывая метод из них передавая нужные параметры и получая ответ например ввиде тз.
#36 by Mikhail Volkov
+ Например, для простых справочников: Валюты, КлассификаторЕдиницИзмерения, и т.п. GUID-ы не использую: ОбъектCom.Валюта = COMОбъект.Справочники[ТипОбъекта].НайтиПоКоду(Ссылка.Код); (если имена совпадают)
#37 by Serginio1
А так работает ? Ставка=COMОбъект.Перечисления.СтавкаНДС["НДС18"];
#38 by Serginio1
Ну а имя перечисления ИмяПеречисления = СсылкаНаПеречисление.Метаданные.Имя;
#39 by Mikhail Volkov
Вроде должно, проверю... В итоге: СтавкаНДС = COMОбъект.Перечисления[ИмяПеречисления][1]; - если индекс значения НДС18 = 1 (или 0?)?
#40 by Serginio1
39
#41 by Mikhail Volkov
Скорее, так: СтавкаНДС = COMОбъект.Перечисления[ИмяПеречисления]; или так СтавкаНДС = COMОбъект.Перечисления[1]; - пробовать буду... вообще-то в Альфа-Авто Ставки НДС - справочник, но ИмяПеречисления или его Индекс в типовой УПП/КА мне будет известен заранее. Спс за ссылку - что-то начал понимать...
#42 by Defender aka LINN
Что мешает КД использовать?
#43 by Mikhail Volkov
Первоначально так и задумывалось: в нашей базе создали реализацию "близкому" партнеру (в одной сетке). По нему автоматом формируется ответный документ поступления. Номер по COM-соединению беру из базы партнера. Чтобы его не заняли, надо его застолбить там - создаю там пустой документ, его номер и GUID присваиваю ответному документу в своей базе. После этого посылаю сигнал фоновому заданию, чтобы сделал внеочередной обмен (желательно только этим документом)... Как-то сложно все это, вот пробую сразу заполнить ответный документ через COM-соединение.
#44 by Mikhail Volkov
+ Может есть более простые решения этой задачи?
#45 by Defender aka LINN
Ты же в курсе, что обработок, которые использую правила, больше, чем 1, но меньше, чем 3? Можно обмен через планы обмена и правила из КД настроить, все тебе будет.
#46 by Mikhail Volkov
Это все есть, и по ночам выполняется через УниверсальныйОбменДаннымиXML около 2-3 часов. Но обмен с партнером надо сделать быстро (3-5 минут) одним или списком из (до) 5-7 документов. Как задать этот список для обработки УниверсальныйОбменДаннымиXML я не нашел. :(
#47 by Torquader
Чего-то мне кажется, что OleБаза.Перечисления[ИмяПеречисления][ЗначениеПеречисления] должно работать.
#48 by Defender aka LINN
Там какбе отборы есть
#49 by Mikhail Volkov
Например, срочно понадобилось обменяться цепочкой документов: заказ покупателя, заказ поставщику, реализация, поступление, возврат от покупателя, возврат поставщику... (возможны еще корректировки) - е все по одному документу. Проблематично это отбором делать.
#50 by ДенисЧ
Если тебе это проблематично, то может, поменяешь профессию? В дворники не предлагаю, там занято, может, в два раза больше пойдёшь зарабатывать?
#51 by Serginio1
Я использую обмен через схему загружаемой базы. Это аналог КД ,но так как использыется Схема загружаемой базы то при загрузке используется СериализаторXDTO, а при выгрузке создаются процедуры записи, которые записывают ОбъектXDTO и которые легко можно модифицировать. Скорость обмена очень быстрая.
#52 by Mikhail Volkov
Схемы аналогичные КД в принципе инертны - в процессе обмена могут изменить документ, если выгружается более одного документа. И чем больше этот список, тем больше вероятность, что выгрузится уже неактуальная версия документа. По по COM-соединению создание/обновление COM-документа происходит сразу после его записи (в моей схеме). В общем с заполнением реквизитов шапки и табличной части COM-документа разобрался. Вот только не проводится!? На ДокументCom.Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Неоперативный); пишет ошибку: Ошибка при вызове метода контекста (Записать): Произошла исключительная ситуация (1C:Enterprise 8.2.19.90): Несоответствие типов (параметр номер '1') В процедуре ОбработкаПроведения COM-базы поставил точки останова - никакой реакции!? Как отлаживать проведение COM-документа?
#53 by Mikhail Volkov
+ Хотя в самой COM-базе вручную проводится без проблем!?
#54 by Mikhail Volkov
Разобрался, так надо: ДокументCom.Записать(COMОбъект.РежимЗаписиДокумента.Проведение);
#55 by Serginio1
Необязательно. Ты можешь используя COM записывать через СериализаторXDTO, а можешь и в оффлайне, а можешь через Вэб сервисы. Непринципиально, но универсально.
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С