Как обеспечить уникальность кодов справочников в распределенной информационной базе (РИБ) и избежать дублей

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

Работа в распределенных информационных базах (РИБ) часто сопряжена с проблемой возникновения дублирующих кодов в справочниках. Особенно остро это ощущается при интеграции 1С с внешними системами, такими как WMS (системы управления складом), где код объекта часто является ключевым полем для синхронизации. Если в двух разных узлах РИБ одновременно создаются элементы с одинаковыми кодами, то при последующем обмене данными возникают конфликты, которые могут привести к остановке бизнес-процессов или некорректному учету остатков.

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

Применение уникальных префиксов для каждого узла

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

Рассмотрим подробнее механизм работы префиксов:

Стандартно в 1С:Управление торговлей 10.3 (и аналогичных конфигурациях на обычных формах) используется константа ПрефиксУзлаРаспределеннойИнформационнойБазы. Этот префикс добавляется в начало кода справочника при установке нового номера. Например, если в центральном узле префикс «ЦБ», а в филиале — «Ф1», то коды контрагентов будут выглядеть как «ЦБ00001» и «Ф100001» соответственно. При обмене эти коды не пересекутся.

Однако на практике префиксы часто «слетают» или игнорируются. Выясним причину этого поведения. Чаще всего это происходит из-за ручного редактирования кода пользователем. Если бухгалтер или менеджер вручную изменит код, удалив префикс, система автонумерации может сбиться и начать предлагать коды без учета префикса или на основе последнего введенного вручную значения. Чтобы этого избежать, проанализируем необходимость программного запрета на редактирование кодов или жесткую подписку на событие ПриУстановкеНовогоКода.


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

Централизованный контроль через Веб-сервисы

Если префиксации недостаточно (например, WMS-система требует строго числовых кодов без букв), мы можем реализовать механизм «онлайн-запроса» кода у центральной базы. Этот метод превращает один из узлов (обычно центральный) в мастер-систему для генерации идентификаторов.

Разберем по шагам, как организовать такую проверку:

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

Использование веб-сервиса гарантирует, что даже если два пользователя в разных концах страны нажмут кнопку «Записать» одновременно, центральная база выдаст им разные порядковые номера, так как запросы будут обработаны в очереди СУБД.

Реализация «Пула свободных номеров» для оффлайн-работы

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

Логика работы системы пулов:

  1. Центральная база распределяет между узлами диапазоны. Например, Узел №1 получает диапазон кодов от 100 000 до 199 999, Узел №2 — от 200 000 до 299 999.
  2. Филиал хранит информацию о своем диапазоне в регистре сведений или константе.
  3. При создании нового элемента код берется из локально выделенного диапазона.
  4. Когда свободные номера в диапазоне подходят к концу (осталось менее 10%), узел автоматически запрашивает новый пул у центральной базы при ближайшем сеансе связи.

Этот метод исключает дублирование кодов на 100% и при этом сохраняет автономность работы каждого узла РИБ.

Метод Мастер-Данных (MDM) и контроль по уникальным полям

Часто проблема дублей кодов является следствием дублирования самих данных (например, одного и того же контрагента завели дважды под разными именами). В этом случае никакая автонумерация не поможет WMS-системе сопоставить объекты.

Рассмотрим стратегию контроля уникальности по бизнес-ключам (ИНН, КПП, Наименование):

При попытке создания нового контрагента в периферийной базе, мы можем программно инициировать поиск по ИНН во всех доступных базах через веб-сервис. Если контрагент с таким ИНН уже существует в базе «Офис», система не даст создать новый объект, а предложит дождаться обмена или принудительно подтянет данные из центра. Это не только решает проблему уникальности кодов, но и поддерживает чистоту нормативно-справочной информации (НСИ).

Технический нюанс: GUID против Кода

Проанализируем техническую сторону интеграции с WMS. Если ваша складская система позволяет, лучше полностью отказаться от использования Код в качестве ключа синхронизации и перейти на УникальныйИдентификатор (GUID). В 1С GUID объекта генерируется на основе MAC-адреса и системного времени, что математически исключает появление двух одинаковых идентификаторов в разных базах. Даже если в двух узлах создадут «Иванова», их GUID-ы будут абсолютно разными, и в центральной базе они благополучно объединятся или будут сосуществовать как два разных объекта без конфликта первичных ключей.

Если же WMS требует именно короткий Код, выполним следующие рекомендации:

  1. Увеличьте разрядность кода: Если длина кода 5 знаков, префикс «ФИЛИАЛ1» туда просто не поместится. Установите длину кода 11 или 15 символов.
  2. Используйте составные префиксы: В современных системах удобно использовать схему [ПрефиксБазы][ПрефиксОрганизации][Номер].
  3. Регламентные проверки: Настройте в центральной базе фоновое задание, которое раз в сутки проверяет справочники на предмет дублей кодов и отправляет отчет администратору. Помните, что в РИБ «вылечить» дубль проще всего в центральном узле, программно переприсвоив код и разослав изменения обратно по узлам.

Подводя итог, можно сказать, что выбор решения зависит от критичности связи. Если интернет стабилен — используйте веб-сервисы для получения кодов в реальном времени. Если важна автономность — внедряйте систему префиксов или выделенных диапазонов (пулов). Это позволит вам забыть о проблемах синхронизации с внешними системами и обеспечит надежную работу распределенной сети.

← На главную