Есть самописная 1С 8.3. Недавно попросили внести изменения в программе.
Ситуация следующая: некое оборудование изменило место базировки, что фиксируется в Регистре Сведений на 7:00 сегодняшнего дня. В этот же день, например в 8:00, я хочу выдать это оборудование с этой базы на работы, но в выпадающем списке его нет (этот список выдаёт то оборудование, которое находится на этой базе, свободное и исправное), а появляется только, если поменяем дату на следующую. Список как бы игнорирует весь день, хотя Регистр Сведений сделан "В пределах секунды".
Реализовано это следующим способом:
В справочнике "Оборудование" есть ФормаВыбораСостояние, в которой прописан произвольный запрос (Динамический список):

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

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

В модуле этой формы выбора прописано:

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

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

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

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

Может как-то по другому нужно задавать параметры для Даты и времени в динамическом списке?
---
Да, действительно, если передавать конечный результат, то работает, вот изменил в модуле текст более простой ФормыВыбора (в посте (16) ):

```1c
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    МояДата=Параметры.Период;
    МоеВремя=Параметры.Время;
    Список.Параметры.УстановитьЗначениеПараметра("Период", Дата(Год(МояДата),Месяц(МояДата),День(МояДата),МоеВремя,00,00));
    Список.Параметры.УстановитьЗначениеПараметра("АдресБазы", Параметры.АдресБазы);
    КонецПроцедуры
```

Это первое, что пришло на ум, может будет более изящное решение?
---
У вас вполне нормальный вариант, но в качестве альтернативы:

```1c
    ПериодДляЗапроса = НачалоДня(Параметры.Период) + МоеВремя*3600;
```

Только добавить проверку, что Параметры.Период - не пустая дата.
---
Схема = Список.ПолучитьИсполняемуюСхемуКомпоновкиДанных();
Настройки = Список.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();

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

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

Настройки.Отбор.Элементы
Настрйоки.параметрыДанных.Элементы - посмотрите, все ли параметры установили правильно
---
при открытии формы выбора никаких отборов по периоду(следующий день) не устанавливается?
---
Нет, всё где мог что-то исправить указал в первом посте.
---
Дата и время берутся из даты документа и числового значения из формы документа (указываются только часы, для упрощения ввода информации)

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

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

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

Список.Параметры.УстановитьЗначениеПараметра("Период", НачалоДня(Параметры.Период));
---
Поставил НачалоДня - без изменений.

Ставил точку останова в модуле на параметрах - при обработке было видно, что Параметр.Период = началу дня (Дата с нулями).
---
Вот здесь

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

правильно понимаю, что Параметры.Время при остановке отладки было равно числу 8?
---
Да.
---
А можете весь процесс открытия формы выбора отладкой прогнать пошагово(F11), а то там может что-то еще происходит с параметрами формы?
---
Параметры проверял, все 4 какие нужно.
Дата на начало дня.
Нужная база.
Состояние - "Вэксплуатации"
Число - указанное в форме (от 1 до 23).

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

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

Также не очень понятно, зачем это в динамическом списке.
Раз уж задаете параметры, так в при создании на сервере заполните еще параметр &Оборудование, который нужно исключить из динамического списка.
---
Не претендую на идеальность решения, но оно пока нас удовлетворяло.

Идея была исключить из списка то оборудование, которое уже было выдано к этому моменту времени.
---
Так получите его запросом в При создании на сервере и передайте в параметр массив.
Сейчас у вас какая то дичь, если честно - к таблице остатки и обороты с параметрами начало и окончание, которые отличаются на секунду. Это вот зачем?
---
Вот например запрос

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

Отлаживать его будет как минимум, значительно проще. Да и работать должно быстрее, чем с временными таблицами и регистром накопления в запросе.
---
Идея понятна, но с этим разберусь попозже.

Но вот аналогичный запрос, но попроще, ведёт себя точно также:

```1c
    ВЫБРАТЬ
    СправочникОборудование.Наименование КАК Наименование,
    СправочникОборудование.ИнвентарныйНомер КАК ИнвентарныйНомер,
    БазировкаСрезПоследних.АдресБазы КАК АдресБазы,
    БазировкаСрезПоследних.Период КАК Период
    ИЗ
    РегистрСведений.Базировка.СрезПоследних(ДОБАВИТЬКДАТЕ(&Период, СЕКУНДА, &Время * 3600), ) КАК БазировкаСрезПоследних
    ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Оборудование КАК СправочникОборудование
    ПО БазировкаСрезПоследних.Оборудование = СправочникОборудование.Ссылка
    ГДЕ
    БазировкаСрезПоследних.АдресБазы = &АдресБазы
```
---
Я бы все-таки изменил период, чтобы в запрос передавалось сразу конечное значение.
Если вы меняете параметры периода, и данные появляются/пропадают, то вероятно, что-то с периодом не так.
Либо что-то не так с другими отборами.
Либо данных в базе нет, подходящих под отборы.
---
Да, действительно, если передавать конечный результат, то работает, вот изменил в модуле текст более простой ФормыВыбора (в посте (16) ):

```1c
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    МояДата=Параметры.Период;
    МоеВремя=Параметры.Время;
    Список.Параметры.УстановитьЗначениеПараметра("Период", Дата(Год(МояДата),Месяц(МояДата),День(МояДата),МоеВремя,00,00));
    Список.Параметры.УстановитьЗначениеПараметра("АдресБазы", Параметры.АдресБазы);
    КонецПроцедуры
```

Это первое, что пришло на ум, может будет более изящное решение?
---
У вас вполне нормальный вариант, но в качестве альтернативы:

```1c
    ПериодДляЗапроса = НачалоДня(Параметры.Период) + МоеВремя*3600;
```

Только добавить проверку, что Параметры.Период - не пустая дата.
---
В итоге пришлось переделывать целиком всю схему из первого поста и последовал вашему совету.

В справочнике "Оборудование" в ФормаВыбораСостояние, в которой прописал произвольный запрос (Динамический список):

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

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

В модуле этой формы выбора прописал:

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

    Запрос.УстановитьПараметр("ПериодАренды",МояДата);
    Запрос.УстановитьПараметр("ВремяАренды",МоеВремя);
    ИсключаемоеОборудование = Запрос.Выполнить();

    Список.Параметры.УстановитьЗначениеПараметра("ПериодОтбора", Дата(Год(МояДата),Месяц(МояДата),День(МояДата),МоеВремя,00,00));
    Список.Параметры.УстановитьЗначениеПараметра("АдресБазы", Параметры.АдресБазы);
    Список.Параметры.УстановитьЗначениеПараметра("Состояние", Параметры.Состояние);
    Список.Параметры.УстановитьЗначениеПараметра("ИсключаемоеОборудование", ИсключаемоеОборудование);

    КонецПроцедуры
```

Проверил, действительно секунда ни как не влияет на отбор значений, поэтому начало и конец периода равны.
---
Тогда зачем таблица ОстаткиИОбороты? =)
В этом случае достаточно таблицы остатков.
И параметр периода в запросе тоже стоит сделать нормальным
---
Тогда зачем таблица ОстаткиИОбороты? =)

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

```1c
    ВЫБРАТЬ
    РегистрАрендыОстатки.Оборудование КАК Оборудование,

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

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

То есть?
---
То есть?
ДОБАВИТЬКДАТЕ(&ПериодАренды, СЕКУНДА, &ВремяАренды * 3600+1)
Не вычислять его в запросе, а передать нужное значение сразу.

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

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