При организации обмена данными между 1С:Предприятие 7.7 и современными конфигурациями на платформе 1С 8.3 (например, 1С:УНФ или 1С:Бухгалтерия) разработчики часто сталкиваются с проблемой отсутствия в версии 7.7 встроенного типа данных УникальныйИдентификатор. В «восьмерке» каждый объект по умолчанию обладает ГУИДом, в то время как в «семерке» идентификация объектов строится на других принципах.
В данной статье мы подробно разберем, как получить стабильный идентификатор элемента справочника (например, номенклатуры) в 1С 7.7, чтобы использовать его в качестве ключа связи при выгрузке данных. Мы рассмотрим несколько подходов: от использования штатных механизмов до применения внешних компонент.
Для начала проанализируем, как 1С 7.7 хранит ссылки на объекты. Каждый элемент справочника, документ или другой объект метаданных имеет внутренний идентификатор (ID), который уникален в пределах своего вида (например, в пределах справочника «Номенклатура»). Этот ID не меняется в течение всей жизни объекта, если базу не подвергать экстремальным операциям пересоздания таблиц.
Разберем основной способ получения этого идентификатора через штатную функцию ЗначениеВСтрокуВнутр(). Эта функция возвращает строку в специальном формате, содержащую информацию о типе объекта и его внутреннем ключе в базе данных.
Рассмотрим, как извлечь полезную информацию из внутреннего представления объекта. Если мы применим ЗначениеВСтрокуВнутр(ТекЭлемент) к элементу справочника, мы получим строку вида: {"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 необходимо добавлять префикс информационной базы.
Если в вашей конфигурации уже используется библиотека FormEx, задача существенно упрощается. Эта компонента предоставляет прямой метод для получения GUID, который будет соответствовать стандарту UUID.
Проанализируем пример кода с использованием сервисных возможностей FormEx:
// Инициализация сервиса FormEx
Сервис = СоздатьОбъект("Сервис");
// Получаем GUID. Параметр 1 означает формат без фигурных скобок
ГлобИД = Сервис.ПолучитьGUID(1);
Однако стоит учитывать разницу: метод СоздатьGUID() (как в компоненте V7SysInfo) просто генерирует новый случайный идентификатор. Он никак не привязан к конкретному элементу справочника. Чтобы использовать такой ГУИД для обмена, его нужно один раз сгенерировать, записать в специально созданный реквизит справочника и в дальнейшем использовать именно сохраненное значение.
Выясним алгоритм работы в этом случае:
GUID (строка, 36 символов).Если вы не хотите добавлять новые реквизиты в конфигурацию 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С:Управление нашей фирмой (УНФ) рекомендуется создать дополнительный реквизит (свойства) у объектов «Номенклатура». Это позволит вам:
Резюме: Если вам нужна максимальная простота без изменения структуры базы 7.7, используйте парсинг ЗначениеВСтрокуВнутр(). Если важна высокая скорость разработки и есть возможность использовать внешние компоненты, FormEx станет отличным выбором. В любом случае, ключ связи должен быть уникальным и неизменным, что обеспечивается использованием именно внутренних системных идентификаторов платформы 1С 7.7.