Шаблоны Joomla 2.5 здесь: http://joomla25.ru/shablony/

Проведение и движения документа

Проведение и движения документа

Самая важная вкладка, на которой определяется состав регистров, по которым будет делать движения документ:

Рассмотрим подробно свойства документа на этой странице:

Проведение — разрешить или запретить. Определяет, будут ли движения по данному документу.

Оперативное проведение — разрешить или запретить. Если установлено разрешить, то проведение документа будущей датой невозможно.

Удаление движений — определяет режим очистки движений документа:

  • Удалять автоматически при отмене проведения. При перепроведении документа движения перезаписываются, а при отмене проведения движения документа автоматически удаляются.
  • Удалять автоматически. При записи документа с проведением сначала будут удалены все старые движения документа. На момент выполнения обработчика события ОбработкаПроведения в регистрах не будет наборов записей с движениями данного документа, т.е. значит, что движения будут удаляться в любом случае, даже если документ 1С перепроводится.
  • Не удалять автоматически — значит, что удаление движений берет на себя разработчик системы.

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

 

Признак записи движений - доработать описание

Движения.<ИмяРегистра>.Записывать = Истина;

Истина - Происходит запись набора данных в информационную базу при вызове Записать коллекции движений документа, которой принадлежит набор, а также при стандартной обработке проведения документа

Движения.<ИмяРегистра>.Записывать = Ложь;

Ложь - не происходит записи набора в информационную базу при вызове Записать коллекции движений документа, которой принадлежит набор, а также при стандартной обработке проведения документа, если значение свойства метаданного документа "Запись движений при проведении" в Конфигураторе выставлено в "Записывать выбранные". 

 

Особенности записи регистров.

Движения.<ИмяРегистра>.Записывать = Истина;
Движения.<ИмяРегистра>.Записать();

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

Если используется метод коллекции движений документа Движения.Записать(), то выполняется запись движений по регистрам, у которых установлен маркер записи «Записывать» в значении «Истина», после чего устанавливает его в значение «Ложь». Т.е. после выполнения такого кода, -

Движения.Записать();

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

 

Какой вариант записи выбрать

Итак, движения сформировали, самое время их записать. Тут есть два варианта. либо Движения.Записать();  либо Движения.ОстаткиТоваров.Записать(); В чем разница и что выбрать?

Начнем с последнего: Движения.ОстаткиТоваров.Записать()Этот способ безусловно запишет данные в регистр накопления. Но при этом флаг "Записывать" у набора записей снят не будет. Но это ерунда, главное тут то, что при большом количестве наборов записей у документа нам придется самостоятельно контролировать что в каком порядке в базу пишется, это может (да что там "может", точно скажется) негативно сказаться на проблеме взаимных блокировок (DeadLock), когда одна транзакция заблокирует таблицу А и будет ждать освобождения таблицы Б, а другая транзакция будет вести себя строго наоборот. 

теперь посмотрим как работает метод Движения.Записать()Метод записывает только те движения документа у которых установлен флаг "Записывать", при этом флаг в итоге снимается, что не приводит к повторной записи движений по окончании транзакции проведения. И главное, Движения.Записать()всегда записывают движения в том порядке в котором таблицы указаны в дереве метаданных, что на порядок уменьшает шансы взаимных блокировок, ведь все транзакции в одинаковом порядке блокируют таблицы.

Теперь надеюсь очевидно, выбираем метод Движения.Записать();