Как организовать синхронизацию справочников и документов между 1С 7.7 и 1С 8 по GUID?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

При организации обмена данными между устаревшими базами на платформе 1С:Предприятие 7.7 и современными конфигурациями на платформе 1С:Предприятие 8 стандартная синхронизация по кодам, наименованиям или номерам документов часто приводит к дублям и ошибкам. Пользователи могут переименовать номенклатуру, изменить код или перенумеровать документы задним числом. Оптимальным решением является синхронизация по глобальному уникальному идентификатору (GUID / UUID). Разберем детально, как выстроить архитектуру такого обмена, какие функции платформы 1С 8 задействовать и с какими подводными камнями можно столкнуться в 1С 7.7.

Базовый принцип синхронизации и работа с идентификаторами в 1С 8

В платформе 1С 8 каждый ссылочный объект (элемент справочника, документ, план видов характеристик) уже имеет встроенный системный уникальный идентификатор типа УникальныйИдентификатор. Добавлять в структуры данных 1С 8 дополнительные строковые реквизиты для хранения семерочного GUID не требуется — поиск и сопоставление можно выполнять напрямую по системному идентификатору объекта.

Рассмотрим, как в коде 1С 8 найти существующий объект или создать новый с заранее предопределенным GUID, переданным из 1С 7.7. Для этого используются методы менеджера объекта ПолучитьСсылку() и метод объекта УстановитьСсылкуНового().

Посмотрим на пример загрузки элемента справочника в 1С 8:


// Строка GUID, полученная из 1С 7.7 (формат без скобок: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX)
СтрокаGUID = "6f9619ff-8b86-d011-b42d-00cf4fc964ff";
Идентификатор = Новый УникальныйИдентификатор(СтрокаGUID);

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

// Проверяем, существует ли физически такой объект в базе данных
ОбъектНоменклатура = СсылкаНаОбъект.ПолучитьОбъект();

Если ОбъектНоменклатура = Неопределено Тогда
    // Объекта еще нет в базе, создаем новый с жестко заданным GUID
    ОбъектНоменклатура = Справочники.Номенклатура.СоздатьЭлемент();
    ОбъектНоменклатура.УстановитьСсылкуНового(СсылкаНаОбъект);
КонецЕсли;

ОбъектНоменклатура.Наименование = ИмяНоменклатурыИзФайла;
// Заполнение остальных реквизитов...
ОбъектНоменклатура.Записать();

Важная ловушка метода ПолучитьСсылку(): данный метод конструирует ссылку исключительно в памяти, не делая запроса к базе данных. Проверка СсылкаНаОбъект.Пустая() для такой ссылки всегда вернет Ложь, даже если записи с этим GUID в базе нет. Реальное наличие объекта в базе необходимо проверять либо через попытку чтения СсылкаНаОбъект.ПолучитьОбъект() (вернет Неопределено, если объекта нет), либо с помощью запроса к таблице через ГДЕ Ссылка = &Ссылка.

Генерация GUID на стороне 1С 7.7

В платформе 1С 7.7 нет встроенного типа данных для UUID, однако строка нужного формата легко генерируется системными средствами Windows через COM-объект Scriptlet.TypeLib без необходимости подключать тяжелые внешние компоненты:


Функция СформироватьGUID()
    ТипЛиб = СоздатьОбъект("Scriptlet.TypeLib");
    НовыйГуид = ТипЛиб.Guid;
    // Результат имеет вид "{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}"
    // Очищаем от фигурных скобок и лишних пробелов:
    НовыйГуид = СтрЗаменить(НовыйГуид, "{", "");
    НовыйГуид = СтрЗаменить(НовыйГуид, "}", "");
    НовыйГуид = СокрЛП(НовыйГуид);
    Возврат ВРег(НовыйГуид);
КонецФункции

Проблема реструктуризации 1С 7.7 и способы хранения идентификаторов

Если пойти путем добавления реквизита GUID (строка длиной 36 знаков) непосредственно в каждый справочник и как общий реквизит документов, можно столкнуться с критической проблемой: реструктуризация больших информационных баз 1С 7.7 (особенно на базе DBF-файлов) через штатный конфигуратор способна занять десятки часов. Дополнительно изменяются таблицы журналов 1SJOURN, что повышает риск повреждения базы при сбоях.

Проанализируем два основных варианта реализации хранения идентификаторов на стороне «семерки»:

  1. Добавление реквизита в объекты метаданных:

    Реквизит создается внутри конфигурации. Удобно обращаться в коде, но требует долгой реструктуризации и доработки интерфейса (чтобы пользователи случайно не редактировали поле).

  2. Использование внешней таблицы соответствий (рекомендуемый подход):

    В каталоге информационной базы создается отдельная служебная таблица (например, изолированный DBF-файл или внешний справочник), имитирующий регистр сведений соответствий. Таблица содержит три колонки: ТипОбъекта, ИД77 (внутренний строковый идентификатор объекта 7.7, получаемый через функцию ЗначениеВСтрокуВнутр()) и GUID8.

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

Контроль дублирования GUID при копировании объектов в 1С 7.7

Если для хранения GUID все же выбран отдельный реквизит справочника или документа, возникает риск задвоения идентификаторов. В платформе 1С 8 при интерактивном копировании срабатывает предопределенное событие модуля объекта ПриКопировании(), где можно очистить служебные поля. В 1С 7.7 объектных событий нет, логика контролируется исключительно на уровне формы.

Разберем, как перехватить копирование в модуле формы справочника 1С 7.7:


Процедура ВводНового(ПризнакКопирования)
    Если ПризнакКопирования = 1 Тогда
        // Пользователь нажал F9 (ввод копированием)
        // Обязательно очищаем старый GUID или генерируем новый!
        GUID = СформироватьGUID();
    Иначе
        // Обычное создание нового элемента
        GUID = СформироватьGUID();
    КонецЕсли;
КонецПроцедуры

Обратите внимание: если новый элемент создается программным кодом (через Новый() или Копировать()), события формы не вызываются. При пакетном создании или переносе данных программист обязан принудительно очищать или перезаполнять реквизит GUID перед вызовом метода Записать(), иначе уникальность связей будет нарушена.

Ограничения при встречной загрузке из 1С 8 в 1С 7.7

Необходимо учитывать фундаментальное архитектурное ограничение 1С 7.7: платформа генерирует системные внутренние идентификаторы строго последовательно по системному счетчику базы (в 36-ричном формате). Принудительно присвоить объекту 1С 7.7 внутренний семерочный идентификатор, эквивалентный восьмерочному методу УстановитьСсылкуНового(), невозможно. Поэтому при двустороннем обмене, когда документы или номенклатура могут первично создаваться как в 1С 8, так и в 1С 7.7, хранение привязки к внешнему GUID через дополнительный реквизит или таблицу соответствий является единственным надежным техническим решением.

← На главную