Разные результаты запроса в Консоли и ФормеВыбора

1. Temych-spb 21.06.20 23:05 Сейчас в теме
Есть самописная 1С 8.3. Недавно попросили внести изменения в программе.
Ситуация следующая: некое оборудование изменило место базировки, что фиксируется в Регистре Сведений на 7:00 сегодняшнего дня. В этот же день, например в 8:00, я хочу выдать это оборудование с этой базы на работы, но в выпадающем списке его нет (этот список выдаёт то оборудование, которое находится на этой базе, свободное и исправное), а появляется только, если поменяем дату на следующую. Список как бы игнорирует весь день, хотя Регистр Сведений сделан "В пределах секунды".
Реализовано это следующим способом:
В справочнике "Оборудование" есть ФормаВыбораСостояние, в которой прописан произвольный запрос (Динамический список):
ВЫБРАТЬ
	БазировкаСрезПоследних.Оборудование КАК Оборудование,
	БазировкаСрезПоследних.АдресБазы КАК АдресБазы,
	СостояниеСрезПоследних.Состояние КАК Состояние
ПОМЕСТИТЬ АдресСостояние
ИЗ
	РегистрСведений.Базировка.СрезПоследних(ДОБАВИТЬКДАТЕ(&Период, СЕКУНДА, &Время * 3600), ) КАК БазировкаСрезПоследних
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.Состояние.СрезПоследних (ДОБАВИТЬКДАТЕ(&Период, СЕКУНДА, &Время * 3600), ) КАК СостояниеСрезПоследних
		ПО БазировкаСрезПоследних.Оборудование = СостояниеСрезПоследних.Оборудование
ГДЕ
	БазировкаСрезПоследних.АдресБазы = &АдресБазы
	И СостояниеСрезПоследних.Состояние = &Состояние
	И НЕ БазировкаСрезПоследних.Оборудование В
				(ВЫБРАТЬ
					РегистрАрендыОстаткиИОбороты.Оборудование КАК Оборудование
				ИЗ
					РегистрНакопления.РегистрАренды.ОстаткиИОбороты
                                            (ДОБАВИТЬКДАТЕ(&Период, СЕКУНДА, &Время * 3600), 
                                             ДОБАВИТЬКДАТЕ(&Период, СЕКУНДА, &Время * 3600 + 1), , , ) 
                                        КАК РегистрАрендыОстаткиИОбороты)
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	СправочникОборудование.Ссылка КАК Ссылка,
	СправочникОборудование.ИнвентарныйНомер КАК ИнвентарныйНомер,
	СправочникОборудование.Наименование КАК Наименование,
	АдресСостояние.Оборудование КАК Оборудование
ИЗ
	АдресСостояние КАК АдресСостояние
		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Оборудование КАК СправочникОборудование
		ПО АдресСостояние.Оборудование = СправочникОборудование.Ссылка
Показать

В модуле этой формы выбора прописано:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	Список.Параметры.УстановитьЗначениеПараметра("Период", Параметры.Период);
	Список.Параметры.УстановитьЗначениеПараметра("АдресБазы", Параметры.АдресБазы);
	Список.Параметры.УстановитьЗначениеПараметра("Состояние", Параметры.Состояние);
	Список.Параметры.УстановитьЗначениеПараметра("Время", Параметры.Время);
КонецПроцедуры
Показать


Привязка Формы Выбора сделана в Документе через вкладку "Использование" - "ФормаВыбора", там же указаны параметры (см. прикреплённый файл).

РегистрСведений.Базировка, РегистрСведений.Состояние изначально были "В пределах дня" теперь я их сделал "В пределах секунды". Дата и время берутся из даты документа и числового значения из формы документа (указываются только часы, для упрощения ввода информации).

Если выше обозначенный запрос из Формы Выбора прогнать через Консоль Запросов, то в результате запроса оборудование, сменившее базировку) появляется в тот же день (после 7:00), и это показывает, что со стороны записей в регистрах и в самом запросе нет ошибок. Но когда этот же запрос выполняется через форму выбора, то оборудование появляется только через день, как бы не извращался с часами в записях регистров. Как-будто бы он игнорирует часовые показатели, как если бы регистры были бы с периодом "В пределах дня".

Может как-то по другому нужно задавать параметры для Даты и времени в динамическом списке?
Прикрепленные файлы:
Найденные решения
18. Temych-spb 22.06.20 19:43 Сейчас в теме
(17) Да, действительно, если передавать конечный результат, то работает, вот изменил в модуле текст более простой ФормыВыбора (в посте (16) ):
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	МояДата=Параметры.Период;
	МоеВремя=Параметры.Время;
	Список.Параметры.УстановитьЗначениеПараметра("Период", Дата(Год(МояДата),Месяц(МояДата),День(МояДата),МоеВремя,00,00));
	Список.Параметры.УстановитьЗначениеПараметра("АдресБазы", Параметры.АдресБазы);
КонецПроцедуры


Это первое, что пришло на ум, может будет более изящное решение?
19. Sashares 35 22.06.20 20:02 Сейчас в теме
(18) У вас вполне нормальный вариант, но в качестве альтернативы:
ПериодДляЗапроса = НачалоДня(Параметры.Период) + МоеВремя*3600;


Только добавить проверку, что Параметры.Период - не пустая дата.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. dandykry 11 22.06.20 13:25 Сейчас в теме
(1)
Схема = Список.ПолучитьИсполняемуюСхемуКомпоновкиДанных();
Настройки = Список.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();

(могу чуть ошибиться, но в синтекстс-помощнике подсмотрите)

Схема.НаборыДанных.НаборДанных1.Текст - посмотрите какой текст в реальности исполняется

Настройки.Отбор.Элементы
Настрйоки.параметрыДанных.Элементы - посмотрите, все ли параметры установили правильно
Temych-spb; +1 Ответить
3. nomad_irk 76 22.06.20 13:33 Сейчас в теме
(1)при открытии формы выбора никаких отборов по периоду(следующий день) не устанавливается?
7. Temych-spb 22.06.20 15:15 Сейчас в теме
(3) Нет, всё где мог что-то исправить указал в первом посте.
4. nomad_irk 76 22.06.20 14:04 Сейчас в теме
(1)
Дата и время берутся из даты документа и числового значения из формы документа (указываются только часы, для упрощения ввода информации)


Какая дата и время в документе перед открытием формы выбора?
Предполагаю, что необходимо приводить

Список.Параметры.УстановитьЗначениеПараметра("Период", Параметры.Период);

к началу дня, т.е.

Список.Параметры.УстановитьЗначениеПараметра("Период", НачалоДня(Параметры.Период));
Temych-spb; +1 Ответить
5. Temych-spb 22.06.20 15:12 Сейчас в теме
(4) Поставил НачалоДня - без изменений.

Ставил точку останова в модуле на параметрах - при обработке было видно, что Параметр.Период = началу дня (Дата с нулями).
6. nomad_irk 76 22.06.20 15:15 Сейчас в теме
(5)
Вот здесь
Список.Параметры.УстановитьЗначениеПараметра("Время", Параметры.Время);

правильно понимаю, что Параметры.Время при остановке отладки было равно числу 8?
8. Temych-spb 22.06.20 15:39 Сейчас в теме
10. nomad_irk 76 22.06.20 16:00 Сейчас в теме
(8)А можете весь процесс открытия формы выбора отладкой прогнать пошагово(F11), а то там может что-то еще происходит с параметрами формы?
12. Temych-spb 22.06.20 16:21 Сейчас в теме
(10) Параметры проверял, все 4 какие нужно.
Дата на начало дня.
Нужная база.
Состояние - "Вэксплуатации"
Число - указанное в форме (от 1 до 23).

Такие же указывал и когда пользовался Консолью запросов - там происходил отбор правильно, с учётом времени.
9. Sashares 35 22.06.20 15:57 Сейчас в теме
(1)
(ДОБАВИТЬКДАТЕ(&Период, СЕКУНДА, &Время * 3600),
ДОБАВИТЬКДАТЕ(&Период, СЕКУНДА, &Время * 3600 + 1)


Так себе решение, если честно.
Если вы знаете в при создании на сервере и &период и &время, так посчитайте сразу результат, и заполните один параметр, чтобы в запрос передать окончательное значение.
11. Sashares 35 22.06.20 16:02 Сейчас в теме
(1)
(ВЫБРАТЬ
РегистрАрендыОстаткиИОбороты.Оборудование КАК Оборудование
ИЗ
РегистрНакопления.РегистрАренды.ОстаткиИОбороты
(ДОБАВИТЬКДАТЕ(&Период, СЕКУНДА, &Время * 3600),
ДОБАВИТЬКДАТЕ(&Период, СЕКУНДА, &Время * 3600 + 1), , , )
КАК РегистрАрендыОстаткиИОбороты)


Также не очень понятно, зачем это в динамическом списке.
Раз уж задаете параметры, так в при создании на сервере заполните еще параметр &Оборудование, который нужно исключить из динамического списка.
Temych-spb; +1 Ответить
13. Temych-spb 22.06.20 16:25 Сейчас в теме
(11) Не претендую на идеальность решения, но оно пока нас удовлетворяло.

Идея была исключить из списка то оборудование, которое уже было выдано к этому моменту времени.
14. Sashares 35 22.06.20 16:37 Сейчас в теме
(13) Так получите его запросом в При создании на сервере и передайте в параметр массив.
Сейчас у вас какая то дичь, если честно - к таблице остатки и обороты с параметрами начало и окончание, которые отличаются на секунду. Это вот зачем?
15. Sashares 35 22.06.20 16:45 Сейчас в теме
(13) Вот например запрос
ВЫБРАТЬ
    СправочникОборудование.Ссылка КАК Ссылка,
    СправочникОборудование.ИнвентарныйНомер КАК ИнвентарныйНомер,
    СправочникОборудование.Наименование КАК Наименование
ИЗ
    Справочник.Оборудование КАК СправочникОборудование
    	ВНУТРЕННЕЕ СОЕДИНЕНИЕ  РегистрСведений.Базировка.СрезПоследних(&ПериодСреза, ) КАК БазировкаСрезПоследних
    	ПО СправочникОборудование.Ссылка = БазировкаСрезПоследних.Оборудование       
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ  РегистрСведений.Состояние.СрезПоследних(&ПериодСреза, ) КАК СостояниеСрезПоследних
    	ПО СправочникОборудование.Ссылка = СостояниеСрезПоследних.Оборудование
ГДЕ	
    БазировкаСрезПоследних.АдресБазы = &АдресБазы
    И СостояниеСрезПоследних.Состояние = &Состояние
    И НЕ СправочникОборудование.Ссылка В (&ИсключаемоеОборудование)
Показать


Отлаживать его будет как минимум, значительно проще. Да и работать должно быстрее, чем с временными таблицами и регистром накопления в запросе.
Temych-spb; +1 Ответить
16. Temych-spb 22.06.20 19:14 Сейчас в теме
(15) Идея понятна, но с этим разберусь попозже.

Но вот аналогичный запрос, но попроще, ведёт себя точно также:
ВЫБРАТЬ
	СправочникОборудование.Наименование КАК Наименование,
	СправочникОборудование.ИнвентарныйНомер КАК ИнвентарныйНомер,
	БазировкаСрезПоследних.АдресБазы КАК АдресБазы,
	БазировкаСрезПоследних.Период КАК Период
ИЗ
	РегистрСведений.Базировка.СрезПоследних(ДОБАВИТЬКДАТЕ(&Период, СЕКУНДА, &Время * 3600), ) КАК БазировкаСрезПоследних
		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Оборудование КАК СправочникОборудование
		ПО БазировкаСрезПоследних.Оборудование = СправочникОборудование.Ссылка
ГДЕ
	БазировкаСрезПоследних.АдресБазы = &АдресБазы
Показать
17. Sashares 35 22.06.20 19:24 Сейчас в теме
(16)Я бы все-таки изменил период, чтобы в запрос передавалось сразу конечное значение.
Если вы меняете параметры периода, и данные появляются/пропадают, то вероятно, что-то с периодом не так.
Либо что-то не так с другими отборами.
Либо данных в базе нет, подходящих под отборы.
Temych-spb; +1 Ответить
18. Temych-spb 22.06.20 19:43 Сейчас в теме
(17) Да, действительно, если передавать конечный результат, то работает, вот изменил в модуле текст более простой ФормыВыбора (в посте (16) ):
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	МояДата=Параметры.Период;
	МоеВремя=Параметры.Время;
	Список.Параметры.УстановитьЗначениеПараметра("Период", Дата(Год(МояДата),Месяц(МояДата),День(МояДата),МоеВремя,00,00));
	Список.Параметры.УстановитьЗначениеПараметра("АдресБазы", Параметры.АдресБазы);
КонецПроцедуры


Это первое, что пришло на ум, может будет более изящное решение?
19. Sashares 35 22.06.20 20:02 Сейчас в теме
(18) У вас вполне нормальный вариант, но в качестве альтернативы:
ПериодДляЗапроса = НачалоДня(Параметры.Период) + МоеВремя*3600;


Только добавить проверку, что Параметры.Период - не пустая дата.
20. Temych-spb 22.06.20 22:54 Сейчас в теме
(19) В итоге пришлось переделывать целиком всю схему из первого поста и последовал вашему совету.

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

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	СправочникОборудование.Ссылка КАК Ссылка,
	СправочникОборудование.ИнвентарныйНомер КАК ИнвентарныйНомер,
	СправочникОборудование.Наименование КАК Наименование,
	АдресСостояние.Оборудование КАК Оборудование
ИЗ
	АдресСостояние КАК АдресСостояние
		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Оборудование КАК СправочникОборудование
		ПО АдресСостояние.Оборудование = СправочникОборудование.Ссылка
Показать


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


Проверил, действительно секунда ни как не влияет на отбор значений, поэтому начало и конец периода равны.
21. Sashares 35 22.06.20 23:03 Сейчас в теме
(20)Тогда зачем таблица ОстаткиИОбороты? =)
В этом случае достаточно таблицы остатков.
И параметр периода в запросе тоже стоит сделать нормальным
22. Temych-spb 22.06.20 23:09 Сейчас в теме
(21)
Тогда зачем таблица ОстаткиИОбороты? =)


Мне нужно, чтобы в таблицу попадало то, что уже выдано на этот момент..., т.е. можно использовать:

ВЫБРАТЬ
	РегистрАрендыОстатки.Оборудование КАК Оборудование,
	
ИЗ
	РегистрНакопления.РегистрАренды.Остатки(ДОБАВИТЬКДАТЕ(&ПериодАренды, СЕКУНДА, &ВремяАренды * 3600+1), ) КАК РегистрАрендыОстатки


(21)
И параметр периода в запросе тоже стоит сделать нормальным


То есть?
23. Sashares 35 23.06.20 00:37 Сейчас в теме
(22)
То есть?

ДОБАВИТЬКДАТЕ(&ПериодАренды, СЕКУНДА, &ВремяАренды * 3600+1)

Не вычислять его в запросе, а передать нужное значение сразу.

(22)
Мне нужно, чтобы в таблицу попадало то, что уже выдано на этот момент..., т.е. можно использовать


По результату это не отличается от того, что вы получали в исходном запросе.
Оставьте свое сообщение

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