v8: Быстрое восстановление последовательностей Ключевые слова: последовательность,восстановление,перепроведение,проведение
Быстрое восстановление последовательностей
Существуют данные, критичные к правильной последовательности проведения документов – они только тогда отражают действительное положение вещей, когда документы проводятся последовательно.
Таких последовательностей много – это и взаиморасчеты, и авансы, и партии себестоимости товаров.
В версии 1С 77 единственным способом восстановления актуальности таких данных было последовательное перепроведение документов. Были и другие способы, но их нельзя было называть простыми и прозрачными – например, отключение автоматического удаления движений документов с целью перепроведения документов только по нескольким регистрам.
Платформа 80 предоставляет нам возможность работать с движениями документа как с отдельными данными - не только во время проведения документов.
Это открывает новые возможности для восстановления движений документов. В типовых конфигурациях, например, существует обработка для восстановления партий, которая работает только с регистрами партий, не трогая документов.
Однако это еще не все способы ускорения восстановления последовательностей.
Автор предлагаемого метода – Серов Александр. Я просто описываю одну из конкретных реализаций этого метод в применении к регистрам взаиморасчетов в УПП.
Суть предлагаемого метода заключается в следующем: выбираются все остатки по регистру на некоторую начальную дату, выбираются все движения за восстанавливаемый период. Больше обращений к базе данных на чтение не происходит.
Документы анализируются последовательно. Получаем новые движения документа по регистру. Заносим их в таблицу новых движений, при этом соответственно меняем остатки в таблице остатков так, чтобы они соответствовали остаткам после проведения документов. Т.е. мы эмулируем проведение документа по регистру остатков.
Есть еще один момент, ускоряющий восстановление последовательностей – движения по документу уже сделаны. Т.е. в большинстве случаев можно не повторять логику проведения, а просто взять готовые данные уже на уровне регистра, т.е. немного облегчить задачу проведения.
Естественно, перепроведение нужно запускать или за закрытый период или монопольно, чтобы исключить вмешательство пользователя в базу данных, когда ее копия находится в памяти.
Также можно реализовать перепроведение по выбранным товарам, организациям и контрагентам. Для этого нужно отфильтровать остатки и движения по этим параметрам.
К сожалению, мне лень приводить пример на регистре партий товаров, поэтому я приведу пример, который я реально реализовал – на регистре «РасчетыПоПриобретениюВУсловныхЕдиницахОрганизации» и «РасчетыПоРеализацииВУсловныхЕдиницахОрганизации». Но это не сделает пример менее наглядным, т.к. проведение по этим регистрам – обычный партионный учет, только не товаров, а взаиморасчетов.
Уменьшение периода
Остатки мы действительно получаем только один раз и держим в памяти. Но получать движения за весь период было бы слишком расточительным, поэтому мы будем получать движения порциями – по одному дню, по одной неделе или по одному месяцу. При этом остатки так и остаются актуальными и переходят на следующий период (не извлекаются повторно из базы).
Этапы работы
Этап 1: Получение остатков.
Извлекаются остатки на начало периода. При этом учитываются указанные фильтры по контрагентам, договорам и т.п.
Остатки выгружаются в таблицу, структура которой дублирует структуру регистра в части измерений и ресурсов.
Порядок записей в регистре должен соответствовать порядку списания партий, например FIFO. Желательно в предложении упорядочивания указывать все измерения, чтобы результат не менялся для одних и тех же остатков.
Этап 2: Получение движений.
Извлекаются движения из базы за текущий период. При этом учитываются указанные фильтры по контрагентам, договорам и т.п.
Движения выгружаются в таблицу, структура которой дублирует структуру регистра в части измерений и ресурсов.
Кроме того, у нее есть колонка Регистратор – документ, сделавший движение и колонка ВидДвижения – 1, если это приход и -1, если это расход.
Этап 3: Обработка движений.
Перебираем последовательно все движения. На основе имеющихся движений по более простому алгоритму, чем при проведении, строим новые движения.
В некоторых случаях движения оставляем такие как есть (у нас – по валютным договорам).
Каждое полученное движение заносим в таблицу новых движений и отражаем его результат воздействия на таблицу остатков с помощью вызова функции ЗарегистрироватьДвижениеПоОстаткам.
Важный момент
Нужно сохранять порядок при добавлении движений. Документ может добавлять движения, которых не было в таблице остатков. Тогда в случае FIFO мы должны добавлять новые измерения в конец таблицы, а в случае LIFO – в ее начало. Это важно!
Этап 4: Свертка движений.
В нашем случае движения получаются более атомарными, т.к. они строятся не на основе документа, а на основе имеющихся движений. Поэтому их можно свернуть по измерениям и ресурсам.
Этап 5: Определение изменений.
Можно было бы записать все новые движения, но простое сравнение старых движений с новыми экономит нам существенное время на запись. Мы соединяем старую и новую таблицу движений с разными знаками, выбираем регистраторы, по которым проходит ненулевой результат. На практике более эффективно работал бы построитель запроса к таблице значений.
Этап 6: Запись изменений
Перебираем последовательно все новые движения и по регистраторам, по которым зафиксированы изменения, записываем движения.
Этап 7: Отражение в последовательности
В данном примере не реализован, но если мы восстанавливаем последовательность, неплохо было бы отметить, что документы последовательности восстановлены.
Советы
• Все структуры, которые используются в циклах, создавать заранее, чтобы не тратить время на их создание
• Можно использовать для хранения таблицы остатков структуру Остатки, в которой расписана структура измерений и ресурсов и хранится таблица остатков.
Выводы
Ускорение достигается за счет:
• Остатки обрабатываются в памяти.
• Анализируется, изменились ли движения и записываются в базу только в случае реального изменения.
Возможно, если у вас на восстановление последовательностей тратится много времени, резерв по ускорению работы – в таком методе.
|