При работе с запросами в системе «1С:Предприятие 8» программисты часто сталкиваются с необходимостью получения остатков на конкретный документ. Использование обычной даты не всегда корректно, так как в одну и ту же секунду может быть проведено несколько документов. Для решения этой задачи используются типы МоментВремени и Граница. В этой статье мы подробно разберем, как передать эти значения в качестве параметров в консоли запросов, проанализируем синтаксические ошибки и научимся проверять результат выполнения запроса в отладчике.
Прежде чем переходить к практике в консоли, давайте выясним причину, по которой нам недостаточно просто даты. Тип Дата имеет точность до секунды. Если нам нужно получить остатки строго до проведения документа или включая его движения, а в этой же секунде есть другие записи, система не поймет приоритет без дополнительных уточнений.
Объект МоментВремени содержит в себе дату и ссылку на документ, что позволяет однозначно позиционировать событие на оси времени. Однако у виртуальных таблиц (например, «Остатки») есть нюанс: если мы передаем МоментВремени в параметр Период, система по умолчанию выдает остатки исключая движения самого документа. Если же нам нужно их включить, нам необходим объект Граница.
Объект Граница — это своего рода «обертка», которая указывает системе, нужно ли включать граничное значение в выборку. Он принимает два параметра: точку на оси времени (Дату или МоментВремени) и вид границы (ВидГраницы.Включая или ВидГраницы.Исключая).
Большинство современных консолей запросов (как для управляемых, так и для обычных форм) не имеют отдельного интерактивного выбора для типа Граница. Чтобы обойти это ограничение, мы используем механизм вычисления выражений. Разберем этот процесс по шагам:
&ДатаОстатка).Например, если нам нужно получить границу на конкретный документ, найденный по номеру, код будет выглядеть следующим образом:
Новый Граница(Документы.АвансовыйОтчет.НайтиПоНомеру("00000000342", Дата(2022, 11, 16)), ВидГраницы.Исключая)
Рассмотрим подробнее этот код: функция НайтиПоНомеру возвращает ссылку на документ. Мы обязательно указываем второй параметр — дату, чтобы 1С понимала, в каком периоде (году) искать документ с таким номером. Затем конструктор Новый Граница создает нужный нам объект.
В некоторых продвинутых версиях консолей (например, консоль для управляемых форм с портала ИТС) реализован более удобный интерфейс. Посмотрим на алгоритм действий в таких инструментах:
Часто новички допускают ошибки при попытке вручную прописать создание границы в поле выражения. Проанализируем ситуацию, когда система выдает ошибку: {<Неизвестный модуль>(1,1)}: Процедура или функция с указанным именем не определена (Граница).
Эта ошибка возникает по двум основным причинам:
Новый. Граница — это объект, и его экземпляр создается только через конструктор.НайтиПоНомеру, помните, что это метод менеджера документа, и он должен возвращать ссылку.Правильный синтаксис для установки границы в коде или в поле выражения консоли должен быть таким:
// Для включения движений документа в остатки
Запрос.УстановитьПараметр("ДатаОстатка", Новый Граница(СсылкаНаОбъект.МоментВремени(), ВидГраницы.Включая));
// Для получения остатков строго ДО документа
Запрос.УстановитьПараметр("ДатаОстатка", Новый Граница(СсылкаНаОбъект.МоментВремени(), ВидГраницы.Исключая));
Обратите внимание на использование метода МоментВремени(). Хотя технически в конструктор Граница можно передать просто ссылку на документ, использование МоментВремени() считается более надежным и общепринятым стандартом в среде разработки 1С.
Если запрос в консоли ведет себя непредсказуемо, или консоль не поддерживает сложные типы параметров, выясним причину с помощью отладки в конфигураторе. Часто программисту нужно увидеть данные, которые возвращает запрос, прямо «на лету».
Разберем, как просмотреть таблицу значений результата запроса, не дописывая лишний код в конфигурацию:
Запрос.Выполнить().Shift + F9 (Вычислить выражение).
Запрос.Выполнить().Выгрузить()
После вычисления в окне появится объект ТаблицаЗначений. Чтобы увидеть ее содержимое (строки и колонки), нажмите кнопку «Показать значение в отдельном окне» (значок лупы). В открывшемся окне вы сможете проанализировать все данные, которые выбрал запрос, включая скрытые поля, и убедиться, что Граница отработала корректно.
Если вы работаете в старых конфигурациях (например, УПП на обычных формах), помните, что функционал отладчика там ничем не отличается от современных систем в части вычисления выражений. Если при выгрузке таблицы вы видите только колонки без строк — это означает, что запрос выполнился успешно, но данных по заданным фильтрам (параметрам) в базе нет.
Мы выяснили, что для корректной работы с периодами в запросах использование типа Граница является обязательным стандартом. В консоли запросов наиболее универсальным способом установки такого параметра является тип «Выражение» с использованием конструктора Новый Граница(...). Не забывайте правильно указывать МоментВремени() документа и всегда проверяйте результаты через выгрузку в ТаблицуЗначений в режиме отладки.