При работе в режиме докуметооборота элемент инфоблока (в смысле полноценной единицы, доступной через стандартные методы API - например CIBlockElement::GetByID) не создаётся до тех пор, пока в рамках докуметооборота он не достигнет финального статуса "Опубликован", либо любого другого статуса с поднятым флагом IS_FINAL (этот флаг нельзя выставить через админку Битрикса, только правкой БД).
Естественно, что до этого момента записи в инфоблок заноситься будут, однако для стандартных методов 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" (идентификатор "конечного" элемента).
На последок замечу, что выше сказанное получено дедуктивным путём и может быть не совсем верно
Естественно, что до этого момента записи в инфоблок заноситься будут, однако для стандартных методов 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" (идентификатор "конечного" элемента).
На последок замечу, что выше сказанное получено дедуктивным путём и может быть не совсем верно