Примерная схема проведения документов (Механизм Проведения) в ERP 2.5.x.x.
Процедуры в блоках расположены в порядке вызовов по стеку. (верхние вызываются перед теми, что ниже)
Предлагаю использовать как отправную точку, и некий шаблон для понимания "общей" картины действия по проведению документа в типовом решении. ( Что, где, как надо изменить чтобы встроить свой документ / регистр и т.д. в решение)
Все видно на схеме. (см. скриншот, или во вложении схема построенная с помощью https://www.draw.io/, + pdf, html, svg)
Основное "ядро" механизма это ОМ "ПроведениеДокументов". Далее идет ряд обязательных требований к процедурам, которые должны быть оформлены в ОМ, МО, ММ, МНЗ задействованных объектов в собственной схеме учета чего либо...которую можно назвать "собственный учетный механизм"
Принятые имена и сокращения:
- МодульУчетногоМеханизма - ОМ, либо ММ любого объекта который выбрали хранилищем "логики" собственного учетного механизма
- МО - Модуль объекта (документа, ведь проводятся только они)
- ММ - Модуль Менеджера объекта (документа)
- ОМ - ОбщийМодуль
- МНЗ - Модуль набора записей (регистра)
Большинство процедур из схемы в коде ERP содержат описания. Примеры реализаций можно подсматривать в типовом решении используя Глобальный поиск по именам процедур.
P.S. Заметки:
- ПередЗаписью() / ПриЗаписи() - в МодулеОбъекта документа, может быть какой-то код для заполнения структуры "ДополнительныеСвойства"
- Запись в "Независимые регистры" обрабатывается в событии ПриЗаписи() МодуляОбъекта (Документа)
- ПроведениеДокументов.УчетныеМеханизмыКонфигурации() - внутри метода добавить свойство структуры (см. типовой) если требуется связь со своим модулем учета. Используется в ММ ЗарегистрироватьУчетныеМеханизмы()
- ПередЗаписью() - в МодулеНабораЗаписей регистра с контролем ставится БлокироватьДляИзменения = Истина; - Если используется "Новая методика" контроля остатков. Если "Старая", то четкого места установки управляемой блокировок нет - ММ, ОМ и т.д. в зависимости от логики.
- После процедуры ПроведениеДокументов.ОбработкаПроведения() могут быть вызваны действия вне механизма проведения, например ВыполнитьКонтрольСвоимМетодом() или СвойОбщийМодульУчетногоМеханизма.ОбработкаПроведения(ЭтотОбъект, Отказ, РежимПроведения) ....как я понял такой подход является устаревшим или применим для модулей с постфиксом "Локализация"
- ПередЗаписью() - в МодулеНабораЗаписей регистра с контролем собираются данные движений регистратора по регистру расход(-), приход (+)
и помещаются в вт "ДвиженияИмяРегистраПередЗаписью".
ПриЗаписи() - собираются данные движений регистратора по регистру расход(+), приход (-) (с ОБРАТНЫМ ЗНАКОМ !!!), объединяются (ОБЪЕДИНИТЬ ВСЕ) с данными регистра до записи движений - ВТ "ДвиженияИмяРегистраПередЗаписью", группируются по измерениям (СГРУППИРОВАТЬ ПО) и помещаются в ВТ "ДвиженияИмяРегистраИзменения". Если ДвиженияИмяРегистраИзменения не пустая, то значит произошли изменения, в ту или иную сторону и их нужно обработать (дать Отказ транзакции, вывести сообщения и т.д.)
Составил для себя, как памятку, и надеюсь кому-то поможет, пригодится еще.