Здравствуйте. Есть такой вот код:

```1c
    Процедура ОтражениеИсточникПриИзменении(Элемент)

    ТекущаяСтрока = ЭлементыФормы.Отражение.ТекущаяСтрока;

    Если Не ЗначениеЗаполнено(ТекущаяСтрока.Источник) Или Не ТипЗнч(ТекущаяСтрока.Источник) = Тип("ДокументСсылка.СметаЗатрат") Тогда
    Возврат;
    КонецЕсли;

    Если Не ЗначениеЗаполнено(ТекущаяСтрока.ЦФО) Или Не ТекущаяСтрока.ЦФО = ТекущаяСтрока.Источник.ЦФО Тогда
    ТекущаяСтрока.ЦФО = ТекущаяСтрока.Источник.ЦФО;
    КонецЕсли;
```

Если в реквизите ТЧ "Источник" выбрать тип документа "СметаЗатрат" он при выборе дока, в реквизит тч "цфо" подставляет ЦФО из сметы затрат.
Всё работает отлично, но потребовалось расширить функционал, и нужно что бы при выборе другого типа дока, он так же подставлял из него значение реквизита "ЦФО".

Пишу так :

```1c
    ТекущаяСтрока = ЭлементыФормы.Отражение.ТекущаяСтрока;

    Если Не ЗначениеЗаполнено(ТекущаяСтрока.Источник) Или Не ТипЗнч(ТекущаяСтрока.Источник) = Тип("ДокументСсылка.СметаЗатрат") Тогда
    Возврат;
    КонецЕсли;

    Если Не ЗначениеЗаполнено(ТекущаяСтрока.ЦФО) Или Не ТекущаяСтрока.ЦФО = ТекущаяСтрока.Источник.ЦФО Тогда
    ТекущаяСтрока.ЦФО = ТекущаяСтрока.Источник.ЦФО;
    КонецЕсли;

    //с измененным реквизитом ЦФО
    Если ТипЗнч(ТекущаяСтрока.Источник) = Тип("ДокументСсылка.АктВыполненныхСметЗатрат") Тогда
    Возврат;
    КонецЕсли;

    Если Не ЗначениеЗаполнено(ТекущаяСтрока.ЦФО) Или Не ТекущаяСтрока.ЦФО = ТекущаяСтрока.Источник.ЦФО Тогда
    ТекущаяСтрока.ЦФО = ТекущаяСтрока.Источник.ЦФО;
    КонецЕсли;
```

И условие не выполняется. Т.е.: если выбрать "сметы затрат" то всё работает как нужно, если же "АктВыполненныхСметЗатрат" то нет. Уже переписывал так и эдак, но желаемого результата достичь не удается. Поставил точку останова, но она не срабатывает при выборе "АктВыполненныхСметЗатрат". Можете подсказать в чём тут ошибка?
---
чо то как то сложно то
упрощаем:

```1c
    ист = ТекСтрока.Источник;
    Если ЗначениеЗаполнено(ист) И (ТипЗнч(ист)=Тип("док1") или ТипЗнч(ист)=Тип("док2")) Тогда
    ТекСтрока.ЦФО = ист.ЦФО
    КонецЕсли;
```
---
А не в первом ли условии отсеивается "АктВыполненныхСметЗатрат"? Если ТекущаяСтрока.Источник уже заполнено, то отсеет точно. Ставьте точку останова на первом условии и смотрите выполнение.
---
поставил точку останова на первом условии да, действительно отсеивает. Вопрос теперь в другом: можно ли в одном условии задать два типа? Т.е. Тип("ДокументСсылка.СметаЗатрат") и Тип("ДокументСсылка.АктВыполненныхСметЗатрат")?
---
во-первых: не бойтесь скобок в логических выражениях:

```1c
    Если Не ЗначениеЗаполнено(ТекущаяСтрока.Источник) Или Не(ТипЗнч(ТекущаяСтрока.Источник) = Тип("ДокументСсылка.СметаЗатрат") или ТипЗнч(ТекущаяСтрока.Источник) = Тип("ДокументСсылка.АктВыполненныхСметЗатрат")) Тогда
```

во-вторых: если заменить "равно" на "не равно", будет читаться легче:

```1c
    Если Не ЗначениеЗаполнено(ТекущаяСтрока.Источник) Или (ТипЗнч(ТекущаяСтрока.Источник) <> Тип("ДокументСсылка.СметаЗатрат") и ТипЗнч(ТекущаяСтрока.Источник) <> Тип("ДокументСсылка.АктВыполненныхСметЗатрат")) Тогда
```
---
ругается
```1c
    Поле объекта не обнаружено (Источник)
```
---
М-даа...
Перед всем этим:

```1c
    Если ТекущаяСтрока=Неопределено Тогда
    Возврат;
    КонецЕсли;
```

Ну, или ставить остановку по ошибке и искать, почему в Вашу процедуру приходит ТекущаяСтрока без нужного поля.
---
```1c
    Если Не ЗначениеЗаполнено(ТекущаяСтрока.Источник) Или Не ТипЗнч(ТекущаяСтрока.Источник) = Тип("ДокументСсылка.СметаЗатрат") Тогда
    Возврат;
    КонецЕсли;
```

У вас Источник заполнен поэтому условие Ложь через логическое отрицание, следовательно далее по логическому сложению ТипЗнч(ТекущаяСтрока.Источник) = Тип("ДокументСсылка.СметаЗатрат") у вас Ложь так как Источник в вашем случае это ДокументСсылка.АктВыполненныхСметЗатрат, и так как логическое отрицание то условие выполняется. Следовательно Возврат.

Если у вас код написан в такой же последовательности как вы и приложили выше:

```1c
    ТекущаяСтрока = ЭлементыФормы.Отражение.ТекущаяСтрока;

    Если Не ЗначениеЗаполнено(ТекущаяСтрока.Источник) Или Не ТипЗнч(ТекущаяСтрока.Источник) = Тип("ДокументСсылка.СметаЗатрат") Тогда
    Возврат; //всё назад так как у нас документ имеет тип ДокументСсылка.АктВыполненныхСметЗатрат
    КонецЕсли;

    Если Не ЗначениеЗаполнено(ТекущаяСтрока.ЦФО) Или Не ТекущаяСтрока.ЦФО = ТекущаяСтрока.Источник.ЦФО Тогда
    ТекущаяСтрока.ЦФО = ТекущаяСтрока.Источник.ЦФО;
    КонецЕсли;

    //с измененным реквизитом ЦФО
    Если ТипЗнч(ТекущаяСтрока.Источник) = Тип("ДокументСсылка.АктВыполненныхСметЗатрат") Тогда
    Возврат;
    КонецЕсли;

    Если Не ЗначениеЗаполнено(ТекущаяСтрока.ЦФО) Или Не ТекущаяСтрока.ЦФО = ТекущаяСтрока.Источник.ЦФО Тогда
    ТекущаяСтрока.ЦФО = ТекущаяСтрока.Источник.ЦФО;
    КонецЕсли;
```
---
чо то как то сложно то
упрощаем:

```1c
    ист = ТекСтрока.Источник;
    Если ЗначениеЗаполнено(ист) И (ТипЗнч(ист)=Тип("док1") или ТипЗнч(ист)=Тип("док2")) Тогда
    ТекСтрока.ЦФО = ист.ЦФО
    КонецЕсли;
```
---
можете разъяснить ваш пример????????
---
проверяется заполненность источника а так же проверка на тип документа через условие ИЛИ . оба условия объединяются И если хотя бы одно из условий вернет ложь реквизит ЦФО не будет заполнен
---
та же самая ошибка:

```1c
    Поле объекта не обнаружено (Источник)
```
---
ну это уже к вам вопрос, почему у вас в тек строке источника нет.
может, по другому реквизит называется, может, нужно саму тек строку на неопределенно сначала проверить.
---
```1c
    ист = ТекущаяСтрока.Источник;

    Если ЗначениеЗаполнено(ТекущаяСтрока) И (ТипЗнч(ист)=Тип("ДокументСсылка.СметаЗатрат") или ТипЗнч(ист)=Тип("ДокументСсылка.АктВыполненныхСметЗатрат")) Тогда
    ТекущаяСтрока.ЦФО = ист.ЦФО
    КонецЕсли;
```

ругается, туже самую ошибку выдаёт. Начну искать что это за источник, потом отпишусь о результате
---
выб сначала
```1c
    ЗначениеЗаполнено(ТекущаяСтрока)
```
проверили, а потом только
```1c
    ист = ТекущаяСтрока.Источник;
```
 писали
---
может хватит тупо копипастить , а нормально посмотреть и привести имена переменных к своим данным
---
я так и сделал(привел имена переменных к своим)
---
многообразие условий запутывает, лучше поделить на кирпичики.

```1c
    ист = ТекСтрока.Источник;
    проверка1 = ТипЗнч(ист)=Тип("док1");
    проверка2 = ТипЗнч(ист)=Тип("док2");
    Если не ЗначениеЗаполнено(ист) тогда
    продолжить;
    конецесли;

    Если проверка1 или проверка2 Тогда
    ТекСтрока.ЦФО = ист.ЦФО;
    КонецЕсли;
```
---
Медленнее выполняется. А если во вложенном цикле, то разница становится ощутимой. Можно делать так:

```1c
    Процедура ОтражениеИсточникПриИзменении(Элемент)

    ТекущаяСтрока = ЭлементыФормы.Отражение.ТекущаяСтрока;

    Если (ТекущаяСтрока=Неопределено)
    ИЛИ Не(ЗначениеЗаполнено(ТекущаяСтрока.Источник))
    ИЛИ (
    ТипЗнч(ТекущаяСтрока.Источник) <> Тип("ДокументСсылка.СметаЗатрат")
    И ТипЗнч(ТекущаяСтрока.Источник) <> Тип("ДокументСсылка.АктВыполненныхСметЗатрат")
    )
    Тогда
    Возврат;
    КонецЕсли;
```
---
чо то как то

Спс, добавил проверку на пустое значение и всё заработало