Подскажите пожалуйста. Можно ли в инете где-нибудь посмотреть
реализации (исходники) регистров подобных тем, что используются в 1С.
("самопальные" реализации для СУБД не поддерживающих OLAP)
Здравствуйте, John Scherbatov, Вы писали:
JS>Господа, доброго времени суток.
JS>Подскажите пожалуйста. Можно ли в инете где-нибудь посмотреть JS>реализации (исходники) регистров подобных тем, что используются в 1С. JS>("самопальные" реализации для СУБД не поддерживающих OLAP)
"Регистр" в 1C почти точно соостветствует конструкции "звезда" (star schema) в ROLAP. Поищи в inete.
Всю реализацию целесообразно делать на хранимых процедурах. Чтобы получить подобие "регистра", добавляем к "звезде" возможность быстрого получения "остатков" на текущий момент по измерениям (они хранятся в рассчитаном виде, к примеру, в другой таблице, их можно считать триггерами).
Также в регистре хранятся заранее рассчитанные остатки на конец каждого месяца (оптимизация для скорости) — ну это, в общем, тоже можно сделать по желанию. Можно хранить рассчитанные обороты по периодам с той же целью, здесь все зависит от твоих задач.
Здравствуйте, John Scherbatov, Вы писали:
JS>Подскажите пожалуйста. Можно ли в инете где-нибудь посмотреть JS>реализации (исходники) регистров подобных тем, что используются в 1С. JS>("самопальные" реализации для СУБД не поддерживающих OLAP)
Да там собственно все просто. Регистр это две таблички. Первая это собственно сами операции, упорядоченные по дате, вторая это табличка итогов. Табличка итогов имеет структуру, совпадающую с рабочей, но в полях ресурсов храняться итоги на определенную дату для определенного сочетания реквизитов. При добавлении/удалении записи в первую табличку ресурсы ее добавляются/вычитаются из соотв. итога (с совпадающими значениями реквизитов). Если записи с совпадающими реквизитами не найдено, она добавляется, а итог образуется из суммы самого свежего существующего итога и суммы текущей операции. Кроме того корректируется дата итогов. В 1С дата текущих итогов называется точка актуальности.
Раз в период (1 мес. в 1С:Торговля) итоги фиксируются, а новые записи позже даты окончания периода начинают формировать новые итоги.
Запрос по табличке простой — выбираются самые свежие итоги с указанным набором значений реквизитов.
Главный недостаток — довольно сложная модификация операций задним числом.
Здравствуйте, ax, Вы писали:
ax>Здравствуйте, AndrewVK, Вы писали:
AVK>>Главный недостаток — довольно сложная модификация операций задним числом.
ax>вы имеете ввиду то, что надо при создании движения на дату меньше ТА пересчитывать все последующие итоги на начало периодов?
Не обязательно, но вообще говоря надо. Здесь все зависит от схемы движений по регистру.
Пример — регистр остатки товаров.
В случае, если мы ведем учет товаров по средневзвешенной цене, пересчитывать все движения и итоги после точки модификации не надо. Правятся только итоги. Регистр выглядит так: Товар, Склад -> КолВо, ЗакупочнаяСтоимость.
Если учет ведется по FIFO/LIFO — дазвиданья. Все последующие отрицательные движения должны быть удалены и сгенерированны заново, так как движения зависят от остатков на складе ( Товар, ПриходнаяНакладная, Склад -> КолВо, ЗакупочнаяСтоимость ). Для того, чтобы записать расход по нему, мы получаем остатки товара в разрезе приходных накладных упорядоченные по дате этих накладных. После чего генерируем набор проводок закрывая партии по одной в соответствующем порядке (FIFO или LIFO).
Такие алгоритмы встречаются, но не слишком часто. Собственно, метод рассчета себестоимости FIFO/LIFO и есть наиболее распространенный случай.
Здравствуйте, Gaperton, Вы писали:
ax>>вы имеете ввиду то, что надо при создании движения на дату меньше ТА пересчитывать все последующие итоги на начало периодов?
Вижу, что в предыдущем посте ответил на какой-то другой, незаданный вопрос . Извините