Дата последнего изменения: 27.07.2023
При работе в режиме документооборота создаётся два элемента инфоблока: один «конечный» с пустым WF_PARENT_ELEMENT_ID
(который мы видим в административной части), второй - «промежуточный» с WF_PARENT_ELEMENT_ID
равным ID только что созданного конечного элемента. «Промежуточный» превращается в «конечный» когда в рамках документооборота он достигнет финального статуса Опубликован. Либо любого другого статуса с поднятым флагом IS_FINAL
. Этот флаг нельзя выставить методами API Bitrix Framework, только правкой БД. Соответственно до этого момента записи в инфоблок заноситься будут, однако для стандартных методов API с параметрами по умолчанию они будут не доступны.
Основным отличием «промежуточных» элементов от «конечных» является поле WF_PARENT_ELEMENT_ID
, которое пусто для «конечных» и содержит идентификатор «конечного» элемента для промежуточных элементов. В случае создания нового элемента в документообороте (при условии, что начальный статус документооборота не является финальным) будет создан элемент, в поле WF_PARENT_ELEMENT_ID
будет записан его собственный идентификатор. При последующем переводе элемента в любой другой статус документооборота, в том числе и в финальный, в инфоблоке будут создаваться новые элементы с полем WF_PARENT_ELEMENT_ID
.
При переводе элемента в финальный статус элемент, с которого всё началось, будет обновлён так, что поле WF_PARENT_ELEMENT_ID
станет пустым, а поле WF_STATUS_ID
станет равным значению финального статуса (зачастую это 1). При последующем переводе элемента в какой-либо промежуточный статус круг повторится с той небольшой разницей, что в качестве отправной точки будет использоваться текущий опубликованный элемент.
По умолчанию API позволяет работать только с опубликованными элементами. Причём если перевести опубликованный элемент в какой-либо другой статус, то API будет возвращать именно ту версию элемента, которая соответствует опубликованной.
Чтобы получить список всех элементов (в том числе и не опубликованных) у метода CIBlockElement::GetList в свойствах фильтра необходимо задать параметр "SHOW_HISTORY" => "Y"
.
Кроме того, существует возможность: зная ID элемента получить его последнюю версию в документообороте с помощью функции CIBlockElement::WF_GetLast, и наоборот - зная последнюю версию элемента получить его оригинальный ID с помощью функции CIBlockElement::GetRealElement.
Отдельно стоит упомянуть обработчики событий, в том числе OnAfterIBlockElementUpdate. Так как в случае работы с документооборотом непосредственный Update происходит только в случае перевода элемента в финальный статус, не следует ожидать вызова обработчиков этого события при переводе элемента в «промежуточные» статусы. Вместо этого стоит добавить обработчик на событие OnAfterIBlockElementAdd и ориентироваться на поля "WF" = "Y"
(признак того, что элемент участвует в документообороте) и WF_PARENT_ELEMENT_ID
(идентификатор «конечного» элемента).
Выбрать всю историю изменений элемента можно с помощью функции CIBlockElement::WF_GetHistoryList. Для получения детальной информации о промежуточных элементах полученных с помощью этой функции рекомендуется использовать функции CIBlockElement::GetByID и CIBlockElement::GetProperty.