Skip to content

Consistency-группы: ветка serialized_value_match не срабатывает с комплектным bitrix.yaml и портит ENTITY_SETTINGS #2

Description

@warenikov

Проблема

Ветка обработки сериализованных полей в 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_IDOWNER_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_columnentity_id_column при выборке целевых строк;
  • покрыть сценарий интеграционным тестом с фикстурой из комплектного bitrix.yaml — сейчас юнит-тесты этот рассинхрон не ловят.

Версия: текущий master (f901f97).

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions