При отладке запросов к регистрам накопления или бухгалтерии часто возникает необходимость проверить получение остатков на определенный момент времени, включая движения конкретного документа или секунды. В программном коде для этого формируется объект Граница и передается в параметры запроса. Однако при попытке перенести такой запрос в консоль запросов разработчики сталкиваются с тем, что в стандартном диалоге выбора типов нет отдельного примитивного типа для границы.
Разберем подробно, как правильно передавать объект Граница в параметры консоли запросов и какие нюансы следует учитывать при работе с виртуальными таблицами.
Большинство типовых и популярных пользовательских консолей запросов (как на обычных, так и на управляемых формах) поддерживают вычисление произвольных выражений на встроенном языке 1С для значений параметров.
Разберем по шагам, как настроить параметр:
Граница или Период).
Новый Граница(Дата("20230131235959"), ВидГраницы.Включая)
При выполнении запроса консоль вычислит указанную строку через функцию Вычислить() и передаст в запрос полноценный объект типа Граница.
Если требуется рассчитать остатки строго на момент проведения конкретного документа (включая его движения), в качестве точки границы можно передать его МоментВремени:
Новый Граница(Документы.РеализацияТоваровУслуг.НайтиПоНомеру("000000001", Дата("20230115")).МоментВремени(), ВидГраницы.Включая)
Проанализируем, почему для получения корректных данных важно использовать именно объект Граница, а не ограничиваться обычной датой:
Дата: платформа по умолчанию использует логику исключающей границы. Все движения, записанные ровно на указанную секунду, не войдут в расчет остатков виртуальной таблицы.МоментВремени: платформа учитывает позицию конкретного документа внутри секунды, однако сами движения указанного документа в выборку не включаются (граница исключающая).Граница: только при использовании ВидГраницы.Включая движения указанной даты или выбранного регистратора попадут в итоговые остатки.Иногда при быстрой проверке данных разработчики прибегают к приему со смещением даты:
// Вместо границы передается дата со сдвигом:
Запрос.УстановитьПараметр("Период", Дата + 1);
Рассмотрим, почему такой способ не рекомендуется для точной отладки: если в следующую секунду в базе уже присутствуют проводки или движения других документов, запрос вернет некорректный результат, захватив лишние данные. Данный подход допустим только для предварительной приблизительной оценки и не заменяет полноценную передачу объекта Граница.
При использовании вычисляемых выражений в консолях запросов важно помнить про контекст выполнения. Обработка выражения происходит через платформенный механизм Вычислить(). Если консоль работает на стороне тонкого клиента без вызова серверного контекста, прямое обращение к менеджерам объектов (например, Документы... или Справочники...) может вызвать ошибку. В таких ситуациях создание границы с поиском ссылки безопаснее выполнять в серверных версиях консолей или передавать границу по фиксированной дате Дата("ГГГГММДДЧЧММСС").