Работа в распределенных информационных базах (РИБ) часто сопряжена с проблемой возникновения дублирующих кодов в справочниках. Особенно остро это ощущается при интеграции 1С с внешними системами, такими как WMS (системы управления складом), где код объекта часто является ключевым полем для синхронизации. Если в двух разных узлах РИБ одновременно создаются элементы с одинаковыми кодами, то при последующем обмене данными возникают конфликты, которые могут привести к остановке бизнес-процессов или некорректному учету остатков.
В рамках данной статьи мы подробно разберем, почему стандартные механизмы иногда дают сбой, и проанализируем несколько уровней защиты от дублирования — от базовых настроек платформы до продвинутых архитектурных решений.
Первое и самое очевидное решение, которое мы должны рассмотреть, — это использование префиксов. В системе 1С предусмотрен стандартный механизм префиксации кодов и номеров документов. Для каждого узла распределенной базы должен быть задан свой уникальный префикс.
Рассмотрим подробнее механизм работы префиксов:
Стандартно в 1С:Управление торговлей 10.3 (и аналогичных конфигурациях на обычных формах) используется константа ПрефиксУзлаРаспределеннойИнформационнойБазы. Этот префикс добавляется в начало кода справочника при установке нового номера. Например, если в центральном узле префикс «ЦБ», а в филиале — «Ф1», то коды контрагентов будут выглядеть как «ЦБ00001» и «Ф100001» соответственно. При обмене эти коды не пересекутся.
Однако на практике префиксы часто «слетают» или игнорируются. Выясним причину этого поведения. Чаще всего это происходит из-за ручного редактирования кода пользователем. Если бухгалтер или менеджер вручную изменит код, удалив префикс, система автонумерации может сбиться и начать предлагать коды без учета префикса или на основе последнего введенного вручную значения. Чтобы этого избежать, проанализируем необходимость программного запрета на редактирование кодов или жесткую подписку на событие ПриУстановкеНовогоКода.
Процедура ПриУстановкеНовогоКода(Источник, СтандартнаяОбработка, Префикс)
// Получаем префикс текущего узла из константы
ПрефиксУзла = Константы.ПрефиксУзлаРаспределеннойИнформационнойБазы.Получить();
// Добавляем префикс организации, если требуется
Префикс = ПрефиксУзла + Префикс;
КонецПроцедуры
Если префиксации недостаточно (например, WMS-система требует строго числовых кодов без букв), мы можем реализовать механизм «онлайн-запроса» кода у центральной базы. Этот метод превращает один из узлов (обычно центральный) в мастер-систему для генерации идентификаторов.
Разберем по шагам, как организовать такую проверку:
ПолучитьСледующийКод(ИмяСправочника). Этот метод будет находить максимальный код в базе, увеличивать его на единицу и возвращать клиенту.Контрагенты), в событии ПередЗаписью, добавим проверку: если объект новый, программа должна постучаться по HTTP или SOAP в центральную базу и получить актуальный код.Использование веб-сервиса гарантирует, что даже если два пользователя в разных концах страны нажмут кнопку «Записать» одновременно, центральная база выдаст им разные порядковые номера, так как запросы будут обработаны в очереди СУБД.
Посмотрим на ситуацию, когда постоянное соединение с центральной базой невозможно. В этом случае использование веб-сервиса в чистом виде заблокирует работу магазина при обрыве связи. Решением является использование «пулов» или диапазонов кодов.
Логика работы системы пулов:
Этот метод исключает дублирование кодов на 100% и при этом сохраняет автономность работы каждого узла РИБ.
Часто проблема дублей кодов является следствием дублирования самих данных (например, одного и того же контрагента завели дважды под разными именами). В этом случае никакая автонумерация не поможет WMS-системе сопоставить объекты.
Рассмотрим стратегию контроля уникальности по бизнес-ключам (ИНН, КПП, Наименование):
При попытке создания нового контрагента в периферийной базе, мы можем программно инициировать поиск по ИНН во всех доступных базах через веб-сервис. Если контрагент с таким ИНН уже существует в базе «Офис», система не даст создать новый объект, а предложит дождаться обмена или принудительно подтянет данные из центра. Это не только решает проблему уникальности кодов, но и поддерживает чистоту нормативно-справочной информации (НСИ).
Проанализируем техническую сторону интеграции с WMS. Если ваша складская система позволяет, лучше полностью отказаться от использования Код в качестве ключа синхронизации и перейти на УникальныйИдентификатор (GUID). В 1С GUID объекта генерируется на основе MAC-адреса и системного времени, что математически исключает появление двух одинаковых идентификаторов в разных базах. Даже если в двух узлах создадут «Иванова», их GUID-ы будут абсолютно разными, и в центральной базе они благополучно объединятся или будут сосуществовать как два разных объекта без конфликта первичных ключей.
Если же WMS требует именно короткий Код, выполним следующие рекомендации:
[ПрефиксБазы][ПрефиксОрганизации][Номер].Подводя итог, можно сказать, что выбор решения зависит от критичности связи. Если интернет стабилен — используйте веб-сервисы для получения кодов в реальном времени. Если важна автономность — внедряйте систему префиксов или выделенных диапазонов (пулов). Это позволит вам забыть о проблемах синхронизации с внешними системами и обеспечит надежную работу распределенной сети.