Не входит в условие

1. BigBoss 2 29.03.17 06:59 Сейчас в теме
Здравствуйте. Есть такой вот код:
Процедура ОтражениеИсточникПриИзменении(Элемент)
	
	
	ТекущаяСтрока = ЭлементыФормы.Отражение.ТекущаяСтрока; 
	
	Если Не ЗначениеЗаполнено(ТекущаяСтрока.Источник) Или Не ТипЗнч(ТекущаяСтрока.Источник) = Тип("ДокументСсылка.СметаЗатрат") Тогда
		Возврат;
	КонецЕсли;
	
	Если Не ЗначениеЗаполнено(ТекущаяСтрока.ЦФО) Или Не ТекущаяСтрока.ЦФО = ТекущаяСтрока.Источник.ЦФО Тогда
		ТекущаяСтрока.ЦФО = ТекущаяСтрока.Источник.ЦФО;	
	КонецЕсли;
Показать


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

Пишу так :

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

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


И условие не выполняется. Т.е.: если выбрать "сметы затрат" то всё работает как нужно, если же "АктВыполненныхСметЗатрат" то нет. Уже переписывал так и эдак, но желаемого результата достичь не удается. Поставил точку останова, но она не срабатывает при выборе "АктВыполненныхСметЗатрат". Можете подсказать в чём тут ошибка?
По теме из базы знаний
Найденные решения
7. ditp 91 29.03.17 11:53 Сейчас в теме
чо то как то сложно то
упрощаем:
ист = ТекСтрока.Источник;
Если ЗначениеЗаполнено(ист) И (ТипЗнч(ист)=Тип("док1") или ТипЗнч(ист)=Тип("док2")) Тогда
  ТекСтрока.ЦФО = ист.ЦФО
КонецЕсли;
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Octopus 337 29.03.17 07:37 Сейчас в теме
А не в первом ли условии отсеивается "АктВыполненныхСметЗатрат"? Если ТекущаяСтрока.Источник уже заполнено, то отсеет точно. Ставьте точку останова на первом условии и смотрите выполнение.
4. BigBoss 2 29.03.17 11:20 Сейчас в теме
(2) поставил точку останова на первом условии да, действительно отсеивает. Вопрос теперь в другом: можно ли в одном условии задать два типа? Т.е. Тип("ДокументСсылка.СметаЗатрат") и Тип("ДокументСсылка.АктВыполненныхСметЗатрат")?
5. japopov 68 29.03.17 11:28 Сейчас в теме
(4)
во-первых: не бойтесь скобок в логических выражениях:
Если Не ЗначениеЗаполнено(ТекущаяСтрока.Источник) Или Не(ТипЗнч(ТекущаяСтрока.Источник) = Тип("ДокументСсылка.СметаЗатрат") или ТипЗнч(ТекущаяСтрока.Источник) = Тип("ДокументСсылка.АктВыполненныхСметЗатрат")) Тогда


во-вторых: если заменить "равно" на "не равно", будет читаться легче:
Если Не ЗначениеЗаполнено(ТекущаяСтрока.Источник) Или (ТипЗнч(ТекущаяСтрока.Источник) <> Тип("ДокументСсылка.СметаЗатрат") и ТипЗнч(ТекущаяСтрока.Источник) <> Тип("ДокументСсылка.АктВыполненныхСметЗатрат")) Тогда
6. BigBoss 2 29.03.17 11:45 Сейчас в теме
(5) ругается
Поле объекта не обнаружено (Источник)
16. japopov 68 29.03.17 12:35 Сейчас в теме
(6) М-даа...
Перед всем этим:
Если ТекущаяСтрока=Неопределено Тогда
   Возврат;
КонецЕсли;

Ну, или ставить остановку по ошибке и искать, почему в Вашу процедуру приходит ТекущаяСтрока без нужного поля.
3. Mnemonik 29.03.17 07:55 Сейчас в теме
Если Не ЗначениеЗаполнено(ТекущаяСтрока.Источник) Или Не ТипЗнч(ТекущаяСтрока.Источник) = Тип("ДокументСсылка.СметаЗатрат") Тогда
        Возврат;
    КонецЕсли;


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

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

    //с измененным реквизитом ЦФО
    Если  ТипЗнч(ТекущаяСтрока.Источник) = Тип("ДокументСсылка.АктВыполненныхСметЗатрат") Тогда
        Возврат;
    КонецЕсли;
    
    Если Не ЗначениеЗаполнено(ТекущаяСтрока.ЦФО) Или Не ТекущаяСтрока.ЦФО = ТекущаяСтрока.Источник.ЦФО Тогда
        ТекущаяСтрока.ЦФО = ТекущаяСтрока.Источник.ЦФО;
    КонецЕсли;
Показать
7. ditp 91 29.03.17 11:53 Сейчас в теме
чо то как то сложно то
упрощаем:
ист = ТекСтрока.Источник;
Если ЗначениеЗаполнено(ист) И (ТипЗнч(ист)=Тип("док1") или ТипЗнч(ист)=Тип("док2")) Тогда
  ТекСтрока.ЦФО = ист.ЦФО
КонецЕсли;
8. BigBoss 2 29.03.17 12:02 Сейчас в теме
(7) можете разъяснить ваш пример????????
9. vadim1011985 100 29.03.17 12:08 Сейчас в теме
(8) проверяется заполненность источника а так же проверка на тип документа через условие ИЛИ . оба условия объединяются И если хотя бы одно из условий вернет ложь реквизит ЦФО не будет заполнен
10. BigBoss 2 29.03.17 12:09 Сейчас в теме
(9) та же самая ошибка:
Поле объекта не обнаружено (Источник)
11. ditp 91 29.03.17 12:10 Сейчас в теме
(10) ну это уже к вам вопрос, почему у вас в тек строке источника нет.
может, по другому реквизит называется, может, нужно саму тек строку на неопределенно сначала проверить.
14. BigBoss 2 29.03.17 12:19 Сейчас в теме
(11)
ист = ТекущаяСтрока.Источник;
	

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


ругается, туже самую ошибку выдаёт. Начну искать что это за источник, потом отпишусь о результате
15. ditp 91 29.03.17 12:21 Сейчас в теме
(14) выб сначала
ЗначениеЗаполнено(ТекущаяСтрока)
проверили, а потом только
ист = ТекущаяСтрока.Источник;
писали
12. vadim1011985 100 29.03.17 12:11 Сейчас в теме
(10) может хватит тупо копипастить , а нормально посмотреть и привести имена переменных к своим данным
корум; +1 Ответить
13. BigBoss 2 29.03.17 12:12 Сейчас в теме
(12) я так и сделал(привел имена переменных к своим)
17. корум 287 29.03.17 12:41 Сейчас в теме
(7) многообразие условий запутывает, лучше поделить на кирпичики.
ист = ТекСтрока.Источник;
проверка1 = ТипЗнч(ист)=Тип("док1");
проверка2 = ТипЗнч(ист)=Тип("док2");
Если не ЗначениеЗаполнено(ист)  тогда 
продолжить;
конецесли;

Если проверка1 или проверка2  Тогда
  ТекСтрока.ЦФО = ист.ЦФО;
КонецЕсли;
Показать
18. japopov 68 29.03.17 13:01 Сейчас в теме
(17) Медленнее выполняется. А если во вложенном цикле, то разница становится ощутимой. Можно делать так:
Процедура ОтражениеИсточникПриИзменении(Элемент)
    
    
    ТекущаяСтрока = ЭлементыФормы.Отражение.ТекущаяСтрока; 

    Если (ТекущаяСтрока=Неопределено)
           ИЛИ Не(ЗначениеЗаполнено(ТекущаяСтрока.Источник)) 
           ИЛИ (
                   ТипЗнч(ТекущаяСтрока.Источник) <> Тип("ДокументСсылка.СметаЗатрат") 
                   И ТипЗнч(ТекущаяСтрока.Источник) <> Тип("ДокументСсылка.АктВыполненныхСметЗатрат")
           )
           Тогда
           Возврат;
    КонецЕсли;
Показать
19. BigBoss 2 29.03.17 13:21 Сейчас в теме
(7)
чо то как то


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

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот