Способы подхода к хранению остатков Ключевые слова: остатки,СУБД,регистры
Рассмотрим основные способы хранения остатков в базе данных, а затем посмотрим, какой из них используется в 1С.
Формализуем задачу. Пусть есть некоторый набор измерений, и числовых ресурсов по которым могут проходить движения со знаком плюс(приход) или минус(расход).
Например для измерений Склад, Товар есть ресурс Количество.
Нам нужно узнать остаток на любой момент времени.
Всего известно 3 метода хранения остатков. Других пока не придумано.
Во всех SQL-запросах используются:
MotionTable - таблица движений
RestTable - таблица остатков
&Date - дата, на которую нужно получить остатки
BeginOfMonth - функция получения начала месяца из даты
BETWEEN - оператор проверки вхождения даты в интервал А, Б
Все запросы написаны условно, без оператора FROM.
1. Хранение движений, остатки вычисляются
Остатки не хранятся в базе данных.
При необходимости получения остатка на некоторую дату суммируются все движения, произошедшие ранее даты получения остатков.
Достоинства: минимальный объем базы.
Недостатки: низкая скорость чтения остатков.
Степень сложности написания запросов к остаткам: низкая.
Пример SQL запроса:
SELECT Sum(MotionTable.Summ) WHERE MotionTable.Date<&Date
2. Хранение движений и баланса
В каждом движении хранится также и баланс(остаток), который возникает по измерениям после совершения данного движения.
Таким образом остатки получаются чтением одной записи, дата которой максимально близка к дате получения остатков.
Достоинства: высокая скорость чтения остатков.
Недостатки: максимальный объем базы, низкая скорость записи остатков.
Степень сложности написания запросов к остаткам: низкая.
Пример SQL запроса:
SELECT Sum(MotionTable.Summ) WHERE MotionTable.Date=SELECT (Max(MotionTable.Date) WHERE MotionTable.Date<=&Date)
3. Хранение движений и баланса опорных дат
Остатки хранятся обычно в отдельной таблице (хотя возможно и совмещение) и с заданной периодичностью - например, на начало каждого месяца, недели, квартала. П
Остатки получаются путем чтения записи на начало периода и суммированием всех движений за период.
Характеристики: средний объем базы, средняя скорость чтения остатков, средняя скорость записи остатков.
Недостатки: высокая степень сложности написания запросов.
Степень сложности написания запросов к остаткам: высокая.
Пример SQL запроса:
SELECT RestTable.Summ+Sum(MotionTable.Summ) WHERE RestDate.Data=BeginOfMonth(&Date) AND MotionTable.Date BETWEEN (BeginOfMonth(&Date), &Date)
Особенности 1С1С 7.7
В 1с версии 77 используется третий метод.
Итоговая таблица остатков: месяц декада пятнадцать дней 5 дней.
Итоговая таблица оборотов: день неделя декада месяц квартал год.
1С 8.0
Используется третий метод.
Итоговая таблица остатков и оборотов хранит итоги на начало каждого месяца.
Еще если до даты на которую есть остатки осталось мало дней можно вычитать из нее.... данные механизмы с целью ускорения могут быть реализованы на SQL процедурах, а так же возможно создание дополнительной таблицы в которой хранятся записи, которые на дынный момент не учтены в "текущих хранимых" остатках
Кроме того довольно серьезная проблема с паралельным занесением данных, в 8.1 это реализовано с помощью разделяемых остатков |