Книга знаний

1С:Предприятие / v8 / Объекты конфигурации / Документы

v8: Быстрое восстановление последовательностей

Быстрое неуниверсальное восстановление последовательностей документов, таких как партии товаров, взаиморасчеты и т.п.Автор статьи: Гений 1С | Редакторы:
Последняя редакция №2 от 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: Отражение в последовательности
В данном примере не реализован, но если мы восстанавливаем последовательность, неплохо было бы отметить, что документы последовательности восстановлены.


Советы
•    Все структуры, которые используются в циклах, создавать заранее, чтобы не тратить время на их создание
•    Можно использовать для хранения таблицы остатков структуру Остатки, в которой расписана структура измерений и ресурсов и хранится таблица остатков.

Выводы


Ускорение достигается за счет:
•    Остатки обрабатываются в памяти.
•    Анализируется, изменились ли движения и записываются в базу только в случае реального изменения.

Возможно, если у вас на восстановление последовательностей тратится много времени, резерв по ускорению работы – в таком методе.

Закладка

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

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