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

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

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

Рассмотрим, как получить системный уникальный идентификатор любого элемента или документа 1С 7.7 без изменения структуры метаданных и как использовать его в 1С 8 при обмене через OLE (COM-соединение).

Структура внутреннего представления объекта 1С 7.7

В платформе 1С 7.7 у каждого объекта базы данных существует системный идентификатор. Получить его внутреннее текстовое представление можно с помощью встроенной функции ЗначениеВстрокуВнутр().

Проанализируем пример строки, возвращаемой для элемента справочника:

{"B","0","0","156","0","0"," 17141 "}

Разберем структуру параметров внутри фигурных скобок:

  1. Тип объекта: символ "B" обозначает элемент справочника (для документов используется символ "O").
  2. Вспомогательные системные флаги: зарезервированные числовые параметры.
  3. Идентификатор метаданных: число 156 указывает на конкретный вид объекта (номер таблицы метаданных справочника или документа в структуре конфигурации).
  4. Системный идентификатор (ID): последнее поле " 17141 " содержит уникальный номер записи в таблице базы данных.

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

Способ 1. Извлечение системного ID с помощью строковых функций

Если сопоставление выполняется внутри одного известного справочника (например, «Номенклатура»), достаточно выделить из внутренней строки последний параметр. Для корректной и быстрой обработки внутреннего формата воспользуемся заменой разделителей на переводы строк.

Посмотрим на пример универсальной функции для платформы 1С 8:


Функция ПолучитьИД77ИзВнутреннейСтроки(ВнутренняяСтрока) Экспорт
    // Удаляем фигурные скобки и кавычки
    Текст = СтрЗаменить(ВнутренняяСтрока, "{", "");
    Текст = СтрЗаменить(Текст, "}", "");
    Текст = СтрЗаменить(Текст, """", "");
    
    // Преобразуем параметры, разделенные запятыми, в многострочный текст
    Текст = СтрЗаменить(Текст, ",", Символы.ПС);
    
    // Седьмая строка содержит идентификатор объекта
    Идентификатор = СокрЛП(СтрПолучитьСтроку(Текст, 7));
    
    Возврат Идентификатор;
КонецФункции

Разберем пример вызова данной функции при чтении данных из 1С 7.7 через OLE-соединение:


// Подключение к 1С 7.7 через OLE
База77 = Новый COMОбъект("V77.Application");
База77.Initialize(База77.RMTrade, "/D""C:\Bases\1C77\""", "NO_SPLASH_SHOW");

// Выборка элементов справочника
СпрНоменклатура = База77.CreateObject("Справочник.Номенклатура");
СпрНоменклатура.ВыбратьЭлементы();

Пока СпрНоменклатура.ПолучитьЭлемент() = 1 Цикл
    Если СпрНоменклатура.ЭтоГруппа() = 0 Тогда
        СтрокаОбъекта = База77.ЗначениеВстрокуВнутр(СпрНоменклатура.ТекущийЭлемент());
        Идентификатор77 = ПолучитьИД77ИзВнутреннейСтроки(СтрокаОбъекта);
        
        // Полученный Идентификатор77 можно сохранить в реквизит или регистр сведений 1С 8
    КонецЕсли;
КонецЦикла;

Способ 2. Хранение полной внутренней строки и получение ссылки методом ЗначениеИзСтрокиВнутр

Если в дальнейшем требуется не просто сопоставлять данные, но и напрямую получать ссылку на объект в 1С 7.7 без поиска по реквизитам или перебора, рекомендуется сохранять в 1С 8 полную внутреннюю строку вида {"B","0","0","156","0","0"," 17141 "}.

Платформа 1С 7.7 поддерживает обратное преобразование с помощью функции ЗначениеИзСтрокиВнутр(). Это позволяет мгновенно восстановить COM-ссылку на конкретный элемент или документ.

Рассмотрим пример обратного получения объекта в 1С 7.7 по сохраненной строке:


// Входной параметр — сохраненная строка внутреннего представления
СтрокаДляПоиска = "{""B"",""0"",""0"",""156"",""0"",""0"",""     17141   ""}";

// Мгновенное получение ссылки на объект
ОбъектOLE = База77.ЗначениеИзСтрокиВнутр(СтрокаДляПоиска);

Если ОбъектOLE.Выбран() = 1 Тогда
    // Объект успешно найден, можем читать или изменять его реквизиты
    Наименование = ОбъектOLE.Наименование;
КонецЕсли;

Особенности внутреннего идентификатора 1С 7.7

При работе с системными ID платформы 1С 7.7 необходимо учитывать следующие технические нюансы:

  1. Формат Base36: Внутренний системный идентификатор записи в базе данных 1С 7.7 формируется в 36-ричной системе счисления (содержит цифры 0-9 и латинские буквы A-Z), дополненный пробелами. Нельзя приводить данный идентификатор к обычному числу, так как при переполнении числового диапазона в нем появляются буквенные символы.
  2. Длина идентификатора: Для элементов справочников системный ID имеет длину 9 символов (6 символов самого номера и 3 символа префикса базы в распределенной информационной базе — УРБД). Для документов длина системного идентификатора составляет 13 символов.
  3. Уникальность ключа: Чтобы гарантировать абсолютную уникальность в рамках всей информационной базы, ключом сопоставления должна быть комбинация «Имя вида объекта» + «Системный ID» либо полная строка внутреннего представления.

Рекомендации по повышению производительности OLE-обмена

При интенсивном обмене данными через COM-соединение следует учитывать архитектурные ограничения платформы 1С 7.7:

  1. Разрядность процесса: COM-сервер 1С 7.7 является 32-разрядным. При вызове из 64-разрядного сервера 1С 8 необходимо настраивать запуск 32-разрядного COM+ приложения через системный компонент dllhost.exe.
  2. Пакетная передача: Поэлементное чтение тысяч записей через OLE может работать медленно из-за сетевых и межпроцессных накладных расходов. Для ускорения обмена рекомендуется вызывать в 1С 7.7 внешнюю обработку (метод База77.ОткрытьФорму()), которая упаковывает измененные данные в файл обмена (XML, JSON, текст) за одну операцию.
← На главную