Всем привет, заранее большое спасибо за помощь (я начинающий и пока что много вопросов)

Есть задача из внешнего источника данных нужно выгрузить таблицу и затем к ней выполнить запрос с левым соединением от другой таблицы. А нужно это для того что бы выявить в этой таблице с помощью сравнения дубли адресов.

```1c
    Процедура ПолеВыбора1ПриИзменении(Элемент)
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | dbo_User.Ссылка,
    | dbo_User.Id,
    | dbo_User.RoleId,
    | dbo_User.CompanyId,
    | dbo_User.Name,
    | dbo_User.Comments,
    | dbo_User.IsArchive,
    | dbo_User.Changed
    |ИЗ
    | ВнешнийИсточникДанных.ServiceDesk.Таблица.dbo_User КАК dbo_User
    |ГДЕ
    | dbo_User.CompanyId.TypeId = 3";

    Результат = Запрос.Выполнить();

    ТЗ = Результат.Выгрузить();

    //ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    //
    //Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
    // // Вставить обработку выборки ВыборкаДетальныеЗаписи
    //КонецЦикла;

    МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;

    Запрос = Новый Запрос;

    Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;

    Запрос.Текст = "ВЫБРАТЬ
    | ТаблицаЗначений.Name,
    | ТаблицаЗначений.Id,
    | ТаблицаЗначений.Ссылка
    |ПОМЕСТИТЬ ВРТаблица
    |ИЗ
    | &ТаблицаЗначений КАК ТаблицаЗначений
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ
    | ВРТаблица.Name,
    | ВРТаблица.Id,
    | ВРТаблица.Ссылка
    |ИЗ
    | ВРТаблица КАК ВРТаблица";

    Запрос.УстановитьПараметр("ТаблицаЗначений", ТЗ);

    РезультатЗапроса = Запрос.Выполнить();

    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
    // Вставить обработку выборки ВыборкаДетальныеЗаписи
    КонецЦикла;
```

Таблица выгружается а затем почему-то из неё не берётся информация,

подскажите что я не так делаю?
---
пробуйте так:

```1c
    ТЗ = Новый ТаблицаЗначений;
    ТЗ.Колонки.Добавить("Наименование", Новый ОписаниеТипов("Строка"));

    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | dbo_User.Ссылка,
    | dbo_User.Id,
    | dbo_User.RoleId,
    | dbo_User.CompanyId,
    | dbo_User.Name,
    | dbo_User.Comments,
    | dbo_User.IsArchive,
    | dbo_User.Changed
    |ИЗ
    | ВнешнийИсточникДанных.ServiceDesk.Таблица.dbo_User КАК dbo_User
    |ГДЕ
    | dbo_User.CompanyId.TypeId = 3";

    Выборка = Запрос.Выполнить().Выбрать();
    Для Каждого ЗаписьВыборки Из Выборка Цикл
    СтрТЗ = ТЗ.Добавить();
    СтрТЗ.Наименование = ЗаписьВыборки.Name;
    КонецЦикла;
```

И уже эту ТЗ загружать в следующий запрос.
---
Если ТЗ содержит значения, тогда уберите Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц; и выполните запрос. РезультатЗапроса = Запрос.Выполнить().Выгрузить() должен выдать то же количество строк, что и в ТЗ. Так то все правильно.
---
скорее всего после первого запроса выгружается ТЗ не типизированная. Во всяком случае поле "Ссылка". А загружать в запрос можно только типизированные ТЗ.
---
то есть получается что её ещё надо типизировать перед тем как по ней выполнять запрос?
---
использовать ТЗ в запросе можно только строго типизированную.
---
а если он выгружает тз из первого запроса - разве она не строго типизируется?
---
и какой тип у Ссылка из внешнего источника данных?
И нет, не строго типизирован. Там будет вычислен тип и еще добавлен NULL. Это как минимум.
---
Нет, при выгрузке результата запроса таблица значений не типизируется?
---
пробуйте так:

```1c
    ТЗ = Новый ТаблицаЗначений;
    ТЗ.Колонки.Добавить("Наименование", Новый ОписаниеТипов("Строка"));

    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | dbo_User.Ссылка,
    | dbo_User.Id,
    | dbo_User.RoleId,
    | dbo_User.CompanyId,
    | dbo_User.Name,
    | dbo_User.Comments,
    | dbo_User.IsArchive,
    | dbo_User.Changed
    |ИЗ
    | ВнешнийИсточникДанных.ServiceDesk.Таблица.dbo_User КАК dbo_User
    |ГДЕ
    | dbo_User.CompanyId.TypeId = 3";

    Выборка = Запрос.Выполнить().Выбрать();
    Для Каждого ЗаписьВыборки Из Выборка Цикл
    СтрТЗ = ТЗ.Добавить();
    СтрТЗ.Наименование = ЗаписьВыборки.Name;
    КонецЦикла;
```

И уже эту ТЗ загружать в следующий запрос.
---
Выборка = Запрос.Выполнить().Выбрать();
 Для Каждого ЗаписьВыборки Из Выборка Цикл
  СтрТЗ = ТЗ.Добавить();
  СтрТЗ.Наименование = ЗаписьВыборки.Name;
 КонецЦикла;

что-то ругнулся
---
опс.
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
СтрТЗ = ТЗ.Добавить();
СтрТЗ.Наименование = Выборка.Name;
КонецЦикла;
---
да вроде все правильно,
а сто в итоге хотите получить?
---
в итоге хочу получить запрос по таблице значений к которому я левым соединением буду подключать и сравнивать другую таблицу (справочник контрагентов) и выявлять задвоенные строки в адресах контрагентов в таблице значений
---
Запрос не выдает результата? А если в отладке посмотреть следующую конструкцию?
 тзЗапроса = Запрос.Выполнить().Выгрузить();
---
не выдаёт результата запрос, в который я параметром ставлю таблицу значений, у него почему-то пусто...
---
```1c
    Выборка = Запрос.Выполнить().Выбрать();

    Пока Выборка.Следующий() Цикл
    ЗаполнитьЗначенияСвойств(ТЗКонтр.Добавить(),Выборка);

    КонецЦикла ;
```

Это выборка данных из запроса, и передача в Таблицу значений

Далее

```1c
    Запрос.УстановитьПараметр("ТЗ_Контр1",ТЗКонтр.Выгрузить());
    ЗапросСОУ.Текст =
    "ВЫБРАТЬ
    | Контрагенты.ПолноеНаименование КАК Имя_БП,
    | Контрагенты.ИНН КАК ИНН_БП,
    | Контрагенты.КПП КАК КПП_БП,
    | Контрагенты.Наименование КАК Наименование,
    | Контрагенты.Код КАК Код
    |ПОМЕСТИТЬ Контр_БП
    |ИЗ
    | Справочник.Контрагенты КАК Контрагенты
    |ГДЕ
    | Контрагенты.ПометкаУдаления = ЛОЖЬ
    | И Контрагенты.ЭтоГруппа = ЛОЖЬ
    | И Контрагенты.ЮрФизЛицо.Ссылка = &Ссылка
    |;
    |
    // Здесь выборка данных из 1С во временную таблицу

    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ
    | ТЗКонтр.Имя КАК Имя,
    | ТЗКонтр.ИНН КАК ИНН,
    | ТЗКонтр.КПП КАК КПП
    |ПОМЕСТИТЬ Контр_БУХ
    |ИЗ
    | &ТЗ_Контр1 КАК ТЗКонтр
    |;
    |
    // Здесь передача в запрос ранее созданной таблицы значения, в виде временной таблицы

    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ РАЗЛИЧНЫЕ
    // Далее ваш код на действия с двумя временными таблицами
```
---
Разбейте на 2 запроса:

```1c
    МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;

    Запрос = Новый Запрос;

    Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;

    Запрос.Текст = "ВЫБРАТЬ
    | ТаблицаЗначений.Name,
    | ТаблицаЗначений.Id,
    | ТаблицаЗначений.Ссылка
    |ПОМЕСТИТЬ ВРТаблица
    |ИЗ
    | &ТаблицаЗначений КАК ТаблицаЗначений";

    Запрос.УстановитьПараметр("ТаблицаЗначений", ТЗ);
    Запрос.Выполнить();

    Запрос.Текст = "ВЫБРАТЬ
    | ВРТаблица.Name,
    | ВРТаблица.Id,
    | ВРТаблица.Ссылка
    |ИЗ
    | ВРТаблица КАК ВРТаблица";

    РезультатЗапроса = Запрос.Выполнить();
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
```
---
теперь в запросе по ТаблицеЗначений выходит вот такая штуковина
---
соответственно во втором запросе нужно выбирать только доступные поля из ТЗ. В данном случае это Наименование.
Я приводил пример для тестирования, а не выполнения всего задания.
Проблема скорее всего будет с выборкой поля Ссылка. Нужно использовать или примитивные типы, или типы определенные в самой конфигурации.
Следовательно получаемые данные из первого запроса необходимо привести в поддерживаемые типы конфигурации.
---
Прежде чем смотреть выбору, нужно выполнить ВыборкаДетальныеЗаписи.Следующий();
---
Спасибо, получилось...

А теперь я к третьему запросу могу подключить таблицу Контрагенты что бы сравнивать адреса по Id?

А Ссылка мне вообще не нужна...
---
не совсем то, что я предлагал. Но по скрину видно, что для примитивных типов определять типизацию ТЗ не нужно.
Осталось узнать, какого типа id. Если это тип строка, то просто добавить.
Мой код по типизации ТЗ можно удалить.
Во второй запрос добавить выборку поля Id. Поле Ссылка главное не использовать. Проблема с ней была в самом начале.
---
Один вопрос ещё, почему вышла одна строка только, это потому что одна итерация цикла прошла?, а если я сделаю например поиск, то он будет искать и будет всё ок?
---
Да. Данные одной итерации цикла.
---
Можно подключить любые таблицы. Можно выбирать любые поля, включая поле "Ссылка".
---
А как мне теперь найти повторяющиеся адреса если у них есть в двух таблицах общий реквизит "id"

То есть как сделать так что бы запрос выдавал в случае повторяющихся адресов но разных "id" две строчки?

оО
---
Соединяй две таблицы по id и адресу.
---
а где результат в отладке можно посмотреть?

У меня соединение получается только внутреннее, а нужно же левое?

а адрес как соединить одновременно с id?

```1c
    Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
    | ВРТаблица.Name,
    | ВРТаблица.Id,
    | ОбъектыСервисаКонтрагенты.IDServiceDesk,
    | ОбъектыСервисаКонтрагенты.Контрагент,
    | ОбъектыСервисаКонтрагенты.Ссылка,
    | ВРТаблица.Login
    |ИЗ
    | Справочник.ОбъектыСервиса.Контрагенты КАК ОбъектыСервисаКонтрагенты
    | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВРТаблица КАК ВРТаблица
    | ПО ОбъектыСервисаКонтрагенты.Ссылка = ВРТаблица.Name";

    РезультатЗапроса = Запрос.Выполнить();
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
    ВРТ_Нэйм = ВыборкаДетальныеЗаписи.Name;
    ВРТ_Ид = ВыборкаДетальныеЗаписи.Id;
    ВРТ_Логин = ВыборкаДетальныеЗаписи.Login;
    ОСК_ИдСервисДеск = ВыборкаДетальныеЗаписи.IDServiceDesk;
    ОСК_КонтрагентНэйм = ВыборкаДетальныеЗаписи.Контрагент;
    ОСК_СсылкаКонтр = ВыборкаДетальныеЗаписи.Ссылка;

    КонецЦикла;
```
---
У меня соединение получается только внутреннее, а нужно же левое?

а адрес как соединить одновременно с id?
Можно и внутреннее взять, это не принципиально.

Нужно:

```1c
    | Справочник.ОбъектыСервиса.Контрагенты КАК ОбъектыСервисаКонтрагенты
    | ВНУТРЕННЕЕ[ЛЕВОЕ] СОЕДИНЕНИЕ ВРТаблица КАК ВРТаблица
    | ПО ОбъектыСервисаКонтрагенты.Ссылка = ВРТаблица.Name И ОбъектыСервисаКонтрагенты.<Адрес> = ВРТаблица.<Adres>";
```

Можно написать ВНУТРЕННЕЕ, можно ЛЕВОЕ, <Адрес> и <Adres> — это условные поля, в которых должен быть адрес.
---
.Выводит только одну таблицу

почему-то левое соединение не работает
---
У вас адреса в полях ссылка и login? ЛЕВОЕ от ВНУТРЕННЕЕ отличается только тем, что если в левой таблице есть данные, а в правой нет, то в результирующую таблицу попадёт значение из левой таблицы, при внутреннем— нет. Если данные есть в левой и правой таблицах левое соединение от внутреннего ничем не отличается.

У вас в результирующей таблице поля ВРТаблица.Name, ВРТаблица.id, ВРТаблица.Login пустые?
---
нет они заполнены
---
Надо проверять, чтобы тип и длина полей совпадали. Сделайте циклы отдельно по этим двум таблицам и в отладчике тип и длину полей, по которым вы устанавливаете связь.