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