Проблема
Ветка обработки сериализованных полей в consistency-группах никогда не срабатывает с комплектным bitrix.yaml, а вместо неё выполняется обычный UPDATE, который перетирает ENTITY_SETTINGS в b_crm_act_comm голой строкой (фейковым телефоном/email), причём в строках с чужим ID.
Причина — рассинхрон кода и конфига
1. Условие выбора ветки не совпадает со структурой конфига.
Код (src/Consistency/ConsistencyProcessor.php:181):
if (isset($join['serialized_value_match'])) {
$this->updateSerializedField(...);
} else {
$this->updatePlainField(...);
}
А в bitrix.yaml признак лежит в ключе type:
join:
type: "serialized_value_match"
entity_id_column: "OWNER_ID"
ref_entity_column: "ENTITY_ID"
isset($join['serialized_value_match']) всегда false → выполнение всегда уходит в updatePlainField().
2. В updatePlainField() такой target попадает в fallback-ветку (key_column/ref_column в join отсутствуют) и выполняется:
UPDATE b_crm_act_comm SET ENTITY_SETTINGS = '<фейковый телефон>' WHERE ID = <ID строки из b_crm_field_multi>
То есть сериализованное поле перезаписывается обычной строкой, и матчинг идёт по b_crm_act_comm.ID = ID анкорной строки из другой таблицы — данные портятся в несвязанных строках.
3. Даже если поправить условие, ветка сериализации всё равно не заработает:
updateSerializedField() читает настройки из $join['serialization'] (ConsistencyProcessor.php:250), а в YAML serialization — сиблинг join, а не вложенный ключ;
getSerializedField() берёт $join['key_column'] ?? 'ID' и ищет WHERE ID = $anchorRow['ID'] — снова ID из b_crm_field_multi вместо связи ENTITY_ID → OWNER_ID;
- ключ
ref_entity_column из конфига в коде вообще нигде не читается;
updateSerializedInTable() берёт $anchorRow['OWNER_ID'], но в анкорной выборке (context_columns) такой колонки нет → null → молчаливый return.
Ожидаемое поведение
Для target с type: serialized_value_match инструмент должен: найти строки b_crm_act_comm по связи ENTITY_ID (anchor) → OWNER_ID (target) с учётом filters, распарсить ENTITY_SETTINGS, заменить значение по match_key/match_value_source и сохранить сериализованную структуру обратно.
Предложение
- выбирать ветку по
($join['type'] ?? null) === 'serialized_value_match';
- читать
serialization с уровня target (или задокументировать вложение в join и поправить bitrix.yaml);
- реализовать связь
ref_entity_column → entity_id_column при выборке целевых строк;
- покрыть сценарий интеграционным тестом с фикстурой из комплектного
bitrix.yaml — сейчас юнит-тесты этот рассинхрон не ловят.
Версия: текущий master (f901f97).
Проблема
Ветка обработки сериализованных полей в consistency-группах никогда не срабатывает с комплектным
bitrix.yaml, а вместо неё выполняется обычныйUPDATE, который перетираетENTITY_SETTINGSвb_crm_act_commголой строкой (фейковым телефоном/email), причём в строках с чужимID.Причина — рассинхрон кода и конфига
1. Условие выбора ветки не совпадает со структурой конфига.
Код (
src/Consistency/ConsistencyProcessor.php:181):А в
bitrix.yamlпризнак лежит в ключеtype:isset($join['serialized_value_match'])всегдаfalse→ выполнение всегда уходит вupdatePlainField().2. В
updatePlainField()такой target попадает в fallback-ветку (key_column/ref_columnв join отсутствуют) и выполняется:То есть сериализованное поле перезаписывается обычной строкой, и матчинг идёт по
b_crm_act_comm.ID= ID анкорной строки из другой таблицы — данные портятся в несвязанных строках.3. Даже если поправить условие, ветка сериализации всё равно не заработает:
updateSerializedField()читает настройки из$join['serialization'](ConsistencyProcessor.php:250), а в YAMLserialization— сиблингjoin, а не вложенный ключ;getSerializedField()берёт$join['key_column'] ?? 'ID'и ищетWHERE ID = $anchorRow['ID']— снова ID изb_crm_field_multiвместо связиENTITY_ID→OWNER_ID;ref_entity_columnиз конфига в коде вообще нигде не читается;updateSerializedInTable()берёт$anchorRow['OWNER_ID'], но в анкорной выборке (context_columns) такой колонки нет →null→ молчаливыйreturn.Ожидаемое поведение
Для target с
type: serialized_value_matchинструмент должен: найти строкиb_crm_act_commпо связиENTITY_ID(anchor) →OWNER_ID(target) с учётомfilters, распарситьENTITY_SETTINGS, заменить значение поmatch_key/match_value_sourceи сохранить сериализованную структуру обратно.Предложение
($join['type'] ?? null) === 'serialized_value_match';serializationс уровня target (или задокументировать вложение вjoinи поправитьbitrix.yaml);ref_entity_column→entity_id_columnпри выборке целевых строк;bitrix.yaml— сейчас юнит-тесты этот рассинхрон не ловят.Версия: текущий
master(f901f97).