Почему пропадают изменения в подчиненном узле РИБ после обмена с главной базой?

Программист 1С v8.3 (Обычные формы) 1С:Комплексная автоматизация Управленческий учет
← На главную

Работа в распределенных информационных базах (РИБ) требует четкого понимания механизмов синхронизации данных. Часто возникает ситуация, когда пользователь в филиале (подчиненном узле) вносит правки в документ, а после очередного обмена данными эти правки бесследно исчезают. Кажется, что система работает некорректно или "откатывает" базу назад. Разберем подробно, почему так происходит, как работает механизм разрешения коллизий и что нужно сделать, чтобы данные не терялись. Для регулярного выполнения синхронизации по расписанию настраивается автоматический обмен данными между базами 1С.

Механизм разрешения коллизий: почему «Главный всегда прав»

Проанализируем стандартную логику платформы 1С при обмене данными. В РИБ заложен жесткий принцип: если один и тот же объект (документ, справочник, константа) был изменен одновременно в двух узлах, то при синхронизации приоритет отдается Главному узлу. Рассмотрим ситуацию на примере из практики:

  1. В 12:00 бухгалтер в подчиненном узле (дочке) открывает документ и правит поле НомерВходящегоДокумента.
  2. В 15:00 администратор или другой пользователь в головной базе перепроводит этот же документ (даже не меняя в нем данные, просто нажал «ОК»).
  3. При следующем обмене система видит, что объект изменен и там, и там.

Выясним причину, почему данные затираются. Платформа 1С не умеет «сливать» изменения по полям. Она не может взять номер из одной базы, а дату из другой. Система оперирует объектом целиком. Поскольку в головной базе изменение произошло (пусть даже техническое перепроведение), этот объект регистрируется к отправке. При получении сообщения в дочернем узле, версия из центрального узла полностью замещает локальную версию. В итоге правки бухгалтера от 12:00 просто уничтожаются «версией-победителем».

Влияние регистрации изменений и номеров сообщений

Разберем по шагам, как работает ПланОбмена. Многие ошибочно полагают, что номера сообщений (НомерПринятого и НомерОтправленного) отвечают за логику данных. Это не так. Номера сообщений — это лишь транспортный контроль, гарантирующий, что пакеты данных дошли и не были загружены повторно.

За то, какой объект поедет в обмене, отвечает Таблица регистрации изменений. Как только вы нажимаете кнопку записи в любом узле, ссылка на объект попадает в эту таблицу для конкретного узла. При смене каталога обмена или временной остановке обмена эти изменения накапливаются. Когда связь восстанавливается, происходит массовый накат накопленных данных, что и приводит к ощущению внезапной пропажи информации.

Как диагностировать проблему через Журнал регистрации

Если вы столкнулись с тем, что данные «пропали», первым делом проанализируем ЖурналРегистрации. Нам нужно отследить последовательность событий для конкретного документа:

  1. Откройте журнал в подчиненной базе и установите фильтр по ссылке на «пропавший» документ.
  2. Найдите событие Данные.Изменение от локального пользователя (например, в 12:00).
  3. Найдите следующее событие Данные.Изменение, где пользователем будет значиться учетная запись, под которой запускается обмен (или системный процесс обмена).
  4. Посмотрите время этого изменения. Если оно произошло позже локальной правки и в комментарии указано, что данные получены из главного узла — значит, объект был перезаписан «сверху».

Использование версионирования для защиты данных

В конфигурациях на базе платформы 8.2 (например, «Комплексная автоматизация 1.1») часто не включено стандартное ВерсионированиеОбъектов. Это большая ошибка для РИБ. Рассмотрим, как этот механизм помогает решить проблему:

Версионирование сохраняет «снимки» объекта при каждом его изменении. Если данные затерлись после обмена, вы сможете:

Рекомендуется включать версионирование хотя бы для самых критичных документов (заказы, поступления, реализации).

Программное решение: обработка коллизий

Если бизнес-логика требует, чтобы определенные поля в дочернем узле никогда не затирались данными из центра, мы можем вмешаться в процесс обмена программно. Разберем пример кода в модуле плана обмена. Нам понадобится обработчик ПриПолученииДанныхОтГлавного.

В этом обработчике можно прописать логику сравнения. Например, если в подчиненном узле заполнено поле Комментарий, а из центра пришло пустое, мы можем отменить замещение этого поля.


Процедура ПриПолученииДанныхОтГлавного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад)
    
    // Проверяем, является ли объект документом нужного типа
    Если ТипЗнч(ЭлементДанных) = Тип("ДокументОбъект.ПоступлениеТоваровУслуг") Тогда
        
        // Находим текущую версию объекта в этой базе
        ТекущийОбъект = ЭлементДанных.Ссылка.ПолучитьОбъект();
        
        Если ТекущийОбъект <> Неопределено Тогда
            // Если в локальной базе номер входящего документа заполнен, 
            // а из центра пришел пустой - оставляем локальный
            Если ЗначениеЗаполнено(ТекущийОбъект.НомерВходящегоДокумента) 
               И Не ЗначениеЗаполнено(ЭлементДанных.НомерВходящегоДокумента) Тогда
                
                ЭлементДанных.НомерВходящегоДокумента = ТекущийОбъект.НомерВходящегоДокумента;
                
            КонецЕсли;
        КонецЕсли;
        
    КонецЕсли;

КонецПроцедуры

Важно помнить: использование таких обработчиков замедляет обмен, так как системе приходится выполнять дополнительные запросы к базе для каждого объекта.

Практические рекомендации по предотвращению потерь

Чтобы избежать подобных ситуаций в будущем, проанализируем и внедрим следующие правила:

  1. Разделение ответственности: Старайтесь организовать работу так, чтобы одни и те же документы не редактировались в разных узлах одновременно. Например, филиал вводит первичку, а центр ее только просматривает или проводит по регламентированному учету спустя время.
  2. Регламент перепроведения: Запретите массовое перепроведение документов в главном узле за периоды, в которых еще активно работают подчиненные узлы. Каждое перепроведение — это автоматическая регистрация изменения, которая «полетит» во все филиалы и затрет там данные.
  3. Синхронизация времени: Убедитесь, что время на серверах главного и подчиненных узлов синхронизировано с точностью до секунды. Разница во времени может запутать механизмы определения «последнего изменения», хотя приоритет главного узла в РИБ все равно останется решающим.
  4. Контроль обмена: Регулярно проверяйте МониторОбменаДанными. Очередь регистрации не должна расти бесконечно. Чем быстрее изменения передаются между узлами, тем меньше вероятность возникновения коллизии (ситуации, когда два человека открыли один документ одновременно в разных базах).

Подводя итог, отметим: пропажа данных в 99% случаев — это не ошибка программы, а следствие работы стандартного алгоритма разрешения конфликтов 1С. Понимание этого алгоритма и использование инструментов версионирования позволит вам сохранить данные в целостности. Для выявления расхождений в проводках, возникших после переноса или синхронизации, применяется автоматическая сверка проводок между базами 1С.

← На главную