Здравствуйте! Помогите пожалуйста с программированием отбора.

Есть два документа: Отгрузка и Взвешивание.

Они жестко связаны следующим образом: документ отгрузка имеет реквизит "СсылкаНаДокументВзвешивания". Документ Взвешивание создается только из документа Отгрузка.
Но бывают случаи, когда документ взвешивания по тем или иным причинам создается автономно. Соответственно такой документ необходимо привязать к документу Отгрузка вручную.

Мне необходимо, например по кнопке из документа Отгрузка, вывести форму выбора документа Взвешивание с определенным отбором:

- в списке вывести только те документы взвешивания, ссылки которых еще не были указаны, как "СсылкаНаДокументВзвешивания" (другими словами вывести все документы взвешивания, которые были созданы автономно).

Помогите пожалуйста с кодом. Сколько не бился, одни ошибки :( С отборами разбираюсь сам, пока туго идет. Спасибо!
---
Нужно выбрать все документы взвешивания, на которые нет ссылки из документа отгрузка реквизит "СсылкаНаДокументВзвешивания".
Это можно сделать запросом, указанным в сообщении (6).

Для открытия отбора используйте вид сравнения вСписке.
Тогда значение в отборе необходимо задать в виде СпискаЗначений.
Код, который необходимо разместить в кнопке документа "Отгрузка", открывающей список документов "Взвешивание":

```1c
    СписокДляОтбора=Новый СписокЗначений;
    Запрос=Новый Запрос;
    Запрос.Текст="ВЫБРАТЬ
    | Взвешивание.Ссылка КАК Ссылка
    |ИЗ
    | Документ.Взвешивание КАК Взвешивание
    | Левое СОЕДИНЕНИЕ Документ.Отгрузка КАК Отгрузка
    | ПО (Отгрузка.СсылкаНаДокументВзвешивания = Взвешивание.Ссылка)
    |ГДЕ
    | Отгрузка.ССылка ЕСТЬ NULL";

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

    Форма=Документы.Взвешивание.ПолучитьФормуВыбора();
    Форма.Заголовок="Выбор документа (Взвешивание) для зарепления за документом (Отгрузка)";
    Форма.Отбор.Ссылка.Использование=Истина;
    Форма.Отбор.Ссылка.ВидСравнения=ВидСравнения.ВСписке;
    Форма.Отбор.Ссылка.Значение=СписокДляОтбора;
    форма.Открыть();
```
---
тогда так:

```1c
    ВЫБРАТЬ
    Взвешивание.Ссылка КАК Ссылка
    ИЗ
    Документ.Взвешивание КАК Взвешивание
    Левое СОЕДИНЕНИЕ Документ.Отгрузка КАК Отгрузка
    ПО (Отгрузка.СсылкаНаДокументВзвешивания = Взвешивание.Ссылка)
    ГДЕ
    Отгрузка.ССылка ЕСТЬ NULL
```
---
```1c
    ВЫБРАТЬ
    Взвешивание.Ссылка КАК Ссылка
    ИЗ
    Документ.Взвешивание КАК Взвешивание
    ГДЕ
    Взвешивание.СсылкаНаДокументВзвешивания = ЗНАЧЕНИЕ(Документ.Отгрузка.ПустаяСсылка)
```
---
Нет, СсылкаНаДокументВзвешивания это реквизит документа Отгрузка :)
---
тогда так:

```1c
    ВЫБРАТЬ
    Взвешивание.Ссылка КАК Ссылка
    ИЗ
    Документ.Взвешивание КАК Взвешивание
    Левое СОЕДИНЕНИЕ Документ.Отгрузка КАК Отгрузка
    ПО (Отгрузка.СсылкаНаДокументВзвешивания = Взвешивание.Ссылка)
    ГДЕ
    Отгрузка.ССылка ЕСТЬ NULL
```
---
Нужно выбрать все документы взвешивания, на которые нет ссылки из документа отгрузка реквизит "СсылкаНаДокументВзвешивания".
Это можно сделать запросом, указанным в сообщении (6).

Для открытия отбора используйте вид сравнения вСписке.
Тогда значение в отборе необходимо задать в виде СпискаЗначений.
Код, который необходимо разместить в кнопке документа "Отгрузка", открывающей список документов "Взвешивание":

```1c
    СписокДляОтбора=Новый СписокЗначений;
    Запрос=Новый Запрос;
    Запрос.Текст="ВЫБРАТЬ
    | Взвешивание.Ссылка КАК Ссылка
    |ИЗ
    | Документ.Взвешивание КАК Взвешивание
    | Левое СОЕДИНЕНИЕ Документ.Отгрузка КАК Отгрузка
    | ПО (Отгрузка.СсылкаНаДокументВзвешивания = Взвешивание.Ссылка)
    |ГДЕ
    | Отгрузка.ССылка ЕСТЬ NULL";

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

    Форма=Документы.Взвешивание.ПолучитьФормуВыбора();
    Форма.Заголовок="Выбор документа (Взвешивание) для зарепления за документом (Отгрузка)";
    Форма.Отбор.Ссылка.Использование=Истина;
    Форма.Отбор.Ссылка.ВидСравнения=ВидСравнения.ВСписке;
    Форма.Отбор.Ссылка.Значение=СписокДляОтбора;
    форма.Открыть();
```
---
(8)

Спасибо вам, всё получилось! Всё предельно просто, но сам до этого пока додуматься не могу. Удачи вам! :)
---
(8)
Только запрос думаю не совсем верный.
Нам для отбора нужны все ссылки документов Взвешивания, которые еще не использовались, как "СсылкаНаВесовойДокумент" в документе Отгрузка.
Что-то я опять запарился)
---
запрос именно это и делает.
---
А можно словами прокомментировать запрос?
---
берем всю таблицу Документ.Взвешивание.
Левым соединение присоединяем таблицу Документ.Отгрузка, сопоставляем по (Отгрузка.СсылкаНаДокументВзвешивания = Взвешивание.Ссылка)
В отборе будут все документы Взвешивание и там где не произошло сопоставление, будут NULL вместо Документ.Отгрузка.
В итоге отбираем все документы Взвешивание, у которых Отгрузка.ССылка ЕСТЬ NULL. Фактически все документы Взвешивание, которые еще не использовались, как "СсылкаНаВесовойДокумент" в документе Отгрузка.

Еще нужно понимать: так как работаем напрямую со всеми документами Отгрузка, то желательно ограничить по интервалу дат. Но тут уже смотреть по обстоятельствам.
---
большое спасибо, теперь понятно, параллельно еще погуглил примеры левых соединений. надеюсь тоже буду когда-нибудь так разбираться :)
---
Интересно, а так будет работать? Более понятно просто :)

```1c
    ВЫБРАТЬ
    Взвешивание.Ссылка
    ИЗ
    Документ.Взвешивание КАК Взвешивание
    ГДЕ
    НЕ Взвешивание.Ссылка В
    (ВЫБРАТЬ
    ОтгрузкаПтицы.СсылкаНаВесовойДокумент КАК СсылкаНаВесовойДокумент
    ИЗ
    ОтгрузкаПтицы КАК ОтгрузкаПтицы)
```
---
В запросе условие "В" имеет свои особенности, а точнее, некоторые проблемы с быстродействием.

На инфостарте была статься с анализом: серьезные тормоза начинаются, если вариантов выбора более 128 штук.
---
Да, получается на каждой итерации ссылка взвешивания сравнивается с каждой ссылкой из документа Отгрузка. Просмотров списка будет только, сколько Ссылок НаДокументВзвешивания будет в документе Отгрузка. Логично. Спасибо, буду знать :)
---
(16) Проверил в конфигураторе, так тоже работает. Хотел решение, получил два, спасибо большое! :))
---
Нужно открыть именно Форму выбора документов Взвешивание с зашитым отбором, описанным в шапке
---
Если у вас форма выбора (списка) уже есть, то скорее всего она на динамическом списке основана. Можно попробовать вот так сделать:

```1c
    ФормаВыбора = Документы.Взвешивание.ПолучитьФормуВыбора();
    ФормаВыбора .Отбор.РеквизитДляОтбора.Значение = ЗначениеОтбора;
    ФормаВыбора .Отбор.РеквизитДляОтбора.Использование = Истина;
    ФормаВыбора .Отбор.РеквизитДляОтбора.ВидСравнения = ВидСравнения.Равно;
    ФормаВыбора.Открыть();
```

Соответственно РеквизитДляОтбора - реквизит, по которому отбор производится, ЗначениеОтбора - значение, передаваемое в отбор
---
Для 8.3 кстати можно еще так попробовать:

```1c
    ФормаВыбора = ПолучитьФорму("Документ.Взвешивание.ФормаВыбора");
    Список = ФормаВыбора.Список;

    ОтборВладелец = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ОтборВладелец.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
    ОтборВладелец.Использование = Истина;
    ОтборВладелец.ЛевоеЗначение = Список.Отбор.ДоступныеПоляОтбора.Элементы[1].Поле; //поле для отбора, тут пример
    ОтборВладелец.ПравоеЗначение = ЗначениеОтбора;

    ФормаВыбора.ОткрытьМодально();
```

либо так
```1c
    ОткрытьФорму("Документ.Взвешивание.ФормаВыбора",Новый Структура("Отбор",Новый Структура("ОбъектОснование",ДокументОснование)));
```

в общем вариантов куча))
---
Спасибо за совет! :)