При организации распределенного учета между головной компанией и филиалами нередко возникает коллизия: филиал-получатель регистрирует поступившую технику самостоятельно, создавая новый элемент справочника. В результате после завершения обмена в головной базе образуются две одинаковые физические единицы с разными внутренними идентификаторами (GUID). Рассмотрим причины возникновения этой проблемы и разберем проверенные архитектурные и программные методы ее решения.
В стандартном механизме распределенных информационных баз (РИБ) синхронизация объектов ссылочного типа осуществляется строго по внутреннему уникальному идентификатору УникальныйИдентификатор. Платформа 1С при получении пакета обмена не проводит сопоставление по реквизитам (заводской номер, наименование, артикул). Если филиал №1 и филиал №2 независимо друг от друга ввели элемент с одинаковым заводским номером, для платформы это два абсолютно разных объекта.
Автоматического «слияния» на уровне ядра СУБД в РИБ не предусмотрено. Попытка решать задачу постфактум приводит к усложнению логики и необходимости постоянного ручного или программного поиска дублей. Поэтому правильное решение лежит в плоскости проектирования архитектуры учета и обмена.
Самый надежный подход в распределенных структурах — запрет создания ключевой справочной информации в периферийных узлах. Рассмотрим, как это организуется:
ПередЗаписью или проверку прав доступа.Посмотрим на пример кода подписки на событие перед записью элемента справочника в периферийной базе:
Процедура ЗапретСозданияНСИВПериферииПередЗаписью(Источник, Отказ) Экспорт
// Проверяем, является ли текущий узел подчиненным
Если ЗначениеЗаполнено(ПланыОбмена.ГлавныйУзел()) И Источник.ЭтоНовый() Тогда
// Запрещаем интерактивное создание новых элементов в филиале
ВызватьИсключение "Создание новых позиций техники разрешено только в центральной базе!";
КонецЕсли;
КонецПроцедуры
В этом сценарии головная организация при создании распоряжения на перемещение сразу указывает конкретную единицу учета. После выполнения регламентного обмена карточка техники уже существует в базе филиала-получателя, что полностью исключает дублирование.
Если филиалу-получателю необходимо принимать технику, которой ранее не было в его узле, применим схему с документами «Авизо исходящее» и «Авизо входящее»:
Часто ошибкой является попытка хранить каждую единицу техники как отдельный элемент справочника Номенклатура. Разберем правильную модель учета:
Номенклатура ведется обобщенная позиция (например, «Трактор К-700»), которая заводится один раз в центре и присутствует во всех филиалах.СерииНоменклатуры или ОсновныеСредства.Если специфика бизнеса требует автономного ввода данных в узлах, стандартный РИБ заменяют на обмен по правилам конвертации данных (КД 2.0 / КД 3.0 / EnterpriseData). В этом случае сопоставление объектов выполняется не по GUID, а по полям поиска:
ВидТехники и ЗаводскойНомер (или VIN).Если коллизия уже произошла, и в центральной базе зафиксированы два элемента с разными GUID, выполним объединение дублирующихся ссылок средствами подсистемы БСП «Поиск и удаление дублей» или программным методом замены ссылок.
Рассмотрим пример программной замены ссылок:
Процедура ЗаменитьДубльТехники(СсылкаДубль, СсылкаЭталон) Экспорт
ТаблицаЗамены = Новый ТаблицаЗначений;
ТаблицаЗамены.Колонки.Добавить("Ссылка", Новый ОписаниеТипов("СправочникСсылка.Техника"));
ТаблицаЗамены.Колонки.Добавить("СсылкаЭталон", Новый ОписаниеТипов("СправочникСсылка.Техника"));
СтрокаЗамены = ТаблицаЗамены.Добавить();
СтрокаЗамены.Ссылка = СсылкаДубль;
СтрокаЗамены.СсылкаЭталон = СсылкаЭталон;
// Используем типовой механизм БСП для замены ссылок во всех документах и регистрах
ПараметрыЗамены = ПодсистемыБСП.ПоискИУдалениеДублей.ПараметрыЗаменыСсылок();
ПодсистемыБСП.ПоискИУдалениеДублей.ЗаменитьСсылки(ТаблицаЗамены, ПараметрыЗамены);
// Помечаем дубликат на удаление
ОбъектДубль = СсылкаДубль.ПолучитьОбъект();
ОбъектДубль.УстановитьПометкуУдаления(Истина);
КонецПроцедуры
После выполнения процедуры замены и проведения документов изменения регистрируются к выгрузке в планы обмена и транслируются в филиалы, исправляя некорректные ссылки во всей распределенной сети.
Если филиалу обязательно нужно создавать карточки техники на месте, разберем интеграцию через онлайн-сервисы:
УникальныйИдентификатор. Если нет — сервис регистрирует объект в центре и возвращает новый идентификатор.
// Создание объекта в филиале с идентификатором центральной базы
ИдентификаторИзЦентра = Новый УникальныйИдентификатор(СтрокаGUIDИзЦентра);
НоваяСсылка = Справочники.Техника.ПолучитьСсылку(ИдентификаторИзЦентра);
НовыйОбъект = Справочники.Техника.СоздатьЭлемент();
НовыйОбъект.УстановитьСсылкуНового(НоваяСсылка);
НовыйОбъект.Наименование = "Трактор К-700";
НовыйОбъект.ЗаводскойНомер = "888";
НовыйОбъект.Записать();
Такой подход гарантирует консистентность ссылочной целостности во всех узлах еще до момента начала регулярного обмена сообщениями РИБ.