8.х Поиск объекта в БД подключенной по COM

Тема в разделе "Отчеты и обработки для "1С:Предприятие 8"", создана пользователем Yury, 9 авг 2012.

  1. TopicStarter Overlay
    Yury
    Offline

    Yury Опытный в 1С

    Регистрация:
    22 дек 2011
    Сообщения:
    355
    Симпатии:
    4
    Баллы:
    29
    Здравствуйте,

    подскажите, как зная значение и тип объекта в одной БД найти такой-же в БД подключенной по COM?
  2. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Приведите пример: для какого типа и что подразумевается под "значение".
  3. TopicStarter Overlay
    Yury
    Offline

    Yury Опытный в 1С

    Регистрация:
    22 дек 2011
    Сообщения:
    355
    Симпатии:
    4
    Баллы:
    29
    Объект может быть любого типа, например, в двух БД есть один и тот же план счетов. Мне нужно подключиться по СОМ из одной БД к другой и выполнить там запрос к регистру с выборкой по счету в иерархии. Параметр для запроса я выставляю в локальной БД..., а надо параметр из подключенной БД. Код здесь не катит, надо ИЕРАРХИЮ.
  4. Draco
    Online

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.644
    Симпатии:
    948
    Баллы:
    204
    Ну как вариант у Вас должны совпадать наименования или коды. Вы передаете параметр из локальной базы, а уже в запросе ище такой же элемент по коду или наименованию.

    Типа у Вас передали ссылку на счет 20

    а в запросе к той базе уже будет написанно

    Где Счет.Наименование =&Счет20

    Дольше конечно будет рабоать, но как вариант.

    Или я Вас неправильно понял
  5. TopicStarter Overlay
    Yury
    Offline

    Yury Опытный в 1С

    Регистрация:
    22 дек 2011
    Сообщения:
    355
    Симпатии:
    4
    Баллы:
    29
    я же выше написал, что нужно. Варианты приведения к простым типам не катят, так как не работает это с "В ИЕРАРХИИ",
  6. Draco
    Online

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.644
    Симпатии:
    948
    Баллы:
    204
    Что мешает вот так запрос написать


    Код:
    Запрос= Новый Запрос;
    
    Запрос.Текст="ВЫБРАТЬ
    | ХозрасчетныйОстаткиИОбороты.Субконто1,
    | ХозрасчетныйОстаткиИОбороты.СуммаОборот
    |ИЗ
    | РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(
    |   ,
    |   ,
    |   ,
    |   ,
    |   Счет В ИЕРАРХИИ
    |    (ВЫБРАТЬ
    |	 Хозрасчетный.Ссылка
    |    ИЗ
    |	 ПланСчетов.Хозрасчетный КАК Хозрасчетный
    |    ГДЕ
    |	 Хозрасчетный.Наименование = &Наименование),
    |   ,
    |   ) КАК ХозрасчетныйОстаткиИОбороты";
    
    
    
    Запрос.УстановитьПараметр("Наименование",СчетИзДругойБазы); 
  7. AlexeyKh
    Offline

    AlexeyKh Опытный в 1С

    Регистрация:
    27 июл 2012
    Сообщения:
    62
    Симпатии:
    0
    Баллы:
    26
    ерунду какую-то пишут все.
    У вас есть СОМ соединение, в этом соединении создаете запрос. в этом же соединении находите нужный вам счет (нати по коду и т.д.)
    и задаете его в параметры запроса. И ваша иерархия отлично работает.
  8. TopicStarter Overlay
    Yury
    Offline

    Yury Опытный в 1С

    Регистрация:
    22 дек 2011
    Сообщения:
    355
    Симпатии:
    4
    Баллы:
    29

    Нет, немного не так. А вот как-то так:

    Код:
     БД = Новый COMObject("V82.COMConnector");
    Попытка
    СоединениеБД = БД.Connect(СтрокаСоединения);
    Исключение
    Предупреждение("База данных не открыта!!!");
    КонецПопытки
    //
    ....
    //
    Запрос = СоединениеБД.NewObject("Запрос");
    
    
    И как в таком случае?

    Так и вопрос-то так звучал как найти объект в БД подключенной по COM........
    Только это пример я привел про счет, а так объект может быть любого типа, заранее неизвестно. Как вызвать нужный менеджер и найти в подключенной БД этот объект который и будет параметром запроса
  9. Draco
    Online

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.644
    Симпатии:
    948
    Баллы:
    204
    Через метаданные
  10. TopicStarter Overlay
    Yury
    Offline

    Yury Опытный в 1С

    Регистрация:
    22 дек 2011
    Сообщения:
    355
    Симпатии:
    4
    Баллы:
    29
    Хорошо, у меня есть ТипЗнч (Значение) и само значение, я знаю, что такое значение, такого же типа есть в подключенной БД. Как его получить, для использования в качестве параметра запроса?
  11. AlexeyKh
    Offline

    AlexeyKh Опытный в 1С

    Регистрация:
    27 июл 2012
    Сообщения:
    62
    Симпатии:
    0
    Баллы:
    26
    Счет=Соединение.ПланыСчетов.БУ.НайтиПоКоду("20,01,1");

    Запрос=Соединение.NewObject("Запрос");
    Запрос.Текст="ВЫБРАТЬ ...";
    Запрос.УстановитьПараметр("Счет",Счет);

    вроде так
  12. vartanet
    Offline

    vartanet Опытный в 1С Команда форума

    Регистрация:
    16 ноя 2010
    Сообщения:
    2.698
    Симпатии:
    15
    Баллы:
    29
    тогда найдите сначала обЪект по коду, а потом подставляйте его в запрос..

    Код:
    ЗапросV8 = V8.NewObject("Запрос");
    ЗапросV8.Текст = "блабла";
    ЗапросV8.УстановитьПараметр("Счет",    V8.ПланыСчетов.Хозрасчетный.НайтиПоКоду("туточки код"));
  13. Draco
    Online

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.644
    Симпатии:
    948
    Баллы:
    204
    ну Вот писал тоже самое в только сразу в запросе


    Код:
    Запрос= Новый Запрос;
    Запрос.Текст="ВЫБРАТЬ
    | ХозрасчетныйОстаткиИОбороты.Субконто1,
    | ХозрасчетныйОстаткиИОбороты.СуммаОборот
    |ИЗ
    | РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(
    |   ,
    |   ,
    |   ,
    |   ,
    |   Счет В ИЕРАРХИИ
    | (ВЫБРАТЬ
    |  Хозрасчетный.Ссылка
    | ИЗ
    |  ПланСчетов.Хозрасчетный КАК Хозрасчетный
    | ГДЕ
    |  Хозрасчетный.Наименование = &Наименование),
    |   ,
    |   ) КАК ХозрасчетныйОстаткиИОбороты";
    
    
    
    Запрос.УстановитьПараметр("Наименование",СчетИзДругойБазы);
    не подошло
  14. AlexeyKh
    Offline

    AlexeyKh Опытный в 1С

    Регистрация:
    27 июл 2012
    Сообщения:
    62
    Симпатии:
    0
    Баллы:
    26
    ну Вот писал тоже самое в только сразу в запросе


    Пользователю скорее всего надо что бы текст запроса был без изменения, он его запускает в локальной базе и в удаленной(удаленных)
    запрос видимо непростой, и вносить в него изменения он не хочет или не может. Да это и не надо если он получит ссылки на (СОМ) объекты в СОМ соединении и использует в параметрах, запрос переделывать не надо.
  15. TopicStarter Overlay
    Yury
    Offline

    Yury Опытный в 1С

    Регистрация:
    22 дек 2011
    Сообщения:
    355
    Симпатии:
    4
    Баллы:
    29
    Все равно не понимаете меня. Вот то что я выделил. По задаче мне тип изначально не известен. Я его могу получить только ТипЗнч(Значение), а что это будет, хз
    Я же не могу написать v8.ТипЗнач (Значение).НайтиПоКоду (...)
  16. vartanet
    Offline

    vartanet Опытный в 1С Команда форума

    Регистрация:
    16 ноя 2010
    Сообщения:
    2.698
    Симпатии:
    15
    Баллы:
    29
    хз.. стандартными средствами никак..

    можно придумать универсальную процедуру, которая в зависимости от типа данных и свойств обЪекта метаданных будет искать обЪект либо по коду, либо по наименованию, либо по номеру и дате, итд.

    ЗЫ.. если бы GUID обЪектов в обоих база совпадал, то можно было бы получить обЪект по GUID..
  17. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Непонятно. Ибо если в теме речь идет о параметрах запроса - то тип параметра вам известен. Опишите задачу полностью.


    Ответьте сначала на вопрос: что в вашем понимании "такое же значение"? (за исключением примитивных типов данных)

    Даю намек, например дано:
    В базе 1:
    ЭлементСправочника1: GUID: "47509862-bd23-471e-a9be-e74259b8a6a1", Наименование: "Элемент1"
    ЭлементСправочника2: GUID: "47509862-bd23-471e-a9be-e74259b8a6a2", Наименование: "Элемент2"

    В базе 2:
    ЭлементСправочника1: GUID: "47509862-bd23-471e-a9be-e74259b8a6a1", Наименование: "Супер пупер Элемент1"
    ЭлементСправочника2: GUID: "47509862-bd23-471e-a9be-e74259b8a6a3", Наименование: "Элемент2"
    Какие из этих элементов "равны"?
  18. TopicStarter Overlay
    Yury
    Offline

    Yury Опытный в 1С

    Регистрация:
    22 дек 2011
    Сообщения:
    355
    Симпатии:
    4
    Баллы:
    29
    На самом деле тип параметра мне не известен. Попробую объяснить. Есть у меня справочник, в котором описаны строки некоего отчета и и параметры для алгоритма их расчета. Естественно что от алгоритма зависит список параметров. Параметры могут быть различного типа.
    Обработка, проходит по справочнику и вычисляет строки отчета, т.е. формирование текста запроса происходит на лету. Когда запрос я выполняю в этой БД, где расположен сам справочник, то все нормально. Если выполняю запрос в подключенной БД, то с простыми типами все нормально, это и понятно, но со ссылочными нет, что тоже понятно :)
    Так вот, когда просили приветсти пример, я привел пример, когда парамерт это счет. В обоих БД одинаковый план счетов. В локальной БД я могу вополнить запрос с условием
    Счет В ИЕРАРХИИ (&Счет), где &Счет является ссылкой на счет или списком ссылок на счета. А к подключенной я так не могу.

    В основном параметрами запросов будут счета и значения субконто. Справочники тоже одинаковые в обоих БД.

    Смотря, что уравнивать, ГУИД или по Наименование.
  19. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Так в этом и есть основной вопрос: что вы уравниваете? Если наименование (или код) - то будет один алгоритм, если GUID, то будет другой.

    Если под тем что "справочники одинаковые" (или планы счетов) подразумевается сравнение элементов по GUID, то можно воспользоваться следующим примером:
    Код:
    ЗапросCOM = Соединение.NewObject("Запрос");
    ЗапросCOM.Текст =
    "ВЫБРАТЬ
    | ХозрасчетныйОбороты.Счет,
    | ХозрасчетныйОбороты.СуммаОборот
    |ИЗ
    | РегистрБухгалтерии.Хозрасчетный.Обороты(&ДатаНачала, &ДатаОкончания, , Счет В ИЕРАРХИИ (&Счет), , , , ) КАК ХозрасчетныйОбороты";
    
    //Простые типы
    ЗапросCOM .УстановитьПараметр("ДатаНачала", Дата(2011, 1, 1));
    ЗапросCOM.УстановитьПараметр("ДатаОкончания", Дата(2011, 12, 31));
    
    //Ссылочный тип
    СсылкаXMLСтрокой = XMLСтрока(<Переменная содержащая значение ПланСчетов.Ссылка в локальной базе>);
    ИмяТипаСтрокой = XMLТип(ТипЗнч(<Переменная содержащая значение ПланСчетов.Ссылка в локальной базе>)).ИмяТипа;
    
    ЗапросCOM.УстановитьПараметр("Счет", Соединение.XMLЗначение(Соединение.ИзXMLТипа(ИмяТипаСтрокой, ""), СсылкаXMLСтрокой));
    
    РезультатCOM = ЗапросCOM.Выполнить();
    


    Если же синхронизация идет по наименованию или по коду - то пример приводили выше.
  20. TopicStarter Overlay
    Yury
    Offline

    Yury Опытный в 1С

    Регистрация:
    22 дек 2011
    Сообщения:
    355
    Симпатии:
    4
    Баллы:
    29
    А обратный процес? Как ссылку возвращенную запросом из другой БД обратить в объект в этой БД?
    Вот по этому же примеру, на примере
    ХозрасчетныйОбороты.Счет
    Только предположить что тип заранее не известен.

Поделиться этой страницей