В РегистрСведений.СобытияОС может быть три даты с одинаковым полем ИнвНомер и тремя разными полями Событие: "Принятие к учету", "Ввод в эксплуатацию" и "Списание". Обязательно присутствуют первые два, "Списание" может не быть.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СобытияОС.ДатаСобытия КАК Принятокучету
|ИЗ
| РегистрСведений.СобытияОС КАК СобытияОС
|ГДЕ
| СобытияОС.ИнвНомер.Ссылка = &СобИнвНомер
| И СобытияОС.Событие = &Событие1
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| СобытияОС.ДатаСобытия КАК Списание
|ИЗ
| РегистрСведений.СобытияОС КАК СобытияОС
|ГДЕ
| СобытияОС.ИнвНомер.Ссылка = &СобИнвНомер
| И СобытияОС.Событие = &Событие2";
Запрос.УстановитьПараметр("СобИнвНомер", ВыбранноеЗначение);
Запрос.УстановитьПараметр("Событие1", "Принятие к учету");
Запрос.УстановитьПараметр("Событие2", "Списание");
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ДатаПринятияКУчету = Выборка.Принятокучету;
ДатаСнятияСУчета = Выборка.Списание;
КонецЦикла;
Показать
В результате ДатаПринятияКУчету и ДатаСнятияСУчета - пустые поля.
Запрос.УстановитьПараметр("Событие1", "Принятие к учету");
Запрос.УстановитьПараметр("Событие2", "Списание");
В качестве параметра вы передаете тип строку посмотрите в регистре какого типа поле Событие и передайте правильные значения в параметр
2) Сам текст запроса составлен некорректно 2 побзапроса никак не объединены поэтому необходимо использовать вместо Выполнить() - ВыполнитьПакет() и каждый результат подзапросов обходить отдельно
Давайте попробуем ещё раз. Копируйте, вставляйте у себя и пишите тут, что у Вас не сработало:
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| СобытияОСПринятоКУчету.ДатаСобытия КАК ПринятоКУчету,
| СобытияОССнятосУчета.ДатаСобытия КАК СнятоСУчета
|ИЗ
| РегистрСведений.СобытияОС КАК СобытияОСПринятоКУчету
|Внутреннее соединение РегистрСведений.СобытияОС КАК СобытияОССнятосУчета
| ПО
| СобытияОСПринятоКУчету.ИнвНомер = &СобИнвНомер
| И СобытияОСПринятоКУчету.Событие = &Событие1
| И СобытияОССнятосУчета.ИнвНомер = &СобИнвНомер
| И СобытияОССнятосУчета.Событие = &Событие2
| ";
Запрос.УстановитьПараметр("СобИнвНомер", ВыбранноеЗначение);
Запрос.УстановитьПараметр("Событие1", Перечисления.ВидыСобытияОС.ПринятияКУчету);
Запрос.УстановитьПараметр("Событие2", Перечисления.ВидыСобытияОС.Списание);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Количество()>1 Тогда
СтрСоо="Запрос вернул более одной строки. Что-то пошло не так!!!";
Сообщить(СтрСоо);
КонецЕсли;
Если Выборка.Следующий() Тогда
ДатаПринятияКУчету = Выборка.ПринятоКУчету;
ДатаСнятияСУчета = Выборка.СнятоСУчета;
Иначе
СтрСоо="Запрос ничего не вернул!!!";
Сообщить(СтрСоо);
КонецЕсли;
В результате ДатаПринятияКУчету и ДатаСнятияСУчета - пустые поля.
Это еще "повезло", что для данного "СобИнвНомер" не было списания.
В данном случае имеется пакет запросов.
И выполняется/обрабатывается последний, тот что списания отбирает.
Если нет списания, то и запрос будет пустой и в цикл Пока Выборка.Следующий() просто не заходит.
(8) СобытияОС.ИнвНомер.Ссылка = &СобИнвНомер
требует ссылку, а передается число. Условие никогда не выполняется. Запрос возвращается пустой.
В цикл не заходит.
Если переделать на правильное условие и все же зайдет в цикл, то выдаст ошибку, что поле Принятокучету не найдено. Это при условии первоначального пакета запросов.
(1) везде здесь ошибка. Автору запроса было бы очень полезно немного подучиться - понять, что такое база данных, как она устроена, как к ней пишутся запросы. Для этого лучше брать какой-нибудь курс по базам данных и языку SQL, а не по 1с. Т.к. 1с этому не учит принципиально. Хорошей книжки будет достаточно.
Неужели у вас там Событие имеет тип "Строка"? Тогда и автору конфигурации тоже стоит идти учиться, а лучше ему сразу голову открутить, чтобы больше такого не писал.
Запрос.УстановитьПараметр("Событие1", "Принятие к учету");
Запрос.УстановитьПараметр("Событие2", "Списание");
В качестве параметра вы передаете тип строку посмотрите в регистре какого типа поле Событие и передайте правильные значения в параметр
2) Сам текст запроса составлен некорректно 2 побзапроса никак не объединены поэтому необходимо использовать вместо Выполнить() - ВыполнитьПакет() и каждый результат подзапросов обходить отдельно
(18) Да я не в претензии. Просто, судя по вопросам топикстартера, он не догадается скопировать нужное значение в конфигураторе, а просто скопирует отсюда и опять обломится.
(23) я Вам всё сделал. Вам осталось только скопировать -вставить текст запроса. Если я правильно понял, то Вы этого не смогли. Почему?
Повторяю текст запроса:
ВЫБРАТЬ
СобытияОСПринятоКУчету.ДатаСобытия КАК Принятокучету,
СобытияОССнятосУчета.ДатаСобытия КАК Снятосучета
ИЗ
РегистрСведений.СобытияОС КАК СобытияОСПринятоКУчету
Внутреннее соединение РегистрСведений.СобытияОС КАК СобытияОССнятосУчета
ПО
СобытияОСПринятоКУчету.ИнвНомер = &СобИнвНомер
И СобытияОСПринятоКУчету.Событие = &Событие1
И СобытияОССнятосУчета.ИнвНомер = &СобИнвНомер
И СобытияОССнятосУчета.Событие = &Событие2
(23) А если по этой теме, то вы используете пакет запросов. Пакет формирует несколько таблиц.
Командой же выполнить() берется только последний. Там у Вас списание. А Вы пытаетесь получить и Принятокучету. Должна быть ошибка. Раз ошибки нет, значит условие Выборка.Следующий() не срабатывает, то есть Ваш запрос возвращает пустоту.
Для получения результата пакетов необходимо использовать ВыполнитьПакет(), который возвращает массив результатов. Вот полученный массив и необходимо обрабатывать.
Давайте попробуем ещё раз. Копируйте, вставляйте у себя и пишите тут, что у Вас не сработало:
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| СобытияОСПринятоКУчету.ДатаСобытия КАК ПринятоКУчету,
| СобытияОССнятосУчета.ДатаСобытия КАК СнятоСУчета
|ИЗ
| РегистрСведений.СобытияОС КАК СобытияОСПринятоКУчету
|Внутреннее соединение РегистрСведений.СобытияОС КАК СобытияОССнятосУчета
| ПО
| СобытияОСПринятоКУчету.ИнвНомер = &СобИнвНомер
| И СобытияОСПринятоКУчету.Событие = &Событие1
| И СобытияОССнятосУчета.ИнвНомер = &СобИнвНомер
| И СобытияОССнятосУчета.Событие = &Событие2
| ";
Запрос.УстановитьПараметр("СобИнвНомер", ВыбранноеЗначение);
Запрос.УстановитьПараметр("Событие1", Перечисления.ВидыСобытияОС.ПринятияКУчету);
Запрос.УстановитьПараметр("Событие2", Перечисления.ВидыСобытияОС.Списание);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Количество()>1 Тогда
СтрСоо="Запрос вернул более одной строки. Что-то пошло не так!!!";
Сообщить(СтрСоо);
КонецЕсли;
Если Выборка.Следующий() Тогда
ДатаПринятияКУчету = Выборка.ПринятоКУчету;
ДатаСнятияСУчета = Выборка.СнятоСУчета;
Иначе
СтрСоо="Запрос ничего не вернул!!!";
Сообщить(СтрСоо);
КонецЕсли;
Если есть принятие и снятие выводит две даты как нужно. Если есть только принятие - Запрос ничего не вернул!!!, но в этом случае должна выводится дата принятия, а списание оставаться пустой.