Как получить уникальный идентификатор (GUID) объекта в 1С 7.7 для обмена данными?

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

При организации обмена данными между 1С:Предприятие 7.7 и современными конфигурациями на платформе 1С 8.3 (например, 1С:УНФ или 1С:Бухгалтерия) разработчики часто сталкиваются с проблемой отсутствия в версии 7.7 встроенного типа данных УникальныйИдентификатор. В «восьмерке» каждый объект по умолчанию обладает ГУИДом, в то время как в «семерке» идентификация объектов строится на других принципах.

В данной статье мы подробно разберем, как получить стабильный идентификатор элемента справочника (например, номенклатуры) в 1С 7.7, чтобы использовать его в качестве ключа связи при выгрузке данных. Мы рассмотрим несколько подходов: от использования штатных механизмов до применения внешних компонент.

Понятие внутреннего идентификатора в 1С 7.7

Для начала проанализируем, как 1С 7.7 хранит ссылки на объекты. Каждый элемент справочника, документ или другой объект метаданных имеет внутренний идентификатор (ID), который уникален в пределах своего вида (например, в пределах справочника «Номенклатура»). Этот ID не меняется в течение всей жизни объекта, если базу не подвергать экстремальным операциям пересоздания таблиц.

Разберем основной способ получения этого идентификатора через штатную функцию ЗначениеВСтрокуВнутр(). Эта функция возвращает строку в специальном формате, содержащую информацию о типе объекта и его внутреннем ключе в базе данных.

Способ 1: Использование ЗначениеВСтрокуВнутр()

Рассмотрим, как извлечь полезную информацию из внутреннего представления объекта. Если мы применим ЗначениеВСтрокуВнутр(ТекЭлемент) к элементу справочника, мы получим строку вида: {"B","0","0","123","0","0"," 456"}.

Здесь 123 — это внутренний идентификатор вида справочника, а 456 — уникальный ID самого элемента (в 36-ричной системе исчисления). Именно эта комбинация может служить основой для формирования GUID.

Давайте изучим программный способ извлечения этих данных без использования внешних компонент:


// Функция извлекает чистый ID объекта из внутреннего представления
Функция ПолучитьЧистыйИД(Объект)
    Стр = ЗначениеВСтрокуВнутр(Объект);
    // Формат строки: {"B","0","0","ВидОбъекта","0","0","ИДОбъекта"}
    // Нам нужно извлечь последнюю часть
    Стр = СтрЗаменить(Стр, "{", "");
    Стр = СтрЗаменить(Стр, "}", "");
    Стр = СтрЗаменить(Стр, """", "");
    
    Список = СоздатьОбъект("СписокЗначений");
    Список.ИзСтрокиСРазделителями(Стр);
    
    // Последнее значение - это внутренний 36-ричный ID
    ИдОбъекта = Список.ПолучитьЗначение(Список.РазмерСписка());
    Возврат СокрЛП(ИдОбъекта);
КонецФункции

Важный момент: Если вы планируете объединять данные из нескольких баз 1С 7.7 в одной базе 1С 8.3, одного внутреннего ID может быть недостаточно, так как в разных базах они могут совпасть. В этом случае к полученному ID необходимо добавлять префикс информационной базы.

Способ 2: Использование внешних компонент (FormEx и V7SysInfo)

Если в вашей конфигурации уже используется библиотека FormEx, задача существенно упрощается. Эта компонента предоставляет прямой метод для получения GUID, который будет соответствовать стандарту UUID.

Проанализируем пример кода с использованием сервисных возможностей FormEx:


// Инициализация сервиса FormEx
Сервис = СоздатьОбъект("Сервис");
// Получаем GUID. Параметр 1 означает формат без фигурных скобок
ГлобИД = Сервис.ПолучитьGUID(1);

Однако стоит учитывать разницу: метод СоздатьGUID() (как в компоненте V7SysInfo) просто генерирует новый случайный идентификатор. Он никак не привязан к конкретному элементу справочника. Чтобы использовать такой ГУИД для обмена, его нужно один раз сгенерировать, записать в специально созданный реквизит справочника и в дальнейшем использовать именно сохраненное значение.

Выясним алгоритм работы в этом случае:

  1. Добавляем в справочник «Номенклатура» реквизит GUID (строка, 36 символов).
  2. При первой выгрузке проверяем: если реквизит пуст, генерируем новое значение через компоненту и записываем в справочник.
  3. Передаем это значение в 1С 8.3.

Способ 3: Формирование «детерминированного» GUID

Если вы не хотите добавлять новые реквизиты в конфигурацию 7.7, можно программно формировать GUID на лету на основе внутреннего ID. Это гарантирует, что для одного и того же объекта в 7.7 всегда будет генерироваться один и тот же GUID в 8.3.

Разберем логику построения такого идентификатора. Стандартный GUID в 1С 8 состоит из 32 шестнадцатеричных символов. Внутренний ID 1С 7.7 (в SQL версии это обычно 9 символов в 36-ричной системе) можно дополнить нулями и префиксами до нужной длины.

Посмотрим на пример функции, которая подготавливает данные для передачи:


Функция СформироватьПсевдоGUID(Элемент)
    ВнутрИД = ПолучитьЧистыйИД(Элемент); // Получаем ID из ЗначениеВСтрокуВнутр
    // Допустим, префикс нашей базы "DB01"
    Префикс = "DB01-0000-0000-";
    // Дополняем ID до нужной длины нулями слева
    Результат = Префикс + Прав("000000000000" + ВнутрИД, 12);
    Возврат Результат;
КонецФункции

Рекомендации по интеграции с 1С:УНФ

При загрузке данных в 1С:Управление нашей фирмой (УНФ) рекомендуется создать дополнительный реквизит (свойства) у объектов «Номенклатура». Это позволит вам:

Резюме: Если вам нужна максимальная простота без изменения структуры базы 7.7, используйте парсинг ЗначениеВСтрокуВнутр(). Если важна высокая скорость разработки и есть возможность использовать внешние компоненты, FormEx станет отличным выбором. В любом случае, ключ связи должен быть уникальным и неизменным, что обеспечивается использованием именно внутренних системных идентификаторов платформы 1С 7.7.

← На главную