Добрый день!
Подскажите пожалуйста как докопаться до документа Заказ Грузоотправителя из Товарно-транспортного документа?
Связь построена следующим образом
Заказ Грузоотправителя
               |
Маршрутный Лист
               |
Путевой Лист
               |
Товарно-транспортный документ

```1c
    Функция ЗаполнитьНаОсновании()
    Если ЗначениеЗаполнено(Объект.Ссылка) Тогда
    Если ТипЗнч(Объект.Ссылка) = Тип("ДокументСсылка.уатПутевойЛист") Тогда
    Если ТипЗнч(Объект.ДокументОснование) = Тип("ДокументСсылка.уатМаршрутныйЛист") Тогда
    Если ТипЗнч(Объект.ДокументОснование) = Тип("ДокументСсылка.уатЗаказГрузоотправителя") Тогда
    КонецФункции
```

Подскажите пожалуйста правильный синтаксис, сомневаюсь после
```1c
    = Тип("ДокументСсылка.уатПутевойЛист") Тогда
```
---
```1c
    ПутевойЛист=Объект.ДокументОснование;
    Если ТипЗнч(ПутевойЛист) = Тип("ДокументСсылка.уатПутевойЛист") Тогда
    МаршрутныйЛист=ПутевойЛист.ДокументОснование;
    Если ТипЗнч(МаршрутныйЛист) = Тип("ДокументСсылка.уатМаршрутныйЛист") Тогда
    ЗаказГрузоотправителя =МаршрутныйЛист.ДокументОснование;
    Если ТипЗнч(ЗаказГрузоотправителя ) = Тип("ДокументСсылка.уатЗаказГрузоотправителя ") Тогда
    ...
```
---
Потому что табличная часть это набор строк и в каждой строке может быть ссылка на разные документы.
Обращаться к строке можно по индексу:

```1c
    Объект.Выработка[0].ПутЛист ...
```

или перебором:

```1c
    Для каждого Строка Из Объект.Выработка Цикл
    Строка.ПутЛист ...
    КонецЦикла;
```

или через запрос выбрать.
---
Всем спасибо докопался, вот решение

```1c
    &НаСервере
    Функция ЗаполнитьНаОсновании()
    ПутевойЛист = Объект.Выработка[0].ПутЛист;
    Если ЗначениеЗаполнено(ПутевойЛист) Тогда
    Если ТипЗнч(ПутевойЛист) = Тип("ДокументСсылка.уатПутевойЛист") Тогда //работает
    МаршрутныйЛист = ПутевойЛист.ДокументОснование;
    Если ТипЗнч(МаршрутныйЛист) = Тип("ДокументСсылка.уатМаршрутныйЛист") Тогда
    ЗаказГрузоотправителя = МаршрутныйЛист.Заказы[0].ЗаказГрузоотправителя;
    Если ТипЗнч(ЗаказГрузоотправителя) = Тип("ДокументСсылка.уатЗаказГрузоотправителя") Тогда
    Объект.Стоимость.Очистить();
    Сообщить("Работает?");

    КонецЕсли;
    КонецЕсли;
    КонецЕсли;
    КонецЕсли;
    КонецФункции
```
---
Ищите Путевой лист у которого документ основание ваш товарнотранспортный документ, если нашли ищите Маршрутный лист у которого основание найденный документ путевой лист, если нашли ищите заказ грузоотправителя у которого основание найденный маршрутный лист. Все.
---
С этим разобрался, а можно пример кода, как это все оформить?
т.е. сначала докапываюсь до путевого листа,
от путевого листа до маршрутного,
а от маршрутного до заказа.

Как докопаться до путевого, с этим разобрался, а дальше

```1c
    Если ЗначениеЗаполнено(Объект.Ссылка) Тогда
    Если ТипЗнч(Объект.Ссылка) = Тип("ДокументСсылка.уатПутевойЛист") Тогда
```
---
включаешь отладку на сервере.
Далее ставишь точку останова и смотришь что в Объект. Далее пошагово находишь путь!
---
С этим понятно, но вот никак не пойму как это всё оформить
Допустим, докопался я до Путевого листа
Если ЗначениеЗаполнено(Объект.Ссылка) Тогда
 Если ТипЗнч(Объект.Ссылка) = Тип("ДокументСсылка.уатПутевойЛист") Тогда
А вот от путевого до маршрутного листа как докопаться (имею в виду синтаксис), не понимаю ;(
---
Я бы поискал запросами примерно так
Ищем СФ выданную по документу основанию

```1c
    ДокументОснование = Доктоварнотранспортный.Ссылка;

    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | СчетФактураВыданный.Ссылка
    |ИЗ
    | Документ.СчетФактураВыданный КАК СчетФактураВыданный
    |ГДЕ
    | СчетФактураВыданный.ДокументОснование = &ДокументОснование";

    Запрос.УстановитьПараметр("ДокументОснование", ДокументОснование);

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

    Если НЕ РезультатЗапроса.Пустой()Тогда
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

    ВыборкаДетальныеЗаписи.Следующий()
    НайденныйДок = ВыборкаДетальныеЗаписи.Ссылка;

    //Этодок основание для следующего поиска
    Иначе

    //Не нашли - выходим из поиска
    КонецЕсли
```

Естественно вставляйте ваши объекты.
Стройте цепочку поисков из таких запросов, как только результат вернется пустой значит нет документа основания.
При условии что у документа не может быть больше одного документа основания данного типа.
---
Можно примерно так:

```1c
    ДокументОснование = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Ссылка, Новый Структура("Основание", "ДокументОснование.ДокументОснование.ДокументОснование"));
    Если ЗначениеЗаполнено(ДокументОснование.Основание) Тогда
    ДокументОснование = ДокументОснование.Основание;
    КонецЕсли;
```

Естественно необходимо в объявление структуры вставить правильную цепочку названий реквизитов.
---
```1c
    ПутевойЛист=Объект.ДокументОснование;
    Если ТипЗнч(ПутевойЛист) = Тип("ДокументСсылка.уатПутевойЛист") Тогда
    МаршрутныйЛист=ПутевойЛист.ДокументОснование;
    Если ТипЗнч(МаршрутныйЛист) = Тип("ДокументСсылка.уатМаршрутныйЛист") Тогда
    ЗаказГрузоотправителя =МаршрутныйЛист.ДокументОснование;
    Если ТипЗнч(ЗаказГрузоотправителя ) = Тип("ДокументСсылка.уатЗаказГрузоотправителя ") Тогда
    ...
```
---
Ну движения наверное можно посмотреть документа если явно на форме ссылка не указанна а потом через регистры по которым движения идут докопаться до нужного.
---
Подскажите пожалуйста по поводу связи ТТД с Путевым листом, по какому реквизиту???
(Рисунок1)
Путевой Лист соединяю с маршрутным по реквизиту "ДокументОснование"
(Рисунок2)
Маршрутный лист соединяю с Заказом по реквизиту "ЗаказГрузоотправителя"
(Рисунок3)

```1c
    Функция ЗаполнитьНаОсновании()
    Если ЗначениеЗаполнено(Объект.???????) Тогда
    Если ТипЗнч(Объект.???????) = Тип("ДокументСсылка.уатПутевойЛист") Тогда
    Если ТипЗнч(Объект.ДокументОснование) = Тип("ДокументСсылка.уатМаршрутныйЛист") Тогда
    Если ТипЗнч(Объект.ЗаказГрузоотправителя) = Тип("ДокументСсылка.уатЗаказГрузоотправителя") Тогда
    КонецЕсли;
    КонецЕсли;
    КонецЕсли;
    КонецЕсли;
    КонецЕсли;
    КонецФункции
```
---
Данные беру из Критерии отбора Связанные документы
---
```1c
    Функция ЗаполнитьНаОсновании()
    Если ЗначениеЗаполнено(Объект.ПутЛист) Тогда
    Если ТипЗнч(Объект.ПутЛист)= Тип("ДокументСсылка.уатПутевойЛист") Тогда
    Если ТипЗнч(Объект.ДокументОснование) = Тип("ДокументСсылка.уатМаршрутныйЛист") Тогда
    Если ТипЗнч(Объект.ЗаказГрузоотправителя) = Тип("ДокументСсылка.уатЗаказГрузоотправителя") Тогда
    КонецЕсли;
    КонецЕсли;
    КонецЕсли;
    КонецЕсли;
    КонецФункции
```

Никак не пойму, почему возникает ошибка "Поле объекта "ПутЛист" не обнаружено" ...
---
Потому что путЛист - это реквизит таб. части
---
Если ТипЗнч(Объект.Выработка.ПутЛист)= Тип("ДокументСсылка.уатПутевойЛист") Тогда
Та же самая ошибка, или я что-то не правильно понял... =/
---
Потому что табличная часть это набор строк и в каждой строке может быть ссылка на разные документы.
Обращаться к строке можно по индексу:

```1c
    Объект.Выработка[0].ПутЛист ...
```

или перебором:

```1c
    Для каждого Строка Из Объект.Выработка Цикл
    Строка.ПутЛист ...
    КонецЦикла;
```

или через запрос выбрать.
---
```1c
    Функция ЗаполнитьНаОсновании()
    Если ЗначениеЗаполнено(Объект.Выработка[0].ПутЛист) Тогда
    Если ТипЗнч(Объект.Выработка[0].ПутЛист) = Тип ("ДокументСсылка.уатПутевойЛист") Тогда
    КонецЕсли;
    КонецЕсли;
    КонецФункции
```

Подскажите пожалуйста, почему через отладчик значение .ПутЛист ничего не показывает, а должно показать ссылку на документ
---
Могу только предположить, что реквизит ТЧ ПутЛист не заполнен.
---
Сам не понимаю почему так, вроде все заполнено
---
Ну и по нажатию f12 на .ПутЛист не происходит переход к документу уатПутевойЛист
---
А вот например процедура, которая заполняет ТЧ данными из Путевого листа в Маршрутный лист

```1c
    Функция ЗаполнитьТаблицуЗначения()
    Если ЗначениеЗаполнено(Объект.ДокументОснование) Тогда
    Если ТипЗнч(Объект.ДокументОснование) = Тип ("ДокументСсылка.уатМаршрутныйЛист") Тогда
    КонецЕсли;
    КонецЕсли;
    КонецФункции
```

В этом варианте все исправно работает, определяется документ и "объекты перехода"
---
Разобрался, спасибо! Нужно было смотреть данные с помощью "ВычислитьВыражение"
---
Запросом как-то так:

```1c
    ВЫБРАТЬ
    уатМаршрутныйЛистЗаказы.Заказ
    ИЗ
    Документ.уатТТД.Выработка КАК уатТТДВыработка
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.уатМаршрутныйЛист.Заказы КАК уатМаршрутныйЛистЗаказы
    ПО уатТТДВыработка.ПутЛист.ДокументОснование = уатМаршрутныйЛистЗаказы.Ссылка
    ГДЕ
    уатТТДВыработка.Ссылка = &Ссылка
```

Хотя это не оптимально, если вы используете учет заказов, у вас должны быть записи по регистру накопления уатЗаказыНаТС и выборку надо делать через него.
---
Всем спасибо докопался, вот решение

```1c
    &НаСервере
    Функция ЗаполнитьНаОсновании()
    ПутевойЛист = Объект.Выработка[0].ПутЛист;
    Если ЗначениеЗаполнено(ПутевойЛист) Тогда
    Если ТипЗнч(ПутевойЛист) = Тип("ДокументСсылка.уатПутевойЛист") Тогда //работает
    МаршрутныйЛист = ПутевойЛист.ДокументОснование;
    Если ТипЗнч(МаршрутныйЛист) = Тип("ДокументСсылка.уатМаршрутныйЛист") Тогда
    ЗаказГрузоотправителя = МаршрутныйЛист.Заказы[0].ЗаказГрузоотправителя;
    Если ТипЗнч(ЗаказГрузоотправителя) = Тип("ДокументСсылка.уатЗаказГрузоотправителя") Тогда
    Объект.Стоимость.Очистить();
    Сообщить("Работает?");

    КонецЕсли;
    КонецЕсли;
    КонецЕсли;
    КонецЕсли;
    КонецФункции
```