Разные результаты запроса в Консоли и ФормеВыбора
Есть самописная 1С 8.3. Недавно попросили внести изменения в программе.
Ситуация следующая: некое оборудование изменило место базировки, что фиксируется в Регистре Сведений на 7:00 сегодняшнего дня. В этот же день, например в 8:00, я хочу выдать это оборудование с этой базы на работы, но в выпадающем списке его нет (этот список выдаёт то оборудование, которое находится на этой базе, свободное и исправное), а появляется только, если поменяем дату на следующую. Список как бы игнорирует весь день, хотя Регистр Сведений сделан "В пределах секунды".
Реализовано это следующим способом:
В справочнике "Оборудование" есть ФормаВыбораСостояние, в которой прописан произвольный запрос (Динамический список):
В модуле этой формы выбора прописано:
Привязка Формы Выбора сделана в Документе через вкладку "Использование" - "ФормаВыбора", там же указаны параметры (см. прикреплённый файл).
РегистрСведений.Базировка, РегистрСведений.Состояние изначально были "В пределах дня" теперь я их сделал "В пределах секунды". Дата и время берутся из даты документа и числового значения из формы документа (указываются только часы, для упрощения ввода информации).
Если выше обозначенный запрос из Формы Выбора прогнать через Консоль Запросов, то в результате запроса оборудование, сменившее базировку) появляется в тот же день (после 7:00), и это показывает, что со стороны записей в регистрах и в самом запросе нет ошибок. Но когда этот же запрос выполняется через форму выбора, то оборудование появляется только через день, как бы не извращался с часами в записях регистров. Как-будто бы он игнорирует часовые показатели, как если бы регистры были бы с периодом "В пределах дня".
Может как-то по другому нужно задавать параметры для Даты и времени в динамическом списке?
Ситуация следующая: некое оборудование изменило место базировки, что фиксируется в Регистре Сведений на 7:00 сегодняшнего дня. В этот же день, например в 8:00, я хочу выдать это оборудование с этой базы на работы, но в выпадающем списке его нет (этот список выдаёт то оборудование, которое находится на этой базе, свободное и исправное), а появляется только, если поменяем дату на следующую. Список как бы игнорирует весь день, хотя Регистр Сведений сделан "В пределах секунды".
Реализовано это следующим способом:
В справочнике "Оборудование" есть ФормаВыбораСостояние, в которой прописан произвольный запрос (Динамический список):
ВЫБРАТЬ
БазировкаСрезПоследних.Оборудование КАК Оборудование,
БазировкаСрезПоследних.АдресБазы КАК АдресБазы,
СостояниеСрезПоследних.Состояние КАК Состояние
ПОМЕСТИТЬ АдресСостояние
ИЗ
РегистрСведений.Базировка.СрезПоследних(ДОБАВИТЬКДАТЕ(&Период, СЕКУНДА, &Время * 3600), ) КАК БазировкаСрезПоследних
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.Состояние.СрезПоследних (ДОБАВИТЬКДАТЕ(&Период, СЕКУНДА, &Время * 3600), ) КАК СостояниеСрезПоследних
ПО БазировкаСрезПоследних.Оборудование = СостояниеСрезПоследних.Оборудование
ГДЕ
БазировкаСрезПоследних.АдресБазы = &АдресБазы
И СостояниеСрезПоследних.Состояние = &Состояние
И НЕ БазировкаСрезПоследних.Оборудование В
(ВЫБРАТЬ
РегистрАрендыОстаткиИОбороты.Оборудование КАК Оборудование
ИЗ
РегистрНакопления.РегистрАренды.ОстаткиИОбороты
(ДОБАВИТЬКДАТЕ(&Период, СЕКУНДА, &Время * 3600),
ДОБАВИТЬКДАТЕ(&Период, СЕКУНДА, &Время * 3600 + 1), , , )
КАК РегистрАрендыОстаткиИОбороты)
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
СправочникОборудование.Ссылка КАК Ссылка,
СправочникОборудование.ИнвентарныйНомер КАК ИнвентарныйНомер,
СправочникОборудование.Наименование КАК Наименование,
АдресСостояние.Оборудование КАК Оборудование
ИЗ
АдресСостояние КАК АдресСостояние
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Оборудование КАК СправочникОборудование
ПО АдресСостояние.Оборудование = СправочникОборудование.Ссылка
ПоказатьВ модуле этой формы выбора прописано:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Список.Параметры.УстановитьЗначениеПараметра("Период", Параметры.Период);
Список.Параметры.УстановитьЗначениеПараметра("АдресБазы", Параметры.АдресБазы);
Список.Параметры.УстановитьЗначениеПараметра("Состояние", Параметры.Состояние);
Список.Параметры.УстановитьЗначениеПараметра("Время", Параметры.Время);
КонецПроцедуры
ПоказатьПривязка Формы Выбора сделана в Документе через вкладку "Использование" - "ФормаВыбора", там же указаны параметры (см. прикреплённый файл).
РегистрСведений.Базировка, РегистрСведений.Состояние изначально были "В пределах дня" теперь я их сделал "В пределах секунды". Дата и время берутся из даты документа и числового значения из формы документа (указываются только часы, для упрощения ввода информации).
Если выше обозначенный запрос из Формы Выбора прогнать через Консоль Запросов, то в результате запроса оборудование, сменившее базировку) появляется в тот же день (после 7:00), и это показывает, что со стороны записей в регистрах и в самом запросе нет ошибок. Но когда этот же запрос выполняется через форму выбора, то оборудование появляется только через день, как бы не извращался с часами в записях регистров. Как-будто бы он игнорирует часовые показатели, как если бы регистры были бы с периодом "В пределах дня".
Может как-то по другому нужно задавать параметры для Даты и времени в динамическом списке?
Прикрепленные файлы:
Найденные решения
(17) Да, действительно, если передавать конечный результат, то работает, вот изменил в модуле текст более простой ФормыВыбора (в посте (16) ):
Это первое, что пришло на ум, может будет более изящное решение?
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
МояДата=Параметры.Период;
МоеВремя=Параметры.Время;
Список.Параметры.УстановитьЗначениеПараметра("Период", Дата(Год(МояДата),Месяц(МояДата),День(МояДата),МоеВремя,00,00));
Список.Параметры.УстановитьЗначениеПараметра("АдресБазы", Параметры.АдресБазы);
КонецПроцедуры
Это первое, что пришло на ум, может будет более изящное решение?
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1)
Схема = Список.ПолучитьИсполняемуюСхемуКомпоновкиДанных();
Настройки = Список.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();
(могу чуть ошибиться, но в синтекстс-помощнике подсмотрите)
Схема.НаборыДанных.НаборДанных1.Текст - посмотрите какой текст в реальности исполняется
Настройки.Отбор.Элементы
Настрйоки.параметрыДанных.Элементы - посмотрите, все ли параметры установили правильно
Схема = Список.ПолучитьИсполняемуюСхемуКомпоновкиДанных();
Настройки = Список.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();
(могу чуть ошибиться, но в синтекстс-помощнике подсмотрите)
Схема.НаборыДанных.НаборДанных1.Текст - посмотрите какой текст в реальности исполняется
Настройки.Отбор.Элементы
Настрйоки.параметрыДанных.Элементы - посмотрите, все ли параметры установили правильно
(1)
Какая дата и время в документе перед открытием формы выбора?
Предполагаю, что необходимо приводить
Список.Параметры.УстановитьЗначениеПараметра("Период", Параметры.Период);
к началу дня, т.е.
Список.Параметры.УстановитьЗначениеПараметра("Период", НачалоДня(Параметры.Период));
Дата и время берутся из даты документа и числового значения из формы документа (указываются только часы, для упрощения ввода информации)
Какая дата и время в документе перед открытием формы выбора?
Предполагаю, что необходимо приводить
Список.Параметры.УстановитьЗначениеПараметра("Период", Параметры.Период);
к началу дня, т.е.
Список.Параметры.УстановитьЗначениеПараметра("Период", НачалоДня(Параметры.Период));
(1)
Так себе решение, если честно.
Если вы знаете в при создании на сервере и &период и &время, так посчитайте сразу результат, и заполните один параметр, чтобы в запрос передать окончательное значение.
(ДОБАВИТЬКДАТЕ(&Период, СЕКУНДА, &Время * 3600),
ДОБАВИТЬКДАТЕ(&Период, СЕКУНДА, &Время * 3600 + 1)
ДОБАВИТЬКДАТЕ(&Период, СЕКУНДА, &Время * 3600 + 1)
Так себе решение, если честно.
Если вы знаете в при создании на сервере и &период и &время, так посчитайте сразу результат, и заполните один параметр, чтобы в запрос передать окончательное значение.
(1)
Также не очень понятно, зачем это в динамическом списке.
Раз уж задаете параметры, так в при создании на сервере заполните еще параметр &Оборудование, который нужно исключить из динамического списка.
(ВЫБРАТЬ
РегистрАрендыОстаткиИОбороты.Оборудование КАК Оборудование
ИЗ
РегистрНакопления.РегистрАренды.ОстаткиИОбороты
(ДОБАВИТЬКДАТЕ(&Период, СЕКУНДА, &Время * 3600),
ДОБАВИТЬКДАТЕ(&Период, СЕКУНДА, &Время * 3600 + 1), , , )
КАК РегистрАрендыОстаткиИОбороты)
РегистрАрендыОстаткиИОбороты.Оборудование КАК Оборудование
ИЗ
РегистрНакопления.РегистрАренды.ОстаткиИОбороты
(ДОБАВИТЬКДАТЕ(&Период, СЕКУНДА, &Время * 3600),
ДОБАВИТЬКДАТЕ(&Период, СЕКУНДА, &Время * 3600 + 1), , , )
КАК РегистрАрендыОстаткиИОбороты)
Также не очень понятно, зачем это в динамическом списке.
Раз уж задаете параметры, так в при создании на сервере заполните еще параметр &Оборудование, который нужно исключить из динамического списка.
(13) Вот например запрос
Отлаживать его будет как минимум, значительно проще. Да и работать должно быстрее, чем с временными таблицами и регистром накопления в запросе.
ВЫБРАТЬ
СправочникОборудование.Ссылка КАК Ссылка,
СправочникОборудование.ИнвентарныйНомер КАК ИнвентарныйНомер,
СправочникОборудование.Наименование КАК Наименование
ИЗ
Справочник.Оборудование КАК СправочникОборудование
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.Базировка.СрезПоследних(&ПериодСреза, ) КАК БазировкаСрезПоследних
ПО СправочникОборудование.Ссылка = БазировкаСрезПоследних.Оборудование
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.Состояние.СрезПоследних(&ПериодСреза, ) КАК СостояниеСрезПоследних
ПО СправочникОборудование.Ссылка = СостояниеСрезПоследних.Оборудование
ГДЕ
БазировкаСрезПоследних.АдресБазы = &АдресБазы
И СостояниеСрезПоследних.Состояние = &Состояние
И НЕ СправочникОборудование.Ссылка В (&ИсключаемоеОборудование)
ПоказатьОтлаживать его будет как минимум, значительно проще. Да и работать должно быстрее, чем с временными таблицами и регистром накопления в запросе.
(15) Идея понятна, но с этим разберусь попозже.
Но вот аналогичный запрос, но попроще, ведёт себя точно также:
Но вот аналогичный запрос, но попроще, ведёт себя точно также:
ВЫБРАТЬ
СправочникОборудование.Наименование КАК Наименование,
СправочникОборудование.ИнвентарныйНомер КАК ИнвентарныйНомер,
БазировкаСрезПоследних.АдресБазы КАК АдресБазы,
БазировкаСрезПоследних.Период КАК Период
ИЗ
РегистрСведений.Базировка.СрезПоследних(ДОБАВИТЬКДАТЕ(&Период, СЕКУНДА, &Время * 3600), ) КАК БазировкаСрезПоследних
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Оборудование КАК СправочникОборудование
ПО БазировкаСрезПоследних.Оборудование = СправочникОборудование.Ссылка
ГДЕ
БазировкаСрезПоследних.АдресБазы = &АдресБазы
Показать
(16)Я бы все-таки изменил период, чтобы в запрос передавалось сразу конечное значение.
Если вы меняете параметры периода, и данные появляются/пропадают, то вероятно, что-то с периодом не так.
Либо что-то не так с другими отборами.
Либо данных в базе нет, подходящих под отборы.
Если вы меняете параметры периода, и данные появляются/пропадают, то вероятно, что-то с периодом не так.
Либо что-то не так с другими отборами.
Либо данных в базе нет, подходящих под отборы.
(17) Да, действительно, если передавать конечный результат, то работает, вот изменил в модуле текст более простой ФормыВыбора (в посте (16) ):
Это первое, что пришло на ум, может будет более изящное решение?
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
МояДата=Параметры.Период;
МоеВремя=Параметры.Время;
Список.Параметры.УстановитьЗначениеПараметра("Период", Дата(Год(МояДата),Месяц(МояДата),День(МояДата),МоеВремя,00,00));
Список.Параметры.УстановитьЗначениеПараметра("АдресБазы", Параметры.АдресБазы);
КонецПроцедуры
Это первое, что пришло на ум, может будет более изящное решение?
(19) В итоге пришлось переделывать целиком всю схему из первого поста и последовал вашему совету.
В справочнике "Оборудование" в ФормаВыбораСостояние, в которой прописал произвольный запрос (Динамический список):
В модуле этой формы выбора прописал:
Проверил, действительно секунда ни как не влияет на отбор значений, поэтому начало и конец периода равны.
В справочнике "Оборудование" в ФормаВыбораСостояние, в которой прописал произвольный запрос (Динамический список):
ВЫБРАТЬ
БазировкаСрезПоследних.Оборудование КАК Оборудование,
БазировкаСрезПоследних.АдресБазы КАК АдресБазы,
СостояниеСрезПоследних.Состояние КАК Состояние
ПОМЕСТИТЬ АдресСостояние
ИЗ
РегистрСведений.Базировка.СрезПоследних(&ПериодОтбора, ) КАК БазировкаСрезПоследних
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.Состояние.СрезПоследних КАК СостояниеСрезПоследних
ПО БазировкаСрезПоследних.Оборудование = СостояниеСрезПоследних.Оборудование
ГДЕ
БазировкаСрезПоследних.АдресБазы = &АдресБазы
И СостояниеСрезПоследних.Состояние = &Состояние
И НЕ БазировкаСрезПоследних.Оборудование В (&ИсключаемоеОборудование)
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
СправочникОборудование.Ссылка КАК Ссылка,
СправочникОборудование.ИнвентарныйНомер КАК ИнвентарныйНомер,
СправочникОборудование.Наименование КАК Наименование,
АдресСостояние.Оборудование КАК Оборудование
ИЗ
АдресСостояние КАК АдресСостояние
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Оборудование КАК СправочникОборудование
ПО АдресСостояние.Оборудование = СправочникОборудование.Ссылка
ПоказатьВ модуле этой формы выбора прописал:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
МояДата=Параметры.Период;
МоеВремя=Параметры.Время;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РегистрАрендыОстаткиИОбороты.Оборудование КАК Оборудование
|ИЗ
| РегистрНакопления.РегистрАренды.ОстаткиИОбороты(ДОБАВИТЬКДАТЕ(&ПериодАренды, СЕКУНДА, &ВремяАренды * 3600),
| ДОБАВИТЬКДАТЕ(&ПериодАренды, СЕКУНДА, &ВремяАренды * 3600), , , )
| КАК РегистрАрендыОстаткиИОбороты";
Запрос.УстановитьПараметр("ПериодАренды",МояДата);
Запрос.УстановитьПараметр("ВремяАренды",МоеВремя);
ИсключаемоеОборудование = Запрос.Выполнить();
Список.Параметры.УстановитьЗначениеПараметра("ПериодОтбора", Дата(Год(МояДата),Месяц(МояДата),День(МояДата),МоеВремя,00,00));
Список.Параметры.УстановитьЗначениеПараметра("АдресБазы", Параметры.АдресБазы);
Список.Параметры.УстановитьЗначениеПараметра("Состояние", Параметры.Состояние);
Список.Параметры.УстановитьЗначениеПараметра("ИсключаемоеОборудование", ИсключаемоеОборудование);
КонецПроцедуры
ПоказатьПроверил, действительно секунда ни как не влияет на отбор значений, поэтому начало и конец периода равны.
(21)
Мне нужно, чтобы в таблицу попадало то, что уже выдано на этот момент..., т.е. можно использовать:
(21)
То есть?
Тогда зачем таблица ОстаткиИОбороты? =)
Мне нужно, чтобы в таблицу попадало то, что уже выдано на этот момент..., т.е. можно использовать:
ВЫБРАТЬ
РегистрАрендыОстатки.Оборудование КАК Оборудование,
ИЗ
РегистрНакопления.РегистрАренды.Остатки(ДОБАВИТЬКДАТЕ(&ПериодАренды, СЕКУНДА, &ВремяАренды * 3600+1), ) КАК РегистрАрендыОстатки
(21)
И параметр периода в запросе тоже стоит сделать нормальным
То есть?
(22)
Не вычислять его в запросе, а передать нужное значение сразу.
(22)
По результату это не отличается от того, что вы получали в исходном запросе.
То есть?
ДОБАВИТЬКДАТЕ(&ПериодАренды, СЕКУНДА, &ВремяАренды * 3600+1)
Не вычислять его в запросе, а передать нужное значение сразу.
(22)
Мне нужно, чтобы в таблицу попадало то, что уже выдано на этот момент..., т.е. можно использовать
По результату это не отличается от того, что вы получали в исходном запросе.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот