В платформе 1С:Предприятие 7.7 получение остатков на произвольную дату существенно отличается от механизмов, привычных пользователям версии 8.х. Если в актуальных версиях программы остатки можно получить простым обращением к виртуальной таблице, то в «семерке» итоги хранятся только на момент Точки Актуальности (ТА). Для получения данных за прошлые периоды нам потребуется задействовать механизм временного расчета. Рассмотрим подробно, как реализовать эту задачу на примере конфигурации «Торговля и Склад 9.2».
Прежде чем переходить к коду, разберем теорию. Регистры в 1С 7.7 хранят рассчитанные итоги на конец каждого месяца и на текущий момент времени (ТА). Если нам нужно узнать состояние взаиморасчетов, например, 30 дней назад, система не может просто «прочитать» готовое число из базы. Ей необходимо взять итоги за предыдущий месяц и последовательно прибавить/вычесть движения документов до нужной даты. Этот процесс инициируется методом ВременныйРасчет.
Важно помнить, что временный расчет действует только в пределах локального контекста выполнения кода. Как только процедура завершается, временные итоги «сбрасываются».
Рассмотрим основной способ решения задачи с использованием встроенного языка. Для того чтобы получить задолженность по конкретному контрагенту (или договору), нам необходимо создать объект типа Регистры, выполнить расчет на нужную дату и вызвать метод получения остатка. Проанализируем пример кода:
// Создаем объект для работы с регистрами
ВремРегистры = СоздатьОбъект("Регистры");
РегПокупатели = ВремРегистры.Покупатели;
// Определяем дату, на которую нам нужен остаток
ДатаОстатков = ТекущаяДата() - 30;
// Проверяем, не превышает ли дата точку актуальности
Если (ДатаОстатков > ПолучитьДатуТА()) Тогда
Предупреждение("Остаток не может быть посчитан: дата в будущем относительно ТА!");
Иначе
// Включаем режим временного расчета
РегПокупатели.ВременныйРасчет(1);
// Рассчитываем итоги на нужный момент времени
ВремРегистры.РассчитатьРегистрыНа(ДатаОстатков);
// Получаем остаток по измерениям (Фирма, Договор и т.д.)
// Параметры метода СводныйОстаток: Фирма, Договор, КредитныйДокумент...
Долг = РегПокупатели.СводныйОстаток(ВыбФирма, ВыбДоговор, , , "СуммаВал");
Сообщить("Задолженность на " + ДатаОстатков + " составляет: " + Долг);
КонецЕсли;
При расчете регистров начинающие разработчики часто путают два ключевых метода. Выясним причину их различия:
Если ваша задача — проверить кредитный лимит перед отгрузкой, логичнее использовать расчет на начало дня или на конкретную позицию документа, чтобы видеть «чистый» долг до совершения текущей операции.
Проанализируем ситуацию: если вам нужно получить остатки по 1000 контрагентов в цикле, вызов РассчитатьРегистрыНа на каждой итерации приведет к катастрофическому падению производительности. Система будет каждый раз пересчитывать итоги заново.
Чтобы избежать этого, рекомендуем следующий алгоритм:
УстановитьФильтр.РассчитатьРегистрыНа один раз перед циклом.СводныйОстаток или предварительно выгрузите все итоги в Таблицу Значений методом ВыгрузитьИтоги. Работа с таблицей значений в оперативной памяти происходит в разы быстрее.В типовой конфигурации «Торговля и Склад 9.2» многие задачи уже решены разработчиками 1С. Прежде чем писать свой велосипед, стоит заглянуть в Глобальный модуль. Там часто встречается функция глТекущийДолг(Фирма, Договор, Роль). Хотя она обычно возвращает текущее состояние на момент ТА, ее можно взять за основу и доработать, добавив параметр даты.
Также обратите внимание на объект глОбъектРасчетов, который часто используется в ТиС для анализа дебиторской и кредиторской задолженности. Использование типовых функций гарантирует, что вы не забудете учесть специфические разрезы учета, такие как валютные суммы (СуммаВал) или рублевый эквивалент в управленческом учете (СуммаУпр).
Регистр Покупатели в ТиС является остаточным. Он хранит информацию в разрезе следующих измерений:
При получении остатка убедитесь, что вы передаете правильные типы данных в параметры метода СводныйОстаток. Если какое-то измерение не важно для расчета (например, вы хотите общий долг по всем договорам контрагента), просто оставьте соответствующий параметр пустым.
Подведем итог: для получения суммы долга на конкретную дату в 1С 7.7 необходимо использовать объект Регистры, включить ВременныйРасчет и вызвать РассчитатьРегистрыНа. Это надежный и штатный способ получения исторических данных в старых версиях платформы.