Где ошибка в запросе ?

1. user876792 12.12.17 11:30 Сейчас в теме
В РегистрСведений.СобытияОС может быть три даты с одинаковым полем ИнвНомер и тремя разными полями Событие: "Принятие к учету", "Ввод в эксплуатацию" и "Списание". Обязательно присутствуют первые два, "Списание" может не быть.

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


В результате ДатаПринятияКУчету и ДатаСнятияСУчета - пустые поля.
По теме из базы знаний
Найденные решения
11. vadim1011985 99 12.12.17 11:44 Сейчас в теме
1)
Запрос.УстановитьПараметр("Событие1", "Принятие к учету");
Запрос.УстановитьПараметр("Событие2", "Списание");


В качестве параметра вы передаете тип строку посмотрите в регистре какого типа поле Событие и передайте правильные значения в параметр

2) Сам текст запроса составлен некорректно 2 побзапроса никак не объединены поэтому необходимо использовать вместо Выполнить() - ВыполнитьПакет() и каждый результат подзапросов обходить отдельно
user876792; +1 Ответить
16. vadim1011985 99 12.12.17 11:50 Сейчас в теме
(14)
Запрос.УстановитьПараметр("Событие1", Перечисления.ВидыСобытияОС.ПринятияКУчету);
user876792; +1 Ответить
27. Onwardv 64 12.12.17 13:56 Сейчас в теме
Давайте попробуем ещё раз. Копируйте, вставляйте у себя и пишите тут, что у Вас не сработало:
	Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
				|   СобытияОСПринятоКУчету.ДатаСобытия КАК ПринятоКУчету,
				|   СобытияОССнятосУчета.ДатаСобытия КАК СнятоСУчета
				|ИЗ
				|	РегистрСведений.СобытияОС КАК СобытияОСПринятоКУчету
				|Внутреннее соединение РегистрСведений.СобытияОС КАК СобытияОССнятосУчета
				|	ПО 
				|	СобытияОСПринятоКУчету.ИнвНомер = &СобИнвНомер
				|	И СобытияОСПринятоКУчету.Событие = &Событие1
				|	И СобытияОССнятосУчета.ИнвНомер = &СобИнвНомер
				|	И СобытияОССнятосУчета.Событие = &Событие2
				|	";
    
    Запрос.УстановитьПараметр("СобИнвНомер", ВыбранноеЗначение);
    Запрос.УстановитьПараметр("Событие1", Перечисления.ВидыСобытияОС.ПринятияКУчету);
    Запрос.УстановитьПараметр("Событие2", Перечисления.ВидыСобытияОС.Списание);
    
    Выборка = Запрос.Выполнить().Выбрать();
    Если Выборка.Количество()>1 Тогда
		СтрСоо="Запрос вернул более одной строки. Что-то пошло не так!!!";
		Сообщить(СтрСоо);
	КонецЕсли;
    Если Выборка.Следующий() Тогда
        ДатаПринятияКУчету = Выборка.ПринятоКУчету;
        ДатаСнятияСУчета = Выборка.СнятоСУчета;    
	Иначе
		СтрСоо="Запрос ничего не вернул!!!";
		Сообщить(СтрСоо);
    КонецЕсли;
Показать
user876792; +1 Ответить
31. Onwardv 64 12.12.17 14:13 Сейчас в теме
(29) Ага, понятно. Тогда надо использовать левое соединение. И для получения ПринятоКУчету вынести условие в где. Получится вот такой текст запроса:
    Запрос.Текст = "ВЫБРАТЬ
				|   СобытияОСПринятоКУчету.ДатаСобытия КАК ПринятоКУчету,
				|   ЕСТЬNULL(СобытияОССнятосУчета.ДатаСобытия,ДАТАВРЕМЯ(1,1,1)) КАК СнятоСУчета
				|ИЗ
				|	РегистрСведений.СобытияОС КАК СобытияОСПринятоКУчету
				|ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СобытияОС КАК СобытияОССнятосУчета
				|	ПО СобытияОССнятосУчета.ИнвНомер = &СобИнвНомер
				|	И СобытияОССнятосУчета.Событие = &Событие2
				|ГДЕ 
				|	СобытияОСПринятоКУчету.ИнвНомер = &СобИнвНомер
				|	И СобытияОСПринятоКУчету.Событие = &Событие1
				|	";
Показать
user876792; +1 Ответить
Остальные ответы
Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
2. spacecraft 12.12.17 11:35 Сейчас в теме
(1)
В результате ДатаПринятияКУчету и ДатаСнятияСУчета - пустые поля.

Это еще "повезло", что для данного "СобИнвНомер" не было списания.
В данном случае имеется пакет запросов.
И выполняется/обрабатывается последний, тот что списания отбирает.
Если нет списания, то и запрос будет пустой и в цикл Пока Выборка.Следующий() просто не заходит.
user876792; +1 Ответить
4. user876792 12.12.17 11:37 Сейчас в теме
(2) Списание есть, специально выбираю инвномер где есть все три варианта
8. user876792 12.12.17 11:40 Сейчас в теме
(2) Он и без пакета почему то не работает, когда только первая часть где Событие1
10. spacecraft 12.12.17 11:43 Сейчас в теме
(8) СобытияОС.ИнвНомер.Ссылка = &СобИнвНомер
требует ссылку, а передается число. Условие никогда не выполняется. Запрос возвращается пустой.
В цикл не заходит.
Если переделать на правильное условие и все же зайдет в цикл, то выдаст ошибку, что поле Принятокучету не найдено. Это при условии первоначального пакета запросов.
20. user876792 12.12.17 12:05 Сейчас в теме
(2)
И выполняется/обрабатывается последний, тот что списания отбирает.

Как сделать чтобы обрабатывались оба запроса ?
24. spacecraft 12.12.17 13:23 Сейчас в теме
(20) судя по циклу нужна не отдельная их обработка. Тогда пакет запроса не нужен. Нужно объединение запросов.
7. sssss_aaaaa_2011 12.12.17 11:40 Сейчас в теме
(1) А какого типа у вас реквизит Событие? Точно строка? Или таки СправочникСсылка.СобытияОС?
user876792; +1 Ответить
9. user876792 12.12.17 11:42 Сейчас в теме
(7) ПеречислениеСсылка.ВидыСобытийОС
13. sssss_aaaaa_2011 12.12.17 11:45 Сейчас в теме
(9)Тогда какого....передаете строку? Думаете само найдется?
12. starjevschik 12.12.17 11:45 Сейчас в теме
(1) везде здесь ошибка. Автору запроса было бы очень полезно немного подучиться - понять, что такое база данных, как она устроена, как к ней пишутся запросы. Для этого лучше брать какой-нибудь курс по базам данных и языку SQL, а не по 1с. Т.к. 1с этому не учит принципиально. Хорошей книжки будет достаточно.

Неужели у вас там Событие имеет тип "Строка"? Тогда и автору конфигурации тоже стоит идти учиться, а лучше ему сразу голову открутить, чтобы больше такого не писал.
user876792; +1 Ответить
15. user876792 12.12.17 11:49 Сейчас в теме
(12) Событие - ПеречислениеСсылка.ВидыСобытийОС. Как правильно передать его в параметр?
3. Skill 12.12.17 11:36 Сейчас в теме
Что у вас лежит в "ВыбранноеЗначение"
5. user876792 12.12.17 11:38 Сейчас в теме
(3) Инвентарный номер тип число
6. spacecraft 12.12.17 11:39 Сейчас в теме
(5) СобытияОС.ИнвНомер.Ссылка = &СобИнвНомер
И тип число совсем не выполняется условие. Снова имеем, что в цикл не заходит.
11. vadim1011985 99 12.12.17 11:44 Сейчас в теме
1)
Запрос.УстановитьПараметр("Событие1", "Принятие к учету");
Запрос.УстановитьПараметр("Событие2", "Списание");


В качестве параметра вы передаете тип строку посмотрите в регистре какого типа поле Событие и передайте правильные значения в параметр

2) Сам текст запроса составлен некорректно 2 побзапроса никак не объединены поэтому необходимо использовать вместо Выполнить() - ВыполнитьПакет() и каждый результат подзапросов обходить отдельно
user876792; +1 Ответить
14. user876792 12.12.17 11:48 Сейчас в теме
(11) Событие - ПеречислениеСсылка.ВидыСобытийОС. Как правильно передать его в параметр?
16. vadim1011985 99 12.12.17 11:50 Сейчас в теме
(14)
Запрос.УстановитьПараметр("Событие1", Перечисления.ВидыСобытияОС.ПринятияКУчету);
user876792; +1 Ответить
17. sssss_aaaaa_2011 12.12.17 11:55 Сейчас в теме
(16) Скорее всего таки Перечисления.ВидыСобытияОС.ПринятиЕКУчету
user876792; +1 Ответить
18. vadim1011985 99 12.12.17 11:59 Сейчас в теме
(17) Наверно, писал по памяти. мог ошибиться , главное смысл показать
19. sssss_aaaaa_2011 12.12.17 12:04 Сейчас в теме
(18) Да я не в претензии. Просто, судя по вопросам топикстартера, он не догадается скопировать нужное значение в конфигураторе, а просто скопирует отсюда и опять обломится.
21. user876792 12.12.17 12:10 Сейчас в теме
(19) Не ну до этого уж он догадается. Разве только по невнимательности не заметит
22. Onwardv 64 12.12.17 12:45 Сейчас в теме
(21) Это не первая тема, где автор демонстрирует пробелы в знаниях элементарных вещей. Прогресса пока не видно:
https://forum.infostart.ru/forum9/topic183004/
23. user876792 12.12.17 12:54 Сейчас в теме
(22) Когда вы писали свои первые запросы много прогресса у вас было видно за один день?
25. Onwardv 64 12.12.17 13:33 Сейчас в теме
(23) я Вам всё сделал. Вам осталось только скопировать -вставить текст запроса. Если я правильно понял, то Вы этого не смогли. Почему?
Повторяю текст запроса:
ВЫБРАТЬ
       СобытияОСПринятоКУчету.ДатаСобытия КАК Принятокучету,
       СобытияОССнятосУчета.ДатаСобытия КАК Снятосучета
    ИЗ
        РегистрСведений.СобытияОС КАК СобытияОСПринятоКУчету
    Внутреннее соединение РегистрСведений.СобытияОС КАК СобытияОССнятосУчета
        ПО 
        СобытияОСПринятоКУчету.ИнвНомер = &СобИнвНомер
        И СобытияОСПринятоКУчету.Событие = &Событие1
        И СобытияОССнятосУчета.ИнвНомер = &СобИнвНомер
        И СобытияОССнятосУчета.Событие = &Событие2
Показать
30. user876792 12.12.17 14:05 Сейчас в теме
(25) Банально не разобрался с параметрами, а потом завяз в куче других ответов
26. Onwardv 64 12.12.17 13:39 Сейчас в теме
(23) А если по этой теме, то вы используете пакет запросов. Пакет формирует несколько таблиц.
Командой же выполнить() берется только последний. Там у Вас списание. А Вы пытаетесь получить и Принятокучету. Должна быть ошибка. Раз ошибки нет, значит условие Выборка.Следующий() не срабатывает, то есть Ваш запрос возвращает пустоту.

Для получения результата пакетов необходимо использовать ВыполнитьПакет(), который возвращает массив результатов. Вот полученный массив и необходимо обрабатывать.
user876792; +1 Ответить
27. Onwardv 64 12.12.17 13:56 Сейчас в теме
Давайте попробуем ещё раз. Копируйте, вставляйте у себя и пишите тут, что у Вас не сработало:
	Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
				|   СобытияОСПринятоКУчету.ДатаСобытия КАК ПринятоКУчету,
				|   СобытияОССнятосУчета.ДатаСобытия КАК СнятоСУчета
				|ИЗ
				|	РегистрСведений.СобытияОС КАК СобытияОСПринятоКУчету
				|Внутреннее соединение РегистрСведений.СобытияОС КАК СобытияОССнятосУчета
				|	ПО 
				|	СобытияОСПринятоКУчету.ИнвНомер = &СобИнвНомер
				|	И СобытияОСПринятоКУчету.Событие = &Событие1
				|	И СобытияОССнятосУчета.ИнвНомер = &СобИнвНомер
				|	И СобытияОССнятосУчета.Событие = &Событие2
				|	";
    
    Запрос.УстановитьПараметр("СобИнвНомер", ВыбранноеЗначение);
    Запрос.УстановитьПараметр("Событие1", Перечисления.ВидыСобытияОС.ПринятияКУчету);
    Запрос.УстановитьПараметр("Событие2", Перечисления.ВидыСобытияОС.Списание);
    
    Выборка = Запрос.Выполнить().Выбрать();
    Если Выборка.Количество()>1 Тогда
		СтрСоо="Запрос вернул более одной строки. Что-то пошло не так!!!";
		Сообщить(СтрСоо);
	КонецЕсли;
    Если Выборка.Следующий() Тогда
        ДатаПринятияКУчету = Выборка.ПринятоКУчету;
        ДатаСнятияСУчета = Выборка.СнятоСУчета;    
	Иначе
		СтрСоо="Запрос ничего не вернул!!!";
		Сообщить(СтрСоо);
    КонецЕсли;
Показать
user876792; +1 Ответить
28. spacecraft 12.12.17 14:03 Сейчас в теме
(27) если у данного элемента не было списания, то будет: "Запрос ничего не вернул!!!".
29. user876792 12.12.17 14:04 Сейчас в теме
Если есть принятие и снятие выводит две даты как нужно. Если есть только принятие - Запрос ничего не вернул!!!, но в этом случае должна выводится дата принятия, а списание оставаться пустой.
31. Onwardv 64 12.12.17 14:13 Сейчас в теме
(29) Ага, понятно. Тогда надо использовать левое соединение. И для получения ПринятоКУчету вынести условие в где. Получится вот такой текст запроса:
    Запрос.Текст = "ВЫБРАТЬ
				|   СобытияОСПринятоКУчету.ДатаСобытия КАК ПринятоКУчету,
				|   ЕСТЬNULL(СобытияОССнятосУчета.ДатаСобытия,ДАТАВРЕМЯ(1,1,1)) КАК СнятоСУчета
				|ИЗ
				|	РегистрСведений.СобытияОС КАК СобытияОСПринятоКУчету
				|ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СобытияОС КАК СобытияОССнятосУчета
				|	ПО СобытияОССнятосУчета.ИнвНомер = &СобИнвНомер
				|	И СобытияОССнятосУчета.Событие = &Событие2
				|ГДЕ 
				|	СобытияОСПринятоКУчету.ИнвНомер = &СобИнвНомер
				|	И СобытияОСПринятоКУчету.Событие = &Событие1
				|	";
Показать
user876792; +1 Ответить
32. user876792 12.12.17 14:32 Сейчас в теме
(31) Первое Если и Иначе больше не нужны?
33. Onwardv 64 12.12.17 14:33 Сейчас в теме
Оставьте свое сообщение

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