Книга знаний

Инф. технологии / Общие вопросы / Архитектура

Способы подхода к хранению остатков

Рассмотрим основные способы хранения остатков в базе данных, а затем посмотрим, какой из них используется в 1С.Автор статьи: Гений 1С | Редакторы: ERWINS,
Последняя редакция №3 от 29.08.06 | История
URL: http://kb.mista.ru/article.php?id=352

Ключевые слова: остатки,СУБД,регистры


Рассмотрим основные способы хранения остатков в базе данных, а затем посмотрим, какой из них используется в 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 это реализовано с помощью разделяемых остатков

Описание | Рубрикатор | Поиск | ТелепатБот | Захваченные статьи | Установки | Форум
© Станислав Митичкин (Волшебник), 2005-2025 | Mista.ru

Яндекс.Метрика