Почему не работает контроль уникальности номеров в распределенной базе данных (РИБ)?

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

При работе с распределенными информационными базами разработчики часто сталкиваются с ситуацией, когда документы с одинаковыми номерами успешно проходят обмен и дублируются в центральном узле. Разберемся, почему стандартный «Контроль уникальности» в конфигураторе не справляется с этой задачей и как правильно настроить нумерацию в РИБ.

Понимание проблемы: почему не работает контроль?

Во-первых, важно осознать, что флаг Контроль уникальности в конфигураторе предназначен для интерактивной работы пользователей. Когда происходит обмен данными между узлами РИБ, система устанавливает параметр ОбменДанными.Загрузка = Истина. Этот флаг является системным сигналом для платформы: он отключает проверки заполнения, вызов подписок на события и, самое главное, контроль уникальности номеров. Это необходимо для того, чтобы данные, успешно созданные в одном узле, могли без ошибок «встать» в другом.

Во-вторых, в распределенных системах нумерация должна быть уникальной на уровне всей сети, а не только в рамках одного узла. Если вы пытаетесь создать документ с номером «ХХ-0001» и в центральном, и в подчиненном узле, платформа не выдаст ошибку, так как каждый узел считает свой номер легитимным.

Решение: использование префикса информационной базы

Единственным надежным способом обеспечения уникальности в РИБ является обязательное использование префикса узла. Префикс должен добавляться к номеру документа в момент его записи. Таким образом, даже если номер внутри выглядит как «00001», после добавления префикса документы будут иметь виды «ЦБ00001» и «ПБ00001», что исключает любые конфликты.

Для реализации этой логики выполним следующие шаги:

  1. Создайте константу (например, ПрефиксБазы), в которой будет храниться уникальный идентификатор текущего узла.
  2. Используйте обработчик события ПриУстановкеНовогоНомера в модуле объекта документа.

Реализация логики в модуле объекта

Рассмотрим пример кода, который позволит автоматически добавлять префикс при создании документа:


Процедура ПриУстановкеНовогоНомера(СтандартнаяОбработка, Префикс)
    // Получаем префикс из константы
    Префикс = СокрЛП(Константы.ПрефиксБазы.Получить());
КонецПроцедуры

При таком подходе при создании нового документа система будет автоматически подставлять префикс узла в номер. В результате, при выгрузке данных в центральный узел, номера будут уже различаться, и дублирования не произойдет.

Работа с подписками на события

Если ваша конфигурация самописная, важно убедиться, что для документов реализованы проверки при попытке изменения номера вручную. В типовых конфигурациях за это отвечают подписки на события, например, ПроверитьНомерДокументаПоДатеИОрганизации. Если вы видите, что в вашей системе при редактировании дублирующихся номеров не выдается ошибка, вам необходимо:

  1. Создать аналогичную подписку на событие ПередЗаписью для ваших документов.
  2. В обработчике этой подписки реализовать проверку наличия документа с таким же номером в базе данных.
  3. Учитывать флаг ОбменДанными.Загрузка, чтобы проверка не срабатывала при автоматическом обмене.

Процедура ПередЗаписьюДокумента(Источник, Отказ, РежимЗаписи, РежимПроведения)
    Если Источник.ОбменДанными.Загрузка Тогда
        Возврат;
    КонецЕсли;

    // Здесь реализуем логику проверки уникальности запросом к базе
    // Если запрос нашел дубликат, вызываем:
    // ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Номер не уникален!");
    // Отказ = Истина;
КонецПроцедуры

Подведем итоги

Для корректной работы нумерации в распределенной базе данных следуйте этим рекомендациям:

1. Не пытайтесь бороться с флагом ОбменДанными.Загрузка = Истина. Это стандартный механизм платформы 1С, предназначенный для корректной передачи данных. Попытки его принудительного отключения приведут к невозможности проведения обменов.

2. Внедрите систему префиксации. Каждый узел РИБ обязан иметь уникальный префикс, который автоматически подставляется в номер любого документа.

3. Добавьте проверку в модуле объекта. Используйте событие ПередЗаписью для контроля того, чтобы пользователи вручную не вводили номера, нарушающие логику системы.

Такой комплексный подход позволит вам полностью исключить проблему дублирования номеров в распределенной информационной базе.

← На главную