Данная тема, наверно, будет интересна специалистам, занимающимся технической поддержкой торговых систем.
Одно время я плотно занимался разработкой и поддержкой конфигураций
на одной очень распространенной платформе. В последствии, анализируя накопленный опыт, я пришел к выводу, что источником львиной доли проблем был механизм "проведения" документов. Документы после сохранения проводились, в результате чего в различные служебные таблицы заливались дополнительные записи, на основании которых в дальнейшем строились отчеты. Трудности начинались при последующих корректировках документов или изменениях расчетных алгоритмов.
Поэтому при разработке проекта КупецЪ изначально было принято решение пойти по другому пути. Механизм утверждения документов в Купце внешне напоминает проведение, но это всего лишь отметка, что документ надо учитывать в финансовых и товарных отчетах.
Рассмотрим типичную ситуацию с учетом движения товаров. В системе с проведением документов делаются записи в регистр, имеющий индекс типа товар-дата-время операции. Используя этот индекс, программа может быстро выбрать все движения по товару за заданный период времени, читая минимум информации из базы данных.
Мы хотим получить аналогичный результат, но обойтись без дополнительной таблицы регистра. Сложность в том, что дата и время хранятся в заголовке накладной, а ссылка на товары - в строках. Чтобы получить желаемый индекс, мы используем денормализацию и сохраняем дату и время в строках накладной.
В обычной ситуации вначале создается заголовок накладной, затем добавляются строки. Для каждой новой строки просто присваиваем дату и время из заголовка. Но может возникнуть ситуация, когда надо изменить дату или время у существующей накладной.
Для этого случая был введен термин "критичные реквизиты документа". При их изменении запускается специальная обработка, которая синхронизирует нужные значения в заголовке документа и в его строках. На приведенном ниже скриншоте критичными реквизитами документа являются поля ввода даты и времени, кнопка выбора даты из календаря.
Описанная технология дает огромный эффект. В базе нет дополнительного слоя информации. Имея механизм быстрого доступа к данным, мы можем выполнять все расчеты "на лету". Ничего не надо перепроводить, все отчеты всегда выводят актуальные результаты.
А это, в свою очередь, снимает много головной боли при сопровождении программы.