Как установить параметр типа Граница в консоли запросов 1С?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

При отладке запросов к регистрам накопления или бухгалтерии часто возникает необходимость проверить получение остатков на определенный момент времени, включая движения конкретного документа или секунды. В программном коде для этого формируется объект Граница и передается в параметры запроса. Однако при попытке перенести такой запрос в консоль запросов разработчики сталкиваются с тем, что в стандартном диалоге выбора типов нет отдельного примитивного типа для границы.

Разберем подробно, как правильно передавать объект Граница в параметры консоли запросов и какие нюансы следует учитывать при работе с виртуальными таблицами.

Способ 1. Использование флага «Выражение» в консоли запросов

Большинство типовых и популярных пользовательских консолей запросов (как на обычных, так и на управляемых формах) поддерживают вычисление произвольных выражений на встроенном языке 1С для значений параметров.

Разберем по шагам, как настроить параметр:

  1. Откроем консоль запросов и перейдем в таблицу настройки параметров.
  2. Найдем нужный параметр (например, Граница или Период).
  3. Установим для этого параметра флаг (колонку) Выражение.
  4. В поле значения введем конструктор создания объекта границы на встроенном языке:

Новый Граница(Дата("20230131235959"), ВидГраницы.Включая)

При выполнении запроса консоль вычислит указанную строку через функцию Вычислить() и передаст в запрос полноценный объект типа Граница.

Если требуется рассчитать остатки строго на момент проведения конкретного документа (включая его движения), в качестве точки границы можно передать его МоментВремени:


Новый Граница(Документы.РеализацияТоваровУслуг.НайтиПоНомеру("000000001", Дата("20230115")).МоментВремени(), ВидГраницы.Включая)

Особенности поведения виртуальных таблиц при передаче различных типов периода

Проанализируем, почему для получения корректных данных важно использовать именно объект Граница, а не ограничиваться обычной датой:

  1. Передача типа Дата: платформа по умолчанию использует логику исключающей границы. Все движения, записанные ровно на указанную секунду, не войдут в расчет остатков виртуальной таблицы.
  2. Передача типа МоментВремени: платформа учитывает позицию конкретного документа внутри секунды, однако сами движения указанного документа в выборку не включаются (граница исключающая).
  3. Передача типа Граница: только при использовании ВидГраницы.Включая движения указанной даты или выбранного регистратора попадут в итоговые остатки.

Способ 2. Смещение времени на 1 секунду вперед (временный обход)

Иногда при быстрой проверке данных разработчики прибегают к приему со смещением даты:


// Вместо границы передается дата со сдвигом:
Запрос.УстановитьПараметр("Период", Дата + 1);

Рассмотрим, почему такой способ не рекомендуется для точной отладки: если в следующую секунду в базе уже присутствуют проводки или движения других документов, запрос вернет некорректный результат, захватив лишние данные. Данный подход допустим только для предварительной приблизительной оценки и не заменяет полноценную передачу объекта Граница.

Ограничения вычисления выражений в контексте консоли

При использовании вычисляемых выражений в консолях запросов важно помнить про контекст выполнения. Обработка выражения происходит через платформенный механизм Вычислить(). Если консоль работает на стороне тонкого клиента без вызова серверного контекста, прямое обращение к менеджерам объектов (например, Документы... или Справочники...) может вызвать ошибку. В таких ситуациях создание границы с поиском ссылки безопаснее выполнять в серверных версиях консолей или передавать границу по фиксированной дате Дата("ГГГГММДДЧЧММСС").

← На главную