Параллельный ввод документов, участвующих в последовательности

При автоматизации деятельности предприятия часто встает задача массового ввода документов. К данному режиму предъявляются требования быстрого ввода большого количества документов. Для увеличения пропускной способности системы нужно по возможности распараллелить ввод данной информации. При вводе документов, участвующих в последовательности, узким местом является граница последовательности. Это происходит из-за того, что при проведении документа, участвующего в последовательности, происходит попытка передвинуть границу на момент времени текущего документа. Граница последовательности эксклюзивно захватывается проводимым документом, в результате чего блокируется возможность параллельного проведения других документов.

Для решения проблемы массового ввода документов можно реализовать следующую схему работы документов – при оперативном проведении документов, они не регистрируются в последовательности и не отображаются в учетных механизмах связанных с последовательностями. Такой подход возможен в том случае, если допускается регистрация документов в последовательности в неоперативном режиме. Например, при выписке товара не важно его распределение по партиям. Поэтому, при выписке товар просто списывается со склада, а распределение по партиям производится обработкой с некоторой периодичностью.

Для корректной реализации данной схемы работы с последовательностями нужно выполнить небольшую доработку различных объектов участвующих в механизме последовательности. Описание необходимых доработок проиллюстрируем на следующем примере конфигурации.

Допустим, существует конфигурация, в которой ведется учет прихода и расхода товаров с контролем остатков товара при его отпуске. При этом учет ведется в разрезе партий, где в качестве партии используется приходный документ. Корректность распределения по партиям отпущенного товара отслеживается с помощью последовательности документов. Конфигурация содержит следующие прикладные объекты:

Документы "ПриходнаяНакладная" и "РасходнаяНакладная" при своем проведении производят запись движений в регистры накопления "УчетТовара" и "ПартионныйУчет". При этом при оперативном проведении расходной накладной производится контроль наличия расходуемого товара. Для этого используются данные из регистра "УчетТовара". При своем проведении расходная накладная производит расчет распределения имеющегося в наличии товара по партиям и реализует распределение этого товара по партиям по одному из алгоритмов FIFO или LIFO.

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

Теперь опишем необходимые изменения конфигурации для того, что бы вынести процесс распределения по партиям в отложенный режим, и что бы в оперативном режиме не производилось работы с границей последовательности, которая и является узким местом, препятствующим параллельной работе пользователей.

Изменения конфигурации должны решить две задачи:

Для того чтобы вынести механизм распределения по партиям в отдельную обработку, нужно сделать так, чтобы документы "РасходнаяНакладная" и "ПриходнаяНакладная" не осуществляли расчета распределения по партиям и не выполняли движений в регистре "ПартионныйУчет". То есть, теперь при своем проведении документы не будут делать движения в регистр "ПартионныйУчет". Все движения в данный регистр будут осуществляться специальной обработкой. Обработка может быть реализована различными способами, важно то, что она может выполняться как регламентная операция, и не будет мешать работе пользователей, которые осуществляют оперативный ввод данных.

Для отслеживания момента времени, с которого нужно выполнять распределение по партиям будет использоваться граница последовательности документов "ПартионныйУчет". Документы, для которых нужно осуществлять распределение по партиям, будут извлекаться из таблицы регистрации документов в таблице документов. Расходная накладная автоматически регистрируется в последовательности документов и поэтому здесь менять ничего не надо. В процессе распределения расхода по партиям, обработка должна перемещать границу последовательности, так что бы при последующих запусках пересчет начинался только с еще не посчитанных документов.

Вторая часть изменений касается задачи обеспечения отсутствия блокировок границы последовательности при оперативном проведении документов. Так как документ "РасходнаяНакладная" регистрируется в последовательности документов, то при проведении документа, система будет пытаться переместить границу последовательности на момент времени документа. Что будет приводить к блокировке границы последовательности. Для того чтобы избежать данной ситуации, нужно у последовательности документов в свойстве Перемещение границы при проведении установить значение Не перемещать. Это отключит штатный механизм перемещения границы последовательности и, следовательно, нам удастся избежать блокировки границы последовательности.

Так как мы отказались от осуществления движений по регистру накопления "ПартионныйУчет" при проведении документов, то, с одной стороны, у нас не возникает блокировки границы последовательности, но с другой стороны мы не сбиваем границу последовательности, если документ проводится ранее границы последовательности. Это может привести к тому, что документ, введенный ранее границы последовательности, может никогда не попасть в механизм распределения, что приведет к неправильным данным в учетном механизме. Для оперативно вводимых документов это не страшно, так как считается, что все оперативно вводимые документы, вводятся позже границы последовательности. Для неоперативно вводимых документов требуется проверка, вводятся ли они ранее границы последовательности, и, если это условие выполняется, то требуется переместить границу последовательности ранее момента времени документа. Момент времени, на который переводится граница последовательности, может быть равен дате документа. При этом будет возникать блокировка границы последовательности, но это не так важно, так как считается, что не оперативно документы вводятся не массово и здесь не требуется высокая параллельность работы. Если же не оперативно вводимые документы массовое явление, то рекомендуется границу последовательности переместить ранее периода массового ввода документов и проверку границы последовательности делать без эксклюзивной блокировки. То есть нужно добиться того, что бы проведение документа ранее границы последовательности было редким явлением.

Таким образом, все изменения, производимые в конфигурации, сводятся к следующим: