При написании запросов к периодическим регистрам сведений разработчики нередко сталкиваются с ситуацией, когда стандартное поле Период возвращает не точную дату проведения документа (например, 11.10.2017), а начало периода — например, 01.01.2017 00:00:00. Разберем механизм работы периодичности в регистрах сведений 1С, выясним причину такого поведения и рассмотрим корректные способы получения даты документа.
Проанализируем, как платформа 1С:Предприятие обрабатывает стандартный реквизит Период. В конфигураторе для регистра сведений можно задать свойство Периодичность (например, «В пределах года», «В пределах месяца», «В пределах дня» или «По позиции регистратора»).
Если у регистра сведений задана периодичность, отличная от детальной по времени, платформа автоматически нормализует (округляет) значение в поле Период до начала соответствующего интервала:
01.01.ГГГГ 00:00:00.01.ММ.ГГГГ 00:00:00.ДД.ММ.ГГГГ 00:00:00.Поэтому при выполнении исходного запроса поле Период закономерно принимает значение первого дня года:
ВЫБРАТЬ
Набор.Организация КАК Организация,
МАКСИМУМ(Набор.Период) КАК Период
ИЗ
РегистрСведений.НачислениеАмортизацииОССпециальныйКоэффициентНалоговыйУчет КАК Набор
ГДЕ
Набор.Регистратор = &Регистратор
СГРУППИРОВАТЬ ПО
Набор.Организация
В пользовательском интерфейсе формы списка или набора записей в колонке может отображаться дата документа-регистратора (например, 11.10.2017), однако физически в таблице базы данных в реквизите Период хранится начало года.
Если нам требуется получить именно дату проведения документа, а не расчетный интервал регистра, обратимся к реквизиту Дата документа-регистратора напрямую через точку:
ВЫБРАТЬ
Набор.Организация КАК Организация,
МАКСИМУМ(Набор.Регистратор.Дата) КАК ДатаРегистратора
ИЗ
РегистрСведений.НачислениеАмортизацииОССпециальныйКоэффициентНалоговыйУчет КАК Набор
ГДЕ
Набор.Регистратор = &Регистратор
СГРУППИРОВАТЬ ПО
Набор.Организация
В данном случае функция МАКСИМУМ вернет фактическую дату документа-регистратора со временем (11.10.2017 00:00:00).
Обращение через точку Набор.Регистратор.Дата формирует неявные левые соединения со всеми таблицами документов, которые назначены регистраторами для данного регистра сведений. Если список регистраторов велик, проанализируем оптимизированный вариант с явным соединением с таблицей конкретного документа:
ВЫБРАТЬ
Набор.Организация КАК Организация,
МАКСИМУМ(Док.Дата) КАК ДатаДокумента
ИЗ
РегистрСведений.НачислениеАмортизацииОССпециальныйКоэффициентНалоговыйУчет КАК Набор
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ИзменениеСпециальногоКоэффициентаНМА КАК Док
ПО Набор.Регистратор = Док.Ссылка
ГДЕ
Набор.Регистратор = &Регистратор
СГРУППИРОВАТЬ ПО
Набор.Организация
Такой подход исключает лишние соединения в результирующем SQL-запросе и обеспечивает максимальную производительность СУБД при обработке больших массивов данных.
Рассмотрим важные нюансы, которые необходимо учитывать при работе с периодическими регистрами:
СрезПоследних или СрезПервых переданная дата среза автоматически сопоставляется с периодичностью регистра. При периодичности «В пределах года» срез на 15.06.2017 вернет актуальную запись на 01.01.2017.Период входит в первичный ключ регистра. При годовой периодичности один и тот же регистратор не может создать две записи с одинаковыми ключевыми измерениями в рамках одного календарного года.