Гайд 1С: Разрешение коллизий и кодов коллизий при двустороннем обмене данными
При активном параллельном редактировании одних и тех же объектов в разных узлах возникают коллизии:
- Перезапись актуальных данных старыми значениями при загрузке ответного сообщения обмена («эффект затирания»).
- Циклический обмен одними и теми же измененными объектами между узлами (бесконечный пинг-понг изменений).
- Отказ проведения связанных документов из-за неконсистентного состояния реквизитов шапки или табличной части.
- Накопление неразрешенных конфликтов в подсистеме версионирования БСП.
1. Классификация стратегий разрешения коллизий
В архитектуре распределенного обмена 1С применяются три основные стратегии:
- Приоритет главного узла (Master-Slave): изменения из главного узла всегда побеждают изменения периферийного узла.
- Приоритет по времени (Last-Write-Wins): объект перезаписывается только в том случае, если дата модификации в сообщении позже локальной даты версии.
- Ручное разрешение коллизий (БСП): при обнаружении одновременного редактирования создается запись в регистре сведений
КонфликтыПриОбменеДаннымидля разбора администратором.
2. Программная обработка коллизий в коде загрузки
// Обработчик события 'ПриПолученииДанныхОтПодчиненного' в плане обмена
Процедура ПриПолученииДанныхОтПодчиненного(ЭлементДанных, ПолучениеЭлемента, ОтправкаЭлемента)
Если ТипЗнч(ЭлементДанных) = Тип("СправочникОбъект.Номенклатура") Тогда
ЛокальныйОбъект = ЭлементДанных.Ссылка.ПолучитьОбъект();
Если ЛокальныйОбъект <> Неопределено Тогда
Если ЛокальныйОбъект.ДатаМодификации > ЭлементДанных.ДатаМодификации Тогда
// Локальная версия новее - отклоняем изменение из пакета
ПолучениеЭлемента = ПолучениеЭлементаДанных.Игнорировать;
// Принудительно регистрируем наш объект для отправки обратно в узел
ПланыОбмена.ЗарегистрироватьИзменения(Узел, ЛокальныйОбъект.Ссылка);
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры Частые вопросы (FAQ)
Что такое 'пинг-понг изменений' в планах обмена 1С?
Это ситуация, когда узел А регистрирует изменение объекта и отправляет в узел Б, а узел Б при загрузке перезаписывает объект и ошибочно регистрирует его на отправку обратно в узел А, зацикливая трафик.
Как отключить автоматическую регистрацию изменений при загрузке пакета?
Используйте конструкцию: ПланыОбмена.ВыбратьИзменения() с проверкой контекста загрузки или метод ОбменДанными.Загрузка = Истина перед вызовом Записать().
Где в Библиотеке Стандартных Подсистем (БСП) настраиваются правила коллизий?
В настройках конкретного узла обмена через форму 'Правила разрешения коллизий' (раздел Администрирование -> Синхронизация данных).
Как версионирование объектов помогает при анализе коллизий?
Подсистема версионирования сохраняет снимок объекта до и после загрузки пакета обмена, позволяя визуально в отчете сравнить, какие именно реквизиты были изменены каждым узлом.