В платформе 1С:Предприятие 7.7 для получения остатков по регистру накопления на произвольный момент времени в прошлом используется механизм временного расчета. В этой статье разберем, как правильно инициализировать метод ВременныйРасчет(), выполнить команду РассчитатьРегистрыНа() и извлечь необходимые значения с помощью методов ОстаткиПолучить(), Остаток(), СводныйОстаток() или ВыгрузитьИтоги().
Когда требуется получить остатки не на текущую точку актуальности (ТА), а на произвольную дату или позицию документа, необходимо перевести объект регистра в режим временного расчета. Метод РассчитатьРегистрыНа('26.01.2018') вычисляет состояние регистра строго на начало указанной даты (00:00:00). Движения, совершенные в течение этого дня, в расчет не попадают.
Рассмотрим базовую последовательность действий при работе с временным расчетом:
СоздатьОбъект("Регистр.НазваниеРегистра").ВременныйРасчет().УстановитьФильтр() или УстановитьЗначениеФильтра() до выполнения расчета.РассчитатьРегистрыНа(Дата) или РассчитатьРегистрыПо(Документ).Для считывания всех ресурсов регистра по конкретной комбинации измерений используется метод ОстаткиПолучить(). Чтобы платформа понимала, по каким именно объектам аналитики (измерениям) запрашивается остаток, предварительно необходимо заполнить атрибуты регистра значениями измерений.
Рассмотрим пример кода:
Рег = СоздатьОбъект("Регистр.Банк");
Рег.ВременныйРасчет();
РассчитатьРегистрыНа('26.01.2018');
// Присваиваем значения измерениям регистра
Рег.РасчетныйСчет = ВыбранныйСчет;
// Получаем все ресурсы по указанному измерению
Если Рег.ОстаткиПолучить() = 1 Тогда
ТекОстаток = Рег.ОстатокСуммы;
КонецЕсли;
Разберем, что происходит в данном коде: присвоение вида Рег.РасчетныйСчет = ВыбранныйСчет или Рег.Клиент = Конт.Клиент передает значению измерения конкретный объект справочника или значение из формы/документа. Переменная Конт (контекст) используется в платформе 1С 7.7 при вызове процедур из внешних модулей или форм, где под Конт понимается контекст текущей формы или документа.
После вызова Рег.ОстаткиПолучить() платформа считывает остатки по заданным измерениям, и их значения становятся доступны прямо из атрибутов-ресурсов объекта регистра.
В зависимости от структуры регистра и поставленной задачи выберем наиболее подходящий метод считывания данных:
ОстаткиПолучить() считывает сразу все ресурсы регистра, но требует предварительного задания всех измерений.Остаток(ЗначениеИзмерения1, ..., "ИмяРесурса") позволяет сразу вернуть числовое значение конкретного ресурса.СводныйОстаток(ЗначениеИзмерения, "ИмяРесурса") агрегирует итоги по указанным измерениям, игнорируя незаполненные.Проанализируем пример получения значения одного ресурса через Остаток():
Рег = СоздатьОбъект("Регистр.Банк");
Рег.ВременныйРасчет();
РассчитатьРегистрыНа('26.01.2018');
// Запрашиваем остаток конкретного ресурса "Сумма" по расчетному счету
СуммаОстатка = Рег.Остаток(ВыбранныйСчет, "Сумма");
Если необходимо получить остатки сразу по всем элементам и измерениям регистра без индивидуального обращения к каждому объекту в цикле, наиболее эффективным решением будет метод ВыгрузитьИтоги().
Рассмотрим пример выгрузки рассчитанных итогов в Таблицу Значений:
ТЗ = СоздатьОбъект("ТаблицаЗначений");
Рег = СоздатьОбъект("Регистр.Банк");
Рег.ВременныйРасчет();
РассчитатьРегистрыНа('26.01.2018');
// Выгружаем все рассчитанные остатки в таблицу значений
Рег.ВыгрузитьИтоги(ТЗ);
Данный подход работает существенно быстрее регулярных вызовов индивидуальных функций в цикле, так как выгрузка всех рассчитанных строк происходит одной командой на платформенном уровне.
Выполнение временного расчета требует от платформы 1С 7.7 считывания таблиц итогов и пересчета всех движений от ближайшей границы месяца до заданной даты. Чтобы предотвратить падение производительности на больших базах данных, придерживаемся следующих правил:
УстановитьФильтр()) следует делать до вызова РассчитатьРегистрыНа(). В этом случае платформе не придется пересчитывать лишние движения по неуказанной аналитике.Запрос. С помощью встроенного языка запросов можно задать период (Период с НачДата по НачДата;) и извлечь функции НачОст() или КонОст() с автоматической группировкой и фильтрацией.