Как получить срез последних данных из периодического регистра сведений на заданную дату и время в СКД 1С?

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

При работе с отчетами в 1С часто возникает необходимость получить данные на определенный момент времени, включая не только дату, но и часы, минуты, секунды. Стандартные механизмы регистров накопления, как правило, ориентированы на получение остатков на "конец дня" или "на определенную дату" без детализации до времени. Однако, если мы имеем дело с периодическим регистром сведений, который хранит данные с точностью до момента времени (например, с периодичностью "Позиция"), нам потребуется особый подход в Системе Компоновки Данных (СКД) для корректного получения среза последних данных.

Давайте подробно рассмотрим, как мы можем настроить СКД для решения этой задачи, используя возможности платформы 1С:Предприятие 8.3. Мы выясним, какие инструменты СКД нам понадобятся, и пошагово разберем процесс настройки, чтобы вы могли применять его в своих проектах.

Понимание виртуальной таблицы "СрезПоследних" для регистров сведений

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

Когда мы обращаемся к РегистрСведений.НашРегистр.СрезПоследних(&МоментВремени, Отбор), платформа 1С выполняет следующий алгоритм:

  1. Она ищет в регистре сведений все записи, у которых поле Период (или другое поле периодичности, если оно настроено) меньше или равно &МоментВремени.
  2. Среди найденных записей для каждой уникальной комбинации значений измерений (например, для каждой номенклатуры, если у нас регистр остатков) выбирается та, у которой Период является максимальным.
  3. Результатом будет набор записей, содержащих самые актуальные данные на указанный &МоментВремени для каждого измерения.

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

Шаг 1: Создание набора данных в СКД с использованием "СрезПоследних"

Начнем с настройки набора данных в схеме компоновки данных. Мы будем использовать конструктор запросов для формирования нашего запроса к регистру сведений. В случаях, когда отчет создается динамически из кода, можно применить СКДБилдер, который упрощает программное создание СКД и делает код значительно более читаемым.

Прежде всего, нам необходимо открыть схему компоновки данных (файл .csd) или создать новую, если вы разрабатываете отчет с нуля. Перейдите на вкладку "Наборы данных" и создайте новый набор данных типа "Запрос".

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

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

Перенесем необходимые поля в секцию "Выбранные поля", например, Номенклатура и Количество. Теперь нам нужно правильно настроить параметры виртуальных таблиц в компоновке данных, в частности для таблицы СрезПоследних. В конструкторе запросов, после выбора СрезПоследних, у вас появится возможность указать параметры для этой таблицы. Нам потребуется передать параметр, который будет определять момент среза. Назовем его, например, МоментОтчета.

В результате ваш запрос будет выглядеть примерно так:


ВЫБРАТЬ
    ОстаткиНоменклатурыСрезПоследних.Номенклатура,
    ОстаткиНоменклатурыСрезПоследних.Количество
ИЗ
    РегистрСведений.ОстаткиНоменклатуры.СрезПоследних(&МоментОтчета, ) КАК ОстаткиНоменклатурыСрезПоследних

Обратите внимание, что второй параметр в СрезПоследних (который отвечает за отбор по измерениям) мы оставили пустым. Это означает, что отбор по измерениям применяться не будет, и срез будет построен для всех записей. Если вам потребуется дополнительный отбор (например, по определенным группам номенклатуры), его можно добавить либо во второй параметр СрезПоследних, либо в секцию "ГДЕ" основного запроса СКД.

Шаг 2: Определение параметра СКД "МоментОтчета"

После того как запрос сформирован, нам необходимо определить и настроить параметр &МоментОтчета в самой схеме компоновки данных. Это критически важный этап, поскольку именно здесь мы указываем, что наш параметр должен принимать значение даты с точностью до времени.

  1. Переходим на вкладку "Параметры": Откройте схему компоновки данных и перейдите на вкладку "Параметры". Здесь будут перечислены все параметры, которые вы использовали в своих наборах данных.
  2. Находим наш параметр: В списке параметров найдите МоментОтчета. Если он не появился автоматически после создания запроса, добавьте его вручную, нажав кнопку "Добавить" и указав имя МоментОтчета.
  3. Устанавливаем тип значения: Для параметра МоментОтчета обязательно установите Тип значения в Дата. Это основа корректной работы с датами и моментами времени в 1С:Предприятие 8.3, что позволит передавать в параметр значения как даты, так и даты со временем.
  4. Настраиваем свойства параметра для пользовательского интерфейса:

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

    • В схеме СКД: В свойствах параметра на вкладке "Параметры" убедитесь, что в поле "Редактирование" для типа Дата указан подходящий вариант, если это возможно. Часто достаточно просто установить тип Дата, и система сама подстроит ввод.
    • Для отчета на управляемых формах: Если ваш отчет использует управляемые формы, поле ввода даты для параметра СКД будет автоматически отображать часы, минуты и секунды, если в само значение параметра будет передано время. Нет необходимости в специальных свойствах формата в схеме СКД для этого.
    • Флаг "Использовать всегда": Установите флаг Использовать всегда для параметра МоментОтчета. Это гарантирует, что параметр всегда будет доступен для установки пользователем, даже если он явно не добавлен в пользовательские настройки отчета.
    • Вид сравнения: Для параметра МоментОтчета в большинстве случаев подходит Равно или МеньшеИлиРавно (если вы хотите дать пользователю возможность указать, что срез делается *по* эту дату/время включительно). В контексте СрезПоследних, Равно вполне достаточно, так как функция сама берет записи <= указанного момента.
    • Значение по умолчанию: Вы можете указать значение по умолчанию для параметра, например, НачалоДня(ТекущаяДата()) или КонецДня(ТекущаяДата()), или просто ТекущаяДата(), если вы хотите, чтобы по умолчанию отображались текущие дата и время.

Шаг 3: Связывание параметра с пользовательскими настройками

Чтобы пользователь мог изменять МоментОтчета непосредственно из формы отчета, нам необходимо добавить этот параметр в пользовательские настройки. Грамотная настройка пользовательских полей и параметров в СКД позволит вынести этот фильтр в удобную для пользователя область формы.

  1. Переходим на вкладку "Настройки": Откройте вкладку "Настройки" в СКД.
  2. Добавляем новый элемент пользовательских настроек: В дереве настроек найдите ветку "Параметры" или создайте новую группу "Параметры", если ее нет. Перетащите параметр МоментОтчета из списка доступных полей и параметров на вкладке "Поля" в ветку "Параметры" в пользовательских настройках.
  3. Настраиваем отображение параметра:
    • Доступность: Убедитесь, что параметр видим для пользователя.
    • Режим редактирования: Обычно для даты это "Обычный режим редактирования".
    • Заголовок: Присвойте параметру понятный заголовок, например, "Момент отчета" или "Остатки на дату и время".

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

Важные аспекты и нюансы

При использовании этого подхода мы должны учитывать несколько важных моментов, чтобы обеспечить корректную работу и ожидаемые результаты:

  1. Периодичность регистра сведений:

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

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

  2. Работа СрезПоследних с пустыми данными:

    Что произойдет, если на указанный &МоментОтчета нет ни одной записи или все записи находятся после этого момента? В таком случае виртуальная таблица СрезПоследних просто не вернет никаких данных для соответствующих измерений. Это нормальное и ожидаемое поведение.

  3. Работа с фильтрами и списками:

    В некоторых случаях бывает полезно преобразовать настройки из динамического списка в отчет СКД, чтобы быстро получить детальный срез по тем позициям, которые пользователь уже отфильтровал в экранной форме. Это значительно экономит время при переходе от оперативной работы к аналитике.

  4. Безопасность и режим выполнения:

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

Примеры использования в реальных сценариях

Рассмотрим, где такой подход может быть особенно полезен:

  1. Оперативный контроль остатков: В торговых или производственных компаниях часто требуется видеть остатки товаров или материалов не просто на конец дня, а на "сейчас" или на какой-либо конкретный момент времени, чтобы принять решение о закупке, производстве или отгрузке. Если изменения остатков фиксируются в периодическом регистре сведений с точностью до секунды (например, при каждом движении), то наш отчет позволит получить актуальные данные.
  2. Анализ цен: Если у вас есть регистр сведений "ЦеныНоменклатуры", который периодически обновляется в течение дня, вы можете использовать СрезПоследних, чтобы получить актуальные цены на любой заданный момент времени для анализа динамики или проверки правильности расчета.
  3. Учет состояний объектов: Для систем, где важно отслеживать состояние какого-либо объекта на конкретный момент времени (например, статус заказа, фаза производства, состояние оборудования), периодический регистр сведений и СрезПоследних будут идеальным решением.

Альтернативные методы (и почему "СрезПоследних" лучше)

Теоретически, можно было бы попытаться получить тот же результат, используя обычный запрос к регистру сведений без виртуальных таблиц, комбинируя вложенные запросы и агрегатные функции, такие как МАКСИМУМ(Период). Однако, такой запрос будет значительно менее производительным. Платформа 1С оптимизирована для работы с виртуальными таблицами, и СрезПоследних использует внутренние индексы и механизмы для быстрого получения данных.

В более сложных архитектурных задачах может потребоваться использовать две разных схемы в одном отчете СКД, например, для вывода основного среза данных и сравнительной таблицы по другой методике в рамках одного отчета. Это "искусство ради искусства", но иногда оправдано требованиями бизнеса.

Поэтому мы настоятельно рекомендуем использовать именно виртуальную таблицу СрезПоследних, как наиболее эффективное и производительное решение для данной задачи.

Заключение

Мы подробно разобрали, как эффективно настроить Систему Компоновки Данных для получения среза последних данных из периодического регистра сведений на заданную дату и время. Использование виртуальной таблицы СрезПоследних в сочетании с правильно настроенным параметром СКД типа Дата (с учетом времени) позволяет добиться требуемой точности и оперативности в отчетности.

Этот подход является стандартным и наиболее оптимальным для решения задач, где критически важен именно момент времени для получения актуальных данных. Применяя эти знания, вы сможете создавать гибкие и точные отчеты, удовлетворяющие самым взыскательным требованиям бизнеса в системе 1С:Предприятие.

← На главную