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

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

При работе с запросами в системе «1С:Предприятие 8» программисты часто сталкиваются с необходимостью получения остатков на конкретный документ. Использование обычной даты не всегда корректно, так как в одну и ту же секунду может быть проведено несколько документов. Для решения этой задачи используются типы МоментВремени и Граница. В этой статье мы подробно разберем, как передать эти значения в качестве параметров в консоли запросов, проанализируем синтаксические ошибки и научимся проверять результат выполнения запроса в отладчике.

Понятие Границы и ее отличие от Момента времени

Прежде чем переходить к практике в консоли, давайте выясним причину, по которой нам недостаточно просто даты. Тип Дата имеет точность до секунды. Если нам нужно получить остатки строго до проведения документа или включая его движения, а в этой же секунде есть другие записи, система не поймет приоритет без дополнительных уточнений.

Объект МоментВремени содержит в себе дату и ссылку на документ, что позволяет однозначно позиционировать событие на оси времени. Однако у виртуальных таблиц (например, «Остатки») есть нюанс: если мы передаем МоментВремени в параметр Период, система по умолчанию выдает остатки исключая движения самого документа. Если же нам нужно их включить, нам необходим объект Граница.

Объект Граница — это своего рода «обертка», которая указывает системе, нужно ли включать граничное значение в выборку. Он принимает два параметра: точку на оси времени (Дату или МоментВремени) и вид границы (ВидГраницы.Включая или ВидГраницы.Исключая).

Способ 1: Установка параметра через тип «Выражение»

Большинство современных консолей запросов (как для управляемых, так и для обычных форм) не имеют отдельного интерактивного выбора для типа Граница. Чтобы обойти это ограничение, мы используем механизм вычисления выражений. Разберем этот процесс по шагам:

  1. Откройте консоль запросов и перейдите на закладку «Параметры».
  2. Найдите ваш параметр (например, &ДатаОстатка).
  3. В колонке «Тип» выберите значение «Выражение».
  4. В поле «Значение» введите программный код создания объекта.

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


Новый Граница(Документы.АвансовыйОтчет.НайтиПоНомеру("00000000342", Дата(2022, 11, 16)), ВидГраницы.Исключая)

Рассмотрим подробнее этот код: функция НайтиПоНомеру возвращает ссылку на документ. Мы обязательно указываем второй параметр — дату, чтобы 1С понимала, в каком периоде (году) искать документ с таким номером. Затем конструктор Новый Граница создает нужный нам объект.

Способ 2: Использование специализированных типов в консоли

В некоторых продвинутых версиях консолей (например, консоль для управляемых форм с портала ИТС) реализован более удобный интерфейс. Посмотрим на алгоритм действий в таких инструментах:

  1. В списке параметров выберите нужную строку.
  2. Нажмите кнопку выбора типа (обычно обозначается буквой «T» или многоточием).
  3. В дереве типов найдите раздел «Дополнительные типы».
  4. Установите флаг напротив значения «Граница».
  5. После этого в поле значения появится возможность интерактивно выбрать точку (дату или ссылку) и указать вид (Включая/Исключая).

Разбор типичных ошибок при написании кода

Часто новички допускают ошибки при попытке вручную прописать создание границы в поле выражения. Проанализируем ситуацию, когда система выдает ошибку: {<Неизвестный модуль>(1,1)}: Процедура или функция с указанным именем не определена (Граница).

Эта ошибка возникает по двум основным причинам:

  1. Пропущен оператор Новый. Граница — это объект, и его экземпляр создается только через конструктор.
  2. Неверный контекст поиска документа. Если вы используете НайтиПоНомеру, помните, что это метод менеджера документа, и он должен возвращать ссылку.

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


// Для включения движений документа в остатки
Запрос.УстановитьПараметр("ДатаОстатка", Новый Граница(СсылкаНаОбъект.МоментВремени(), ВидГраницы.Включая));

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

Обратите внимание на использование метода МоментВремени(). Хотя технически в конструктор Граница можно передать просто ссылку на документ, использование МоментВремени() считается более надежным и общепринятым стандартом в среде разработки 1С.

Как проверить результат запроса через отладчик

Если запрос в консоли ведет себя непредсказуемо, или консоль не поддерживает сложные типы параметров, выясним причину с помощью отладки в конфигураторе. Часто программисту нужно увидеть данные, которые возвращает запрос, прямо «на лету».

Разберем, как просмотреть таблицу значений результата запроса, не дописывая лишний код в конфигурацию:

  1. Установите точку останова в коде после строки Запрос.Выполнить().
  2. Запустите отладку и дождитесь остановки программы.
  3. Нажмите Shift + F9 (Вычислить выражение).
  4. Введите следующую конструкцию:

Запрос.Выполнить().Выгрузить()

После вычисления в окне появится объект ТаблицаЗначений. Чтобы увидеть ее содержимое (строки и колонки), нажмите кнопку «Показать значение в отдельном окне» (значок лупы). В открывшемся окне вы сможете проанализировать все данные, которые выбрал запрос, включая скрытые поля, и убедиться, что Граница отработала корректно.

Если вы работаете в старых конфигурациях (например, УПП на обычных формах), помните, что функционал отладчика там ничем не отличается от современных систем в части вычисления выражений. Если при выгрузке таблицы вы видите только колонки без строк — это означает, что запрос выполнился успешно, но данных по заданным фильтрам (параметрам) в базе нет.

Заключение

Мы выяснили, что для корректной работы с периодами в запросах использование типа Граница является обязательным стандартом. В консоли запросов наиболее универсальным способом установки такого параметра является тип «Выражение» с использованием конструктора Новый Граница(...). Не забывайте правильно указывать МоментВремени() документа и всегда проверяйте результаты через выгрузку в ТаблицуЗначений в режиме отладки.

← На главную