Приветствую Вас ГостьЧетверг, 16.05.2024, 05:03

Каталог статей


Последовательность

Последовательность документов содержит информацию о дате последнего правильного проведенного документа, который входит в эту последовательность.

Граница последовательности - дата, до которой проведенные документы считаются правильными. Если есть документы, у которых дата больше границы последовательности, то они считаются неправильными и их надо перепровести.

Последовательность может быть разделена внутри по измерениям. Это сделано для того, чтобы определить неправильные документы только для определенного значения измерения, например только документы по определенному товару.

Автоматическое отслеживание изменения таких данных осуществляется только для регистров:

  • регистров накопления,
  • регистров сведений,
  • регистров бухгалтерии,
  • регистров расчета.

Регистрация 

Физически – последовательность состоит из двух таблиц с одинаковым количество столбцов (Период, Регистратор, Измерение1, …, ИзмерениеN), но разными по смыслу:

1. Таблица регистрации (ТР) – коллекция зарегистрированных в последовательности документов в разрезе измерений. В случае повторной записи документа сначала удаляется старая запись, затем записывается новая.

2. Таблица границ (ТГ) – хранит границу последовательности в разрезе измерений, одно измерение – одна запись если измерений нет, то у таблицы границ одна запись. Запись таблицы границ показывает, какой документ в таблице регистрации является последним правильно проведённым, т.е. не нарушившим правильное ведение учёта.

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

Важной особенностью данного процесса является то, что перенос границы последовательности назад (сбивание границы) происходит только при записи наборов записей регистров при условии, что граница последовательности больше периода движения в регистре. Нет значения, каким способом вносятся изменения в регистр: при стандартном проведении документа или программно (вручную).

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

Добавление документа в последовательность

Добавление документа в последовательность может быть выполнена автоматически или вручную.

Автоматическое добавление происходит если у документа, входящего в последовательность свойство "Заполнение последовательности" = "Заполнять автоматически".

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

Например настройка свойств для измерения "Номенклатура" последовательности.

Последовательность событий при записи документа

Процесс записи документа
Начало транзакции
            Автоматическое заполнение наборов записей регистрации документа в последовательности
            Вызов предопределенной процедуры ПередЗаписью()
            Запись документа
            Вызов предопределенной процедуры ПриЗаписи()
            Запись измененных и не записанных наборов записей движений документа
                       Проверка и перенос границ последовательностей на момент времени движений (данное действие производится в наборе записей, не в документе!)
            Запись измененных и не записанных наборов записей регистрации документа в последовательностях
Конец транзакции

Процесс записи документа с проведением
Начало транзакции
            Автоматическое заполнение наборов записей регистрации документа в последовательности
            Вызов предопределенной процедуры ПередЗаписью()
            Запись документа
            Вызов предопределенной процедуры ПриЗаписи()
            Вызов предопределенной процедуры ОбработкаПроведения()
            Запись измененных и не записанных наборов записей движений документа
                       Проверка и перенос границ последовательностей на момент времени движений (сбивание)
            Запись измененных и не записанных наборов записей регистрации документа в последовательностях
            Проверка и перенос границы последовательности на момент времени регистрации документа (восстановление)
Конец транзакции

При автоматическом способе регистрации наборы записей таблиц регистрации документов в последовательностях автоматически заполняются до записи документа и записываются после записи документа в одной транзакции.

 

Если требуется изменить набор записей в последовательности, то это можно сделать в в обработчике события ПередЗаписью или ПриЗаписи объекта документа (не путать с аналогичными обработчиками событий ПередЗаписью формы документа).

Например:

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)

    НаборЗаписейРегистрации =  
                        ПринадлежностьПоследовательностям.ПартионныйУчет;

    // Очистить автоматически сформированный набора записей регистрации
    НаборЗаписейРегистрации.Очистить();

    // Получить выборку товаров из табличной части документа
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
    |    РеализацияТоваровСостав.Номенклатура
    |ИЗ
    |    Документ.РеализацияТоваров.Состав КАК РеализацияТоваровСостав
    |ГДЕ
    |    РеализацияТоваровСостав.Ссылка = &Ссылка
    |    И (НЕ РеализацияТоваровСостав.Номенклатура.Услуга)";

    Запрос.УстановитьПараметр("Ссылка", Ссылка );

    Результат = Запрос.Выполнить();
    Выборка = Результат.Выбрать();

    // Добавить новые записи регистрации и заполнить их
    Пока Выборка.Следующий() Цикл
        НоваяЗапись = НаборЗаписейРегистрации.Добавить();
        НоваяЗапись.Номенклатура = Выборка.Номенклатура;
        НоваяЗапись.Период = Дата;
    КонецЦикла;

КонецПроцедуры  

Ручной перенос границы.

  • Перенос границы последовательности на произвольный момент времени

// Подготовить параметры установки границы последовательности:
// Момент времени установки
МоментУстановки = Новый МоментВремени(ДатаУстановки, ДокументУстановки);

// Подготовить структуру отбора по значениям измерений последовательности,
ОтборПоИзмерениям = Новый Структура;
ОтборПоИзмерениям.Вставить("Номенклатура", НоменклатураУстановки);

// Установить границы последовательности "Партионный учет"
Последовательности.ПартионныйУчет.УстановитьГраницу(МоментУстановки, ОтборПоИзмерениям);

  • Получить границы последовательности

ТаблицаГраницПоследовательности = Последовательности.ПартионныйУчет.ПолучитьГраницы("Номенклатура"); // получение границ по измерению.

Обязательно задаем название измерения или структура отбора. ТаблицаГраницПоследовательности состоит из колонок: Номенклатура, Граница последовательности.

ТекущаяГраницаПоследовательности = Последовательности.ПартионныйУчет.ПолучитьГраницу(); // получить первую границу

  • Восстановить последовательность целиком

Последовательности.ПартионныйУчет.Восстановить();

  • Восстановить последовательность документов ПартионныйУчет по момент времени документа из переменной СсылкаНаДокумент по значению измерения Номенклатура, хранящемуся в переменной Товар. 

// Сформировать момент времени, по который будет восстанавливаться последовательность
МоментВосстановленияПо = Новый МоментВремени(СсылкаНаДокумент.Дата, СсылкаНаДокумент);

// Сформировать таблицу отбора
ТаблицаКомбинацийИзмерений = Новый ТаблицаЗначений;
 
// Добавить колонки с именами, соответствующими
// именам измерений последовательности
ТаблицаКомбинацийИзмерений.Колонки.Добавить("Номенклатура");
 
// Добавить строку(и) со значением(ями) отбора
СтрокаТаблицы = ТаблицаКомбинацийИзмерений.Добавить();
СтрокаТаблицы.Номенклатура = СсылкаНаТовар;
 
// Восстановить последовательность
Последовательности.ПартионныйУчет.Восстановить(МоментВосстановленияПо, ТаблицаКомбинацийИзмерений);

Примеры использования последовательностей

1. Использование последовательности для учета правильности списания партий товаров со склада. Например 01.10 был приход в количестве 10 штук товара. 15.10 Было списание 7 штук, при списании все 7 штук были списаны из партии от 01.10. Потом задним числом добавили списание 8 штук от 07.10. После добавления этого документа списание от 15.10 стало неверным как минимум неверное указание партии потому что количества не хватит. При проведении документа от 07.10 граница последовательности смещается и документ от 15.10 считается неправильным и его надо перепровести.

2. Пользователи в течение дня вводят поток заявок от покупателей и внутренних заявок. В силу специфики автоматизируемого предприятия часто имеет место ситуация ввода нескольких заявок от одних и тех же покупателей или для одних и тех внутренних подразделений. Кроме того, возможен ввод «запоздавших» заявок прошлых дней. Документы записываются, но не проводятся.

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

Методы менеджера последовательности ПоследовательностьМенеджер.< ИмяПоследовательности > 

Последовательность.«ИмяПоследовательности».Восстановить
Последовательность.«ИмяПоследовательности».ПолучитьГраницу
Последовательность.«ИмяПоследовательности».ПолучитьГраницы
Последовательность.«ИмяПоследовательности».Принадлежит
Последовательность.«ИмяПоследовательности».Проверить
Последовательность.«ИмяПоследовательности».СоздатьНаборЗаписей
Последовательность.«ИмяПоследовательности».УстановитьГраницу

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

Как было описано выше, в базе данных информация последовательностей документов хранится в двух таблицах:

  • таблице записей регистрации документов в последовательности;
  • таблице границ последовательностей.

Выполнение различных действий с последовательностью в клиент-серверном варианте использования программы порождает блокирование этих таблиц в различных диапазонах:

  • При регистрации документа в последовательности происходит добавление или модификация набора записей таблицы регистрации документов в последовательности, подчиненного регистратору. Поэтому заблокированным оказывается как минимум диапазон записей, соответствующих одному регистратору (плюс две граничные записи «вокруг» этого диапазона).
  • При перемещении границы последовательности назад происходит модификация записей границ по соответствующим комбинациям значений измерений. Поэтому блокируются записи таблицы границ последовательности, соответствующие данным комбинациям значений измерений. А если измерений в последовательности нет, то вся таблица целиком.
  • При перемещении границы последовательности вперед. Этот процесс происходит только при проведении документа, поэтому блокируются обе таблицы. Таблица регистрации документов в последовательности оказывается заблокированной в диапазоне от границы последовательности по момент времени регистрации проводимого документа в последовательности. То есть заблокированными могут оказаться записи, подчиненные документам не проведенным, но зарегистрированным в последовательности в указанном интервале. Таблица границ последовательностей будет заблокирована целиком. Если у последовательности есть измерения, то вышеописанные блокировки при данном действии будут касаться только записей с комбинациями значений измерений, совпадающими со значениями измерений записей регистрации.
  • В файловом варианте работы системы в любом случае происходит блокировка таблиц целиком.

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

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

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

В этом случае при проведении документа, даже если он регистрируется в последовательности, система не предпринимает попытки перемещения границы (границ) последовательности. А блокировки, возникающие при регистрации разных документов в последовательности, не мешают друг другу. То есть тогда работа с объектом Последовательность не препятствует параллельному проведению документов.

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

Категория: Объекты конфигурации и типы данных | Добавил: leshic (31.08.2022)
Просмотров: 403 | Рейтинг: 0.0/0
Всего комментариев: 0
Имя *:
Email *:
Код *:
Вход на сайт
Поиск
Категории раздела
СКД [48]
Регистры [7]
Формы [41]
Администрирование [35]
Запросы [10]
Объекты конфигурации и типы данных [20]
Взаимодействие с другими базами, приложениями и источниками данных [16]
Программирование [29]
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0