Как правильно настроить синхронизацию номенклатуры между базами 1С и избежать коллизий идентификаторов?

Программист 1С v8.3 (Обычные формы) 1C:Бухгалтерия IT и автоматизация бизнеса
← На главную

При организации одностороннего обмена номенклатурой между типовой «1С:Бухгалтерия предприятия» и отраслевым решением (например, «Альфа-Авто») часто возникает задача: переносить новые позиции номенклатуры так, чтобы ни при каких условиях не перезаписать и не повредить существующие в базе-приемнике элементы. Поиск по наименованию или артикулу в таких случаях не всегда подходит из-за различий в правилах ведения справочников в разных отделах, а прямая синхронизация по внутреннему идентификатору вызывает опасения возможного случайного совпадения GUID.

Разберем детально, какова реальная вероятность коллизии уникальных идентификаторов платформы 1С, как проверить существующие данные и какие архитектурные подходы позволяют организовать безопасную загрузку.

Оценка вероятности совпадения уникальных идентификаторов (GUID)

Платформа «1С:Предприятие» использует стандарт формирования 128-битных идентификаторов (UUID v4 и последовательные алгоритмы на базе стандартов RFC). Математическая вероятность случайной генерации двух одинаковых идентификаторов в двух независимых информационных базах стремится к абсолютному нулю.

Проанализируем практические причины, по которым GUID в базах все же могут совпасть:

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

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

Разовая проверка баз на пересечение идентификаторов

Чтобы окончательно исключить сомнения, выполним предварительную проверку наличия одинаковых системных ссылок в обеих базах. Рассмотрим программный способ выгрузки и сверки идентификаторов через COM-соединение или текстовый файл.

Посмотрим на пример выгрузки списка идентификаторов из базы-источника:


СписокИдентификаторов = Новый Массив;
Выборка = Справочники.Номенклатура.Выбрать();

Пока Выборка.Следующий() Цикл
    Если Не Выборка.ЭтоГруппа Тогда
        ГУИДСтрокой = Строка(Выборка.Ссылка.УникальныйИдентификатор());
        СписокИдентификаторов.Добавить(ГУИДСтрокой);
    КонецЕсли;
КонецЦикла;

В базе-приемнике проанализируем наличие объектов с полученными идентификаторами:


Для Каждого СтрГУИД Из СписокИдентификаторов Цикл
    ТекущийГУИД = Новый УникальныйИдентификатор(СтрГУИД);
    СсылкаПриемника = Справочники.Номенклатура.ПолучитьСсылку(ТекущийГУИД);
    
    // Проверяем физическое наличие объекта в базе
    ОбъектВБазе = СсылкаПриемника.ПолучитьОбъект();
    Если ОбъектВБазе <> Неопределено Тогда
        Сообщить("Найдено совпадение идентификатора: " + СтрГУИД + " - " + Строка(ОбъектВБазе));
    КонецЕсли;
КонецЦикла;

Способ 1. Использование регистра соответствий в базе-приемнике

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

Разберем по шагам создание независимого контура соответствий:

  1. В конфигурации «Альфа-Авто» создаем регистр сведений СоответствияНоменклатурыБП со следующей структурой:
    • Измерение: ИдентификаторИсточника (Тип: Строка, длина 36);
    • Ресурс: Номенклатура (Тип: СправочникСсылка.Номенклатура).
  2. При выгрузке из бухгалтерии передаем только строковый GUID элемента.
  3. При загрузке в «Альфа-Авто» выполняем поиск по регистру сведений. Если запись найдена — товар уже был загружен ранее. Если не найдена — создаем новый элемент с собственным GUID базы-приемника и записываем пару в регистр.

Посмотрим на пример алгоритма загрузки:


МенеджерЗаписи = РегистрыСведений.СоответствияНоменклатурыБП.СоздатьМенеджерЗаписи();
МенеджерЗаписи.ИдентификаторИсточника = ИдентификаторБП;
МенеджерЗаписи.Прочитать();

Если Не МенеджерЗаписи.Выбран() Тогда
    // Создаем новую номенклатуру в Альфа-Авто
    НовыйТовар = Справочники.Номенклатура.СоздатьЭлемент();
    НовыйТовар.Наименование = ЗагружаемоеНаименование;
    НовыйТовар.Артикул = ЗагружаемыйАртикул;
    НовыйТовар.Записать();
    
    // Фиксируем соответствие
    МенеджерЗаписи.ИдентификаторИсточника = ИдентификаторБП;
    МенеджерЗаписи.Номенклатура = НовыйТовар.Ссылка;
    МенеджерЗаписи.Записать();
КонецЕсли;

Способ 2. Настройка правил в «1С:Конвертация данных 2.1»

Если обмен настраивается с помощью типового механизма правил конвертации, используем встроенные возможности предотвращения перезаписи существующих данных.

Рассмотрим ключевые настройки в обработчиках событий:

  1. В настройках Правила Конвертации Объектов (ПКО) для номенклатуры устанавливаем признак «Не замещать существующие объекты». Если при сопоставлении по GUID объект найден в приемнике, платформа пропустит изменение его реквизитов.
  2. В обработчике ПоляПоиска при необходимости переопределяем стандартный поиск:
    
    // Отключаем стандартный поиск по внутреннему идентификатору, если найден признак
    Если СвойстваПоиска.Свойство("ИдентификаторБП") Тогда
        // Выполняем поиск по дополнительному реквизиту или регистру
        ПрекратитьПоиск = Истина;
    КонецЕсли;
    
  3. В обработчике ПередЗаписьюОбъекта дополнительно страхуем существующие данные:
    
    Если Не Объект.ЭтоНовый() Тогда
        // Запрещаем перезапись существующих данных
        Отказ = Истина;
    КонецЕсли;
    

Специфика заполнения справочника «Номенклатура» в «Альфа-Авто»

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

  1. Подчиненные единицы измерения. В «Альфа-Авто» для номенклатуры обязательно должны быть созданы и привязаны элементы подчиненного справочника ЕдиницыИзмерения (как минимум базовая единица и единица хранения остатков).
  2. Специфика автобизнеса. При программной записи необходимо корректно заполнять вид номенклатуры (товар, услуга, работа), а также каталожные номера и применяемость, если они используются в складском контуре.

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

← На главную