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

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 26 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 26 02.03.21 17:02 Сейчас в теме
(14) По поводу кода в целом не скажу, так как не понимаю в каком контексте он выполняется.
А вот про этот случай распишу:
Запрос.УстановитьПараметр("ВыбРесурс3", Справочники.Организации.НайтиПоНаименованию(Организация));

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


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

Руководитель направления 1С
Москва
зарплата от 350 000 руб.
Полный день

1С Программист
Москва
зарплата от 180 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)