8.х 1с83 запрос через com соединение

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем АртемБууууу, 21 ноя 2019.

  1. TopicStarter Overlay
    АртемБууууу
    Offline

    АртемБууууу Опытный в 1С

    Регистрация:
    30 авг 2017
    Сообщения:
    199
    Симпатии:
    1
    Баллы:
    29
    Добрый день, Дорогие Форумчане!
    Столкнулся с задачей: необходимо установить подключение к базе через com соединение и создать новый документ - с этим проблем нет.
    Есть проблема с заполнением двух реквизитов этого документа, для того, чтобы их заполнить необходимо выполнить запрос к подключаемой базе, чтобы выбрать там сотрудника по реквизиту справочника "физическое лицо", ниже привожу код.
    Скажите, что делаю не так и как правильно выполнить такой запрос и его обработать?
    Код:
    ЗапросВ = КомСоединение.NewObject("Запрос");
        ЗапросВ .Текст = "ВЫБРАТЬ
        |Сотрудники.Представление КАК Сотрудник,
        |Сотрудники.ФизическоеЛицо.Наименование КАК ФизическоеЛицо,
        |Сотрудники.СтруктураКомпании.Представление КАК СтруктураКомпании
        |ИЗ
        |Справочник.Сотрудники КАК Сотрудники
        |ГДЕ
        |НЕ Сотрудники.СтруктураКомпании = ЗНАЧЕНИЕ(Справочник.СтруктураКомпании.ПустаяСсылка)
        |И Сотрудники.ФизическоеЛицо = &ФизическоеЛицо";
       
        ФизЛицо = КомСоединение.Справочники.ФизическиеЛица.НайтиПоНаименованию(СтруктураДанных.Сотрудник);
        ЗапросВ.УстановитьПараметр("ФизическоеЛицо", ФизЛицо);
       
        com_Результат     = ЗапросВ.Выполнить(); // COM объект   
        com_ТЗ_Сотрудники = com_Результат.Выгрузить(); // COM объект
       
        // Получаем таблицу значений из COM-объекта
        // COMОбъект в -> строку
        // Запишем COMОбъект в строку на стороне базы-источника
        стр_ТЗ_Сотрудники = КомСоединение.ЗначениеВСтрокуВнутр(com_ТЗ_Сотрудники);
    
        // получим таблицу значений из строки
        ТЗ_Сотрудники = ЗначениеИзСтрокиВнутр(стр_ТЗ_Сотрудники);
    
        МенеджерДокумента = КомСоединение.Документы.ЗаписьВРНФактическиеОтпуска;
        КомСоединение.УстановитьБезопасныйРежим(Ложь);
        КомСоединение.УстановитьПривилегированныйРежим(Истина);
    
        НовДок      = МенеджерДокумента.СоздатьДокумент();
        НовДок.Дата = СтруктураДанных.Период;
        НовДок.Сотрудник...
    Последнее редактирование: 21 ноя 2019
  2. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.890
    Симпатии:
    1.030
    Баллы:
    204
    Прербразование в строку и обратно не нужно. Выберите как обычно ссылку на сотрудника и ее присвойте куда вам нужно.
  3. TopicStarter Overlay
    АртемБууууу
    Offline

    АртемБууууу Опытный в 1С

    Регистрация:
    30 авг 2017
    Сообщения:
    199
    Симпатии:
    1
    Баллы:
    29
    так вот и не могу разобраться как в этом случае это сделать
  4. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.890
    Симпатии:
    1.030
    Баллы:
    204
    Говорю же: обычно. Не нужно ничего мудрить.
  5. TopicStarter Overlay
    АртемБууууу
    Offline

    АртемБууууу Опытный в 1С

    Регистрация:
    30 авг 2017
    Сообщения:
    199
    Симпатии:
    1
    Баллы:
    29
    а как не мудрить, если мне надо передать фио ФизЛица из локальной базы в подключаемую для выполнения запроса
    я же не могу написать Запрос.УстановитьПараметр("ФизЛицо", Источник.ФизЛицо);
  6. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.890
    Симпатии:
    1.030
    Баллы:
    204
    Судя по

    Код:
    ......
    ФизЛицо = КомСоединение.Справочники.ФизическиеЛица.НайтиПоНаименованию(СтруктураДанных.Сотрудник);
    ЗапросВ.УстановитьПараметр("ФизическоеЛицо", ФизЛицо);
    .....
    
    на этот вопрос вы нашли решение.

    Ищите в удаленной базе ФизЛицо по Источник.ФизЛицо.Наименование, либо, если GUID-ы совпадают, то по нему.
  7. TopicStarter Overlay
    АртемБууууу
    Offline

    АртемБууууу Опытный в 1С

    Регистрация:
    30 авг 2017
    Сообщения:
    199
    Симпатии:
    1
    Баллы:
    29
    так заработало:

    Код:
    //выбираем сотрудника
        ЗапросВ = КомСоединение.NewObject("Запрос");
        ЗапросВ.Текст = "
        |ВЫБРАТЬ первые 1
        //для окумента только один сотрудник нужен
        |Сотрудники.Ссылка КАК Сотрудник
        |ИЗ
        |Справочник.Сотрудники КАК Сотрудники
        |ГДЕ
        |НЕ Сотрудники.СтруктураКомпании = ЗНАЧЕНИЕ(Справочник.СтруктураКомпании.ПустаяСсылка)
        |И Сотрудники.ФизическоеЛицо.Наименование = &ФизическоеЛицо
        |И Сотрудники.ПометкаУдаления = ЛОЖЬ
        |";
      
        ЗапросВ.УстановитьПараметр("ФизическоеЛицо", СтруктураДанных.Сотрудник.Наименование);
      
        com_Результат     = ЗапросВ.Выполнить().Выбрать(); // COM объект  
        Если com_Результат.следующий() Тогда
            //нашли сотрудника
            com_ТЗ_Сотрудники = com_Результат.Сотрудник; // COM объект
        Иначе
            //соответственно не нашли
            com_ТЗ_Сотрудники = Неопределено;
        КонецЕсли;
    
  8. Raideres
    Offline

    Raideres Опытный в 1С

    Регистрация:
    9 фев 2016
    Сообщения:
    548
    Симпатии:
    1
    Баллы:
    29
    а если у вас сотрудники с одинаковым наименованием или у сотрудника в наименование пробелы есть
  9. TopicStarter Overlay
    АртемБууууу
    Offline

    АртемБууууу Опытный в 1С

    Регистрация:
    30 авг 2017
    Сообщения:
    199
    Симпатии:
    1
    Баллы:
    29
    что посоветуете с этом случае?
  10. Raideres
    Offline

    Raideres Опытный в 1С

    Регистрация:
    9 фев 2016
    Сообщения:
    548
    Симпатии:
    1
    Баллы:
    29
    обмен одноразовый? если нет то мб стоит сотруднику присвоить реквизит код.
    в источнике это будет код сотрудника а в приемнике ваш реквизит для поиска.
    ну или еще по чему то проверку сделать
  11. TopicStarter Overlay
    АртемБууууу
    Offline

    АртемБууууу Опытный в 1С

    Регистрация:
    30 авг 2017
    Сообщения:
    199
    Симпатии:
    1
    Баллы:
    29
    обмен постоянный, при записи в базе источнике в РН

    спасибо, буду думать