Как получить остаток по регистру на определенную дату в 1С 7.7 с помощью метода ВременныйРасчет()?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

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

Принцип работы временного расчета и вычисления остатков

Когда требуется получить остатки не на текущую точку актуальности (ТА), а на произвольную дату или позицию документа, необходимо перевести объект регистра в режим временного расчета. Метод РассчитатьРегистрыНа('26.01.2018') вычисляет состояние регистра строго на начало указанной даты (00:00:00). Движения, совершенные в течение этого дня, в расчет не попадают.

Рассмотрим базовую последовательность действий при работе с временным расчетом:

  1. Создаем объект регистра через СоздатьОбъект("Регистр.НазваниеРегистра").
  2. Включаем режим временного расчета вызовом метода ВременныйРасчет().
  3. При необходимости накладываем фильтры с помощью УстановитьФильтр() или УстановитьЗначениеФильтра() до выполнения расчета.
  4. Вызываем метод РассчитатьРегистрыНа(Дата) или РассчитатьРегистрыПо(Документ).
  5. Считываем рассчитанные значения остатков из объекта регистра.

Заполнение измерений регистра и метод ОстаткиПолучить()

Для считывания всех ресурсов регистра по конкретной комбинации измерений используется метод ОстаткиПолучить(). Чтобы платформа понимала, по каким именно объектам аналитики (измерениям) запрашивается остаток, предварительно необходимо заполнить атрибуты регистра значениями измерений.

Рассмотрим пример кода:


Рег = СоздатьОбъект("Регистр.Банк");
Рег.ВременныйРасчет();
РассчитатьРегистрыНа('26.01.2018');

// Присваиваем значения измерениям регистра
Рег.РасчетныйСчет = ВыбранныйСчет;

// Получаем все ресурсы по указанному измерению
Если Рег.ОстаткиПолучить() = 1 Тогда
    ТекОстаток = Рег.ОстатокСуммы;
КонецЕсли;

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

После вызова Рег.ОстаткиПолучить() платформа считывает остатки по заданным измерениям, и их значения становятся доступны прямо из атрибутов-ресурсов объекта регистра.

Выбор метода: Остаток(), СводныйОстаток() или ОстаткиПолучить()

В зависимости от структуры регистра и поставленной задачи выберем наиболее подходящий метод считывания данных:

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

Проанализируем пример получения значения одного ресурса через Остаток():


Рег = СоздатьОбъект("Регистр.Банк");
Рег.ВременныйРасчет();
РассчитатьРегистрыНа('26.01.2018');

// Запрашиваем остаток конкретного ресурса "Сумма" по расчетному счету
СуммаОстатка = Рег.Остаток(ВыбранныйСчет, "Сумма");

Массовая выгрузка итогов с помощью ВыгрузитьИтоги()

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

Рассмотрим пример выгрузки рассчитанных итогов в Таблицу Значений:


ТЗ = СоздатьОбъект("ТаблицаЗначений");

Рег = СоздатьОбъект("Регистр.Банк");
Рег.ВременныйРасчет();
РассчитатьРегистрыНа('26.01.2018');

// Выгружаем все рассчитанные остатки в таблицу значений
Рег.ВыгрузитьИтоги(ТЗ);

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

Оптимизация производительности и альтернативные решения

Выполнение временного расчета требует от платформы 1С 7.7 считывания таблиц итогов и пересчета всех движений от ближайшей границы месяца до заданной даты. Чтобы предотвратить падение производительности на больших базах данных, придерживаемся следующих правил:

  1. Установка фильтров до расчета: вызов методов фильтрации (например, УстановитьФильтр()) следует делать до вызова РассчитатьРегистрыНа(). В этом случае платформе не придется пересчитывать лишние движения по неуказанной аналитике.
  2. Использование языка запросов 1С 7.7: альтернативным и зачастую более универсальным способом является применение объекта Запрос. С помощью встроенного языка запросов можно задать период (Период с НачДата по НачДата;) и извлечь функции НачОст() или КонОст() с автоматической группировкой и фильтрацией.
← На главную