Почему не правильно работает выборка в запросе ?

1. Terabaytus 02.03.21 12:24 Сейчас в теме
Добрый день, понять не могу делаю выборку из РегСвед
3 поля
у ресурс1 дата
у ресурс 2 строка
у ресурс3
строка сравниваю в итоге по дате даже отбор не проходит а если закоментить то работает только второе условие.
ДатаДокумента = Объект.Дата;
	НомерДокумента = Объект.Номер;
	Организация = Объект.Организация;
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	ДвиженияУФДляСписания.Период КАК ДатаУФ,
		|	ДвиженияУФДляСписания.Ресурс2 КАК НомерУФ,
		|	ДвиженияУФДляСписания.Ресурс3 КАК ОрганизацияУФ
		|ИЗ
		|	РегистрСведений.ДвиженияУФДляСписания КАК ДвиженияУФДляСписания 
		|ГДЕ
		|   Ресурс1 = """+ДатаДокумента+"""  
		|И
		|	Ресурс2 = """+НомерДокумента+""" 
		|И
		|   Ресурс3 = """+Организация+""" ";

	РезультатЗапроса = Запрос.Выполнить();
	Выборка = РезультатЗапроса.Выбрать();
	                         
	Пока Выборка.Следующий() Цикл
		     
	ДатаУФ = Выборка.ДатаУФ;
	НомерУФ = Выборка.НомерУФ;
	ОрганизацияУФ = Выборка.ОрганизацияУФ; 
	
	КонецЦикла;
		
		Если ДатаУФ = ДатаДокумента Тогда 
		
			Если  ТипЗнч(НомерУФ) = ТипЗнч(НомерДокумента) Тогда
				           Сообщить("Работает0");
				Если ОрганизацияУФ = Тип("СправочникСсылка.Организации") Тогда
					   Сообщить("Работает1");
					ЭтаФорма.Объект.СнятьСЗаписи = Истина;
				
					КонецЕсли;
				
				КонецЕсли;
				
			КонецЕсли;
Показать

В консоле запросов смотрел там отбор даже в таком
Ресурс1 = "02.03.2021 12:47:50"
вариате на проходит почему ?
По теме из базы знаний
Найденные решения
23. spacecraft 03.03.21 08:58 Сейчас в теме
(22) Верните в РС ссылочные типы. Так будет проще и надежнее.
Смотрите сами, пользователи возьмут и переименуют туже Организацию. И все. Данные РС устарели. По наименованию уже не будет искать. А ссылка при этом не поменяется.
oleg-x; Terabaytus; +2 Ответить
19. spacecraft 02.03.21 17:33 Сейчас в теме
(18) Вы намеренно делаете как хуже?
Я так понял, что нужно найти по всем этим данным запись в РС, и если найдено, то проставить реквизит в истина.
Тогда так:
Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |    ДвиженияУФДляСписания.Период КАК ДатаУФ
        |ИЗ
        |    РегистрСведений.ДвиженияУФДляСписания КАК ДвиженияУФДляСписания 
        |ГДЕ
        |   Ресурс1 = &ДатаДокумента 
        |И
        |    Ресурс2 = &НомерДокумента
        |И
        |   Ресурс3 = &Организация";

    Запрос.УстановитьПараметр("ДатаДокумента", Объект.Дата);
    Запрос.УстановитьПараметр("НомерДокумента", Объект.Номер);
    Запрос.УстановитьПараметр("Организация", Объект.Организация);
        
    РезультатЗапроса = Запрос.Выполнить();
        
    Если НЕ РезультатЗапроса.Пустой() Тогда
        Объект.ДокументГотовДляРедактирования = Истина;
    КонецЕсли;
Показать
Terabaytus; +1 Ответить
21. spacecraft 02.03.21 23:07 Сейчас в теме
(20)
РегСвед Ресурс3 в который записывается Организация имеет тип Строка

Неожиданный поворот. Серьезно? Сами делали регистр? Тренируетесь, или это на живой базе?
Почему не ссылочный тип справочника Организации?

Ну, только для Вас, наверно можно и так:
Запрос.УстановитьПараметр("Организация", Объект.Организация.Наименование);


Только никому не говорите, что это я так посоветовал.
Terabaytus; +1 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. spacecraft 02.03.21 12:34 Сейчас в теме
(1) потому что тип ДатаВремя и тип Строка это разные типы. Передавайте в запрос тип дата параметром.

Тоже относится и к параметру Организация.
Terabaytus; +1 Ответить
4. Terabaytus 02.03.21 13:01 Сейчас в теме
(2)(3) Поправил
пока по двум выборкам
Тоже самое
ДатаДокумента = Объект.Дата;
	НомерДокумента = Объект.Номер;
	Организация = Объект.Организация;
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	ДвиженияУФДляСписания.Период КАК ДатаУФ,
		|	ДвиженияУФДляСписания.Ресурс2 КАК НомерУФ,
		|	ДвиженияУФДляСписания.Ресурс3 КАК ОрганизацияУФ
		|ИЗ
		|	РегистрСведений.ДвиженияУФДляСписания КАК ДвиженияУФДляСписания 
		|ГДЕ
		//|   Ресурс1 = """+ДатаДокумента+"""  
		//|И
		|	Ресурс2 = &ВыбРесурс2  
		|И
		|   Ресурс3 = &ВыбРесурс3 ";

		Запрос.УстановитьПараметр("ВыбРесурс2", НомерДокумента);
		Запрос.УстановитьПараметр("ВыбРесурс3", Справочники.Организации.НайтиПоНаименованию(Организация));
		
		РезультатЗапроса = Запрос.Выполнить();
		
		Выборка = РезультатЗапроса.Выбрать();
	                         
		     
	ДатаУФ = Выборка.ДатаУФ;
	НомерУФ = Выборка.НомерУФ;
	ОрганизацияУФ = Выборка.ОрганизацияУФ; 
	
		
		//Если ДатаУФ = ДатаДокумента Тогда 
		                       Сообщить("Работает");
			Если  НомерУФ = НомерДокумента Тогда
				           Сообщить("Работает0");
				Если ОрганизацияУФ = Организация Тогда
					   Сообщить("Работает1");
					ЭтаФорма.Объект.СнятьСЗаписи = Истина;
				
					КонецЕсли;
				
				КонецЕсли;
				
			//КонецЕсли;

КонецПроцедуры
Показать
5. FatPanzer 02.03.21 13:03 Сейчас в теме
(4) И что вы хотите найти по наименованию в справочнике Организаций, если передаете туда уже готовую ссылку из документа?
И что вы хотите вы получить через точку в выборке, если вы еще даже на первую запись не перешли?

Может все-таки в школу?
6. spacecraft 02.03.21 13:04 Сейчас в теме
(4) ну и зачем убрали "Пока Выборка.Следующий() Цикл" ? Выборку обходить нужно.
9. Terabaytus 02.03.21 16:05 Сейчас в теме
(6)Вы противоречите комментатору с ответом (3) кто прав ?
11. spacecraft 02.03.21 16:13 Сейчас в теме
(9) нет, просто Вы не поняли его комментарий. Вы внутри цикла присваиваете одним и тем же переменным значения. Это бессмысленно делать, так как они будут содержать значение только последнего прохода в цикле. Но и не означает нельзя. Все зависит от условий выполнения запроса. Если там только одна порция данных, то можно использовать Если Выборка.Следующий() Тогда. Но можно оставить и через Цикл. Главное понимать что делаете. В любом случае, значение выборки нужно получить только проходом через Выборка.Следующий().
7. spacecraft 02.03.21 13:07 Сейчас в теме
(4)
Запрос.УстановитьПараметр("ВыбРесурс3", Справочники.Организации.НайтиПоНаименованию(Организация));

Это вообще что?
Запрос.УстановитьПараметр("ВыбРесурс3", Организация);
Или Объект.Организация это Строка?
10. Terabaytus 02.03.21 16:08 Сейчас в теме
(7)
Запрос.УстановитьПараметр("ВыбРесурс3", Справочники.Организации.НайтиПоНаименованию(Организация));
ссылочный тип

пример
/// Как передать в запрос параметры ссылочных типов в 1с 8.3, 8.2
 
&НаСервере
Процедура КакПередатьВЗапросПараметрыСсылочныхТиповНаСервере()    
 
    // Сделаем отбор продуктов со сладким вкусом.
 
    Запрос = Новый Запрос(
        "ВЫБРАТЬ
        |   Наименование,
        |   Вкус
        |ИЗ
        |   Справочник.Номенклатура
        |ГДЕ
        |   Вкус = &ВыбВкус"
    );
 
    Запрос.УстановитьПараметр("ВыбВкус",
        Справочники.Вкусы.НайтиПоНаименованию("Сладкий")
    );
 
    ВыполнитьЗапросИВывестиНаФорму(Запрос);    
 
КонецПроцедуры
Показать
12. spacecraft 02.03.21 16:18 Сейчас в теме
(10)
ссылочный тип

тогда как и использовать напрямую, зачем еще раз ее же получать?
Запрос.УстановитьПараметр("ВыбРесурс3", Организация);
Terabaytus; +1 Ответить
13. Terabaytus 02.03.21 16:29 Сейчас в теме
(12)Я уже запутался давайте сначала я получаю от объектов значения и подставляя их в запрос отбираю по ним нужную мне строку из РегСвед.
В РегСвед есть тип Дата у Ресурса1 у Ресурса2 строка Объект.Номер тип строка и Ресурс3 тип строка у Объекта.Организация ссылочный тип на справочники.Организации. Как мне тогда сделать выборку по ссылочному типу ?
16. spacecraft 02.03.21 16:47 Сейчас в теме
(13) не до конца понятна задача, что нужно в итоге. Вот, для примера:
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |    ДвиженияУФДляСписания.Период КАК ДатаУФ
        |ИЗ
        |    РегистрСведений.ДвиженияУФДляСписания КАК ДвиженияУФДляСписания 
        |ГДЕ
        |    Ресурс2 = &ВыбРесурс2  
        |И
        |   Ресурс3 = &ВыбРесурс3 ";

    Запрос.УстановитьПараметр("ВыбРесурс2", Объект.Номер);
    Запрос.УстановитьПараметр("ВыбРесурс3", Объект.Организация);
        
    Выборка = Запрос.Выполнить().Выбрать();
        
	Если Выборка.Следующий() И Выборка.ДатаУФ = Объект.Дата Тогда
		Объект.СнятьСЗаписи = Истина;
	КонецЕсли;
Показать
Terabaytus; +1 Ответить
18. Terabaytus 02.03.21 17:06 Сейчас в теме
(16)Вот так всё заработало
&НаСервере
Процедура ПроверяемНаличиеПроведенияДокОтУчреж()
	
	ДатаДокумента = Дата(Объект.Дата);
	НомерДокумента = Объект.Номер;
	Организация = Объект.Организация;

	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	ДвиженияУФДляСписания.Период КАК ДатаУФ,
		|	ДвиженияУФДляСписания.Ресурс2 КАК НомерУФ,
		|	ДвиженияУФДляСписания.Ресурс3 КАК ОрганизацияУФ
		|ИЗ
		|	РегистрСведений.ДвиженияУФДляСписания КАК ДвиженияУФДляСписания 
		|ГДЕ
		|   Ресурс1 = &ДатаДокумента 
		|И
		|	Ресурс2 = &НомерДокумента "; 
		//|И
		//|   Ресурс3 = &Организация 
	
	    Запрос.УстановитьПараметр("ДатаДокумента", ДатаДокумента);
		Запрос.УстановитьПараметр("НомерДокумента", НомерДокумента);
		//Запрос.УстановитьПараметр("Организация", Организация);
		
		РезультатЗапроса = Запрос.Выполнить();
		
		Выборка = РезультатЗапроса.Выбрать();
	                         
	Пока Выборка.Следующий() Цикл	     
		
	ДатаУФ = Выборка.ДатаУФ;
	НомерУФ = Выборка.НомерУФ;
	ОрганизацияУФ = Выборка.ОрганизацияУФ; 
	                          
	КонецЦикла;
		Если ДатаУФ = ДатаДокумента Тогда 
			
			Если  НомерУФ = НомерДокумента Тогда
				           Сообщить("Работает0");
				//Если ОрганизацияУФ = Организация Тогда
					   Сообщить("Работает1");
					ЭтаФорма.Объект.ДокументГотовДляРедактирования = Истина;
				
					//КонецЕсли;
				
				КонецЕсли;
				
			КонецЕсли;

КонецПроцедуры
Показать

Осталось только ссылочный тип ОРГАНИЗАЦИЯ для отбора в запрос предать подскажите пожалуйста как это можно это сделать ?
19. spacecraft 02.03.21 17:33 Сейчас в теме
(18) Вы намеренно делаете как хуже?
Я так понял, что нужно найти по всем этим данным запись в РС, и если найдено, то проставить реквизит в истина.
Тогда так:
Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |    ДвиженияУФДляСписания.Период КАК ДатаУФ
        |ИЗ
        |    РегистрСведений.ДвиженияУФДляСписания КАК ДвиженияУФДляСписания 
        |ГДЕ
        |   Ресурс1 = &ДатаДокумента 
        |И
        |    Ресурс2 = &НомерДокумента
        |И
        |   Ресурс3 = &Организация";

    Запрос.УстановитьПараметр("ДатаДокумента", Объект.Дата);
    Запрос.УстановитьПараметр("НомерДокумента", Объект.Номер);
    Запрос.УстановитьПараметр("Организация", Объект.Организация);
        
    РезультатЗапроса = Запрос.Выполнить();
        
    Если НЕ РезультатЗапроса.Пустой() Тогда
        Объект.ДокументГотовДляРедактирования = Истина;
    КонецЕсли;
Показать
Terabaytus; +1 Ответить
20. Terabaytus 02.03.21 22:34 Сейчас в теме
(19)Спасибо, но к сожалению ваша конструкция не работает. РегСвед Ресурс3 в который записывается Организация имеет тип Строка это может влиять на сравнение с Объект.Организация ?
21. spacecraft 02.03.21 23:07 Сейчас в теме
(20)
РегСвед Ресурс3 в который записывается Организация имеет тип Строка

Неожиданный поворот. Серьезно? Сами делали регистр? Тренируетесь, или это на живой базе?
Почему не ссылочный тип справочника Организации?

Ну, только для Вас, наверно можно и так:
Запрос.УстановитьПараметр("Организация", Объект.Организация.Наименование);


Только никому не говорите, что это я так посоветовал.
Terabaytus; +1 Ответить
22. Terabaytus 03.03.21 08:49 Сейчас в теме
(21)Про ссылочный тип я писал выше видимо друг друга не поняли. Вы конечно не поверите, но я в РегСвед ставил соответствующие типы, но в тот момент это не работало, начал пробовать другие варианты. Ваш код прост как автомат Калашникова, у меня сразу вопрос, "А что так можно было" )) Да моя конструкция слишком длинная.
23. spacecraft 03.03.21 08:58 Сейчас в теме
(22) Верните в РС ссылочные типы. Так будет проще и надежнее.
Смотрите сами, пользователи возьмут и переименуют туже Организацию. И все. Данные РС устарели. По наименованию уже не будет искать. А ссылка при этом не поменяется.
oleg-x; Terabaytus; +2 Ответить
24. Terabaytus 03.03.21 09:07 Сейчас в теме
(23)Так и сделал. Полностью с вами согласен.
3. author77 02.03.21 12:37 Сейчас в теме
Условия в запрос почему не параметром передаются?

И в чем смысл запроса и перебора выборки, если в итоге в переменные попадает только последняя запись выборки?
Terabaytus; +1 Ответить
8. oleg-x 27 02.03.21 13:20 Сейчас в теме
(7) Это не строка, выше по коду присваивается из объекта. А судя по составу полей, это должен быть справочник организаций.
Просто у человека пока нет понимания как правильно делать.
Хотя данная конструкция и будет работать в данном случае и не важно что это "порнография" :-)
14. Terabaytus 02.03.21 16:34 Сейчас в теме
(8)Разъясните это "порнография" может привести к ошибке, краху базе данных или приложения в настоящем или в будущем ?
15. Sashares 34 02.03.21 16:47 Сейчас в теме
(14)Разъясняю. То что вы тут привели - это говнокод.
С такой реализацией чего-бы то ни было, удивительно, что вы работаете программистом.
У вас же знаний в этой области буквально ноль.
Почитайте хотя бы Радченко, "Практическое пособие разработчика", выполните сквозной пример.
17. oleg-x 27 02.03.21 17:02 Сейчас в теме
(14) По поводу кода в целом не скажу, так как не понимаю в каком контексте он выполняется.
А вот про этот случай распишу:
Запрос.УстановитьПараметр("ВыбРесурс3", Справочники.Организации.НайтиПоНаименованию(Организация));

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


Делая вывод из всего написанного, строка кода должна была выглядеть так:
Запрос.УстановитьПараметр("ВыбРесурс3", Организация);
//или
Запрос.УстановитьПараметр("ВыбРесурс3", Объект.Организация);
Terabaytus; +1 Ответить
Оставьте свое сообщение

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