Почему в запросе 1С к регистру сведений поле Период возвращает начало года вместо даты документа?

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

При написании запросов к периодическим регистрам сведений разработчики нередко сталкиваются с ситуацией, когда стандартное поле Период возвращает не точную дату проведения документа (например, 11.10.2017), а начало периода — например, 01.01.2017 00:00:00. Разберем механизм работы периодичности в регистрах сведений 1С, выясним причину такого поведения и рассмотрим корректные способы получения даты документа.

Механизм периодичности регистров сведений

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

Если у регистра сведений задана периодичность, отличная от детальной по времени, платформа автоматически нормализует (округляет) значение в поле Период до начала соответствующего интервала:

  1. В пределах года — дата любой записи всегда приводится к 01.01.ГГГГ 00:00:00.
  2. В пределах месяца — дата приводится к первому числу месяца 01.ММ.ГГГГ 00:00:00.
  3. В пределах дня — дата приводится к началу суток ДД.ММ.ГГГГ 00:00:00.

Поэтому при выполнении исходного запроса поле Период закономерно принимает значение первого дня года:


ВЫБРАТЬ
    Набор.Организация КАК Организация,
    МАКСИМУМ(Набор.Период) КАК Период
ИЗ
    РегистрСведений.НачислениеАмортизацииОССпециальныйКоэффициентНалоговыйУчет КАК Набор
ГДЕ
    Набор.Регистратор = &Регистратор
СГРУППИРОВАТЬ ПО
    Набор.Организация

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

Способ 1. Получение даты через обращение к регистратору

Если нам требуется получить именно дату проведения документа, а не расчетный интервал регистра, обратимся к реквизиту Дата документа-регистратора напрямую через точку:


ВЫБРАТЬ
    Набор.Организация КАК Организация,
    МАКСИМУМ(Набор.Регистратор.Дата) КАК ДатаРегистратора
ИЗ
    РегистрСведений.НачислениеАмортизацииОССпециальныйКоэффициентНалоговыйУчет КАК Набор
ГДЕ
    Набор.Регистратор = &Регистратор
СГРУППИРОВАТЬ ПО
    Набор.Организация

В данном случае функция МАКСИМУМ вернет фактическую дату документа-регистратора со временем (11.10.2017 00:00:00).

Способ 2. Оптимизированный запрос с прямым соединением

Обращение через точку Набор.Регистратор.Дата формирует неявные левые соединения со всеми таблицами документов, которые назначены регистраторами для данного регистра сведений. Если список регистраторов велик, проанализируем оптимизированный вариант с явным соединением с таблицей конкретного документа:


ВЫБРАТЬ
    Набор.Организация КАК Организация,
    МАКСИМУМ(Док.Дата) КАК ДатаДокумента
ИЗ
    РегистрСведений.НачислениеАмортизацииОССпециальныйКоэффициентНалоговыйУчет КАК Набор
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ИзменениеСпециальногоКоэффициентаНМА КАК Док
        ПО Набор.Регистратор = Док.Ссылка
ГДЕ
    Набор.Регистратор = &Регистратор
СГРУППИРОВАТЬ ПО
    Набор.Организация

Такой подход исключает лишние соединения в результирующем SQL-запросе и обеспечивает максимальную производительность СУБД при обработке больших массивов данных.

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

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

  1. Виртуальные таблицы срезов: при вызове таблиц СрезПоследних или СрезПервых переданная дата среза автоматически сопоставляется с периодичностью регистра. При периодичности «В пределах года» срез на 15.06.2017 вернет актуальную запись на 01.01.2017.
  2. Уникальность записей: поле Период входит в первичный ключ регистра. При годовой периодичности один и тот же регистратор не может создать две записи с одинаковыми ключевыми измерениями в рамках одного календарного года.
  3. Изменение структуры регистра: если для бизнес-логики требуется хранить точный момент времени движения, в конфигураторе следует изменить свойство регистра Периодичность на «По позиции регистратора» или «В пределах секунды», учитывая, что это потребует реструктуризации таблицы.
← На главную