Можно ли изменить дату актуальных итогов в регистре накопления 1С?

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

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

Устройство таблицы актуальных итогов и дата 01.11.3999

Проанализируем внутреннюю архитектуру регистров накопления. Для повышения производительности платформа 1С использует механизм агрегирования — хранение предварительно рассчитанных итогов. В СУБД для регистра остатков создаются таблицы итогов, в которых текущие (актуальные) остатки датируются фиктивной константной датой — 01.11.3999 00:00:00.

Эта дата заведомо больше любого реального значения поля Период в таблице движений регистра. Когда в коде запроса вызывается виртуальная таблица без указания периода:


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

платформа автоматически обращается к актуальным итогам на 01.11.3999 и при необходимости прибавляет движения, сделанные после последней точки расчета итогов. Изменить эту служебную дату программным путем (например, вызовом специального метода) невозможно, так как логика её использования зашита на уровне ядра платформы и транслятора SDBL.

Попытка использования метода УстановитьМаксимальныйПериодРассчитанныхИтогов

В платформе 1С существует метод менеджера регистра накопления УстановитьМаксимальныйПериодРассчитанныхИтогов(). Рассмотрим пример его применения:


РегистрыНакопления.ТоварыНаСкладах.УстановитьМаксимальныйПериодРассчитанныхИтогов(ДатаСеанса);

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

Способы получения остатков на нужную дату

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

  1. Передача периода в параметр виртуальной таблицы (Стандартный способ):

    Для получения корректных остатков на выбранную дату необходимо передавать значение даты в параметр виртуальной таблицы. Это единственный штатный и архитектурно верный путь в 1С:

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

    В коде инициализации запроса передаем нужную дату:

    Запрос.УстановитьПараметр("Период", ДатаРасчета);
  2. Использование системных подписок и снятие активности с записей (Для копий баз и аудита):

    Если требуется проанализировать поведение системы на прошлую дату в копии базы без массового изменения текстов запросов, можно программно выключить активность движений за более поздний период. Для этого у записей регистра устанавливается флаг Запись.Активность = Ложь или отменяется проведение документов после нужной даты. После пересчета итогов данные на 01.11.3999 совпадут с реальными остатками на выбранный момент времени.

  3. Свертка информационной базы:

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

  4. Централизованная подмена текста запроса через расширения:

    В современных конфигурациях при необходимости массовой коррекции запросов в типовых механизмах можно использовать механизмы расширений конфигурации. Если формирование запросов вынесено в общие модули, перехватываем их выполнение и программно вставляем параметр &Период в текст запроса перед его выполнением.

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

← На главную