При работе с распределенными информационными базами разработчики часто сталкиваются с ситуацией, когда документы с одинаковыми номерами успешно проходят обмен и дублируются в центральном узле. Разберемся, почему стандартный «Контроль уникальности» в конфигураторе не справляется с этой задачей и как правильно настроить нумерацию в РИБ.
Во-первых, важно осознать, что флаг Контроль уникальности в конфигураторе предназначен для интерактивной работы пользователей. Когда происходит обмен данными между узлами РИБ, система устанавливает параметр ОбменДанными.Загрузка = Истина. Этот флаг является системным сигналом для платформы: он отключает проверки заполнения, вызов подписок на события и, самое главное, контроль уникальности номеров. Это необходимо для того, чтобы данные, успешно созданные в одном узле, могли без ошибок «встать» в другом.
Во-вторых, в распределенных системах нумерация должна быть уникальной на уровне всей сети, а не только в рамках одного узла. Если вы пытаетесь создать документ с номером «ХХ-0001» и в центральном, и в подчиненном узле, платформа не выдаст ошибку, так как каждый узел считает свой номер легитимным.
Единственным надежным способом обеспечения уникальности в РИБ является обязательное использование префикса узла. Префикс должен добавляться к номеру документа в момент его записи. Таким образом, даже если номер внутри выглядит как «00001», после добавления префикса документы будут иметь виды «ЦБ00001» и «ПБ00001», что исключает любые конфликты.
Для реализации этой логики выполним следующие шаги:
ПрефиксБазы), в которой будет храниться уникальный идентификатор текущего узла.ПриУстановкеНовогоНомера в модуле объекта документа.Рассмотрим пример кода, который позволит автоматически добавлять префикс при создании документа:
Процедура ПриУстановкеНовогоНомера(СтандартнаяОбработка, Префикс)
// Получаем префикс из константы
Префикс = СокрЛП(Константы.ПрефиксБазы.Получить());
КонецПроцедуры
При таком подходе при создании нового документа система будет автоматически подставлять префикс узла в номер. В результате, при выгрузке данных в центральный узел, номера будут уже различаться, и дублирования не произойдет.
Если ваша конфигурация самописная, важно убедиться, что для документов реализованы проверки при попытке изменения номера вручную. В типовых конфигурациях за это отвечают подписки на события, например, ПроверитьНомерДокументаПоДатеИОрганизации. Если вы видите, что в вашей системе при редактировании дублирующихся номеров не выдается ошибка, вам необходимо:
ПередЗаписью для ваших документов.ОбменДанными.Загрузка, чтобы проверка не срабатывала при автоматическом обмене.
Процедура ПередЗаписьюДокумента(Источник, Отказ, РежимЗаписи, РежимПроведения)
Если Источник.ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
// Здесь реализуем логику проверки уникальности запросом к базе
// Если запрос нашел дубликат, вызываем:
// ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Номер не уникален!");
// Отказ = Истина;
КонецПроцедуры
Для корректной работы нумерации в распределенной базе данных следуйте этим рекомендациям:
1. Не пытайтесь бороться с флагом ОбменДанными.Загрузка = Истина. Это стандартный механизм платформы 1С, предназначенный для корректной передачи данных. Попытки его принудительного отключения приведут к невозможности проведения обменов.
2. Внедрите систему префиксации. Каждый узел РИБ обязан иметь уникальный префикс, который автоматически подставляется в номер любого документа.
3. Добавьте проверку в модуле объекта. Используйте событие ПередЗаписью для контроля того, чтобы пользователи вручную не вводили номера, нарушающие логику системы.
Такой комплексный подход позволит вам полностью исключить проблему дублирования номеров в распределенной информационной базе.