210  /  382
Справочник

Инфоблоки в Документообороте

Просмотров: 28290
Дата последнего изменения: 27.07.2023
Роберт Басыров
Сложность урока:
2 уровень - несложные понятия и действия, но не расслабляйтесь.
1
2
3
4
5
Недоступно в лицензиях:
Ограничений нет

При работе в режиме документооборота создаётся два элемента инфоблока: один «конечный» с пустым 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.

21
Курсы разработаны в компании «1С-Битрикс»

Если вы нашли неточность в тексте, непонятное объяснение, пожалуйста, сообщите нам об этом в комментариях.
Развернуть комментарии