При организации интеграции между 1С 8 и 1С 7.7 разработчики часто сталкиваются с ситуацией, когда стандартные реквизиты объектов (наименование, артикул, код) не являются уникальными. Например, в конфигурациях 1С 7.7 без включенного партионного учета пользователи нередко создают дублирующие элементы справочника «Номенклатура» под каждую партию товара. В таких условиях невозможно однозначно сопоставить данные по коду или наименованию. Доработка конфигурации 1С 7.7 путем добавления новых уникальных реквизитов не всегда возможна или целесообразна.
Рассмотрим, как получить системный уникальный идентификатор любого элемента или документа 1С 7.7 без изменения структуры метаданных и как использовать его в 1С 8 при обмене через OLE (COM-соединение).
В платформе 1С 7.7 у каждого объекта базы данных существует системный идентификатор. Получить его внутреннее текстовое представление можно с помощью встроенной функции ЗначениеВстрокуВнутр().
Проанализируем пример строки, возвращаемой для элемента справочника:
{"B","0","0","156","0","0"," 17141 "}
Разберем структуру параметров внутри фигурных скобок:
"B" обозначает элемент справочника (для документов используется символ "O").156 указывает на конкретный вид объекта (номер таблицы метаданных справочника или документа в структуре конфигурации)." 17141 " содержит уникальный номер записи в таблице базы данных.Системный идентификатор объекта в 1С 7.7 является постоянным и не меняется при редактировании реквизитов. Однако важно помнить: этот ID уникален только в пределах своей таблицы метаданных. Два разных справочника могут содержать элементы с одинаковым системным номером 17141.
Если сопоставление выполняется внутри одного известного справочника (например, «Номенклатура»), достаточно выделить из внутренней строки последний параметр. Для корректной и быстрой обработки внутреннего формата воспользуемся заменой разделителей на переводы строк.
Посмотрим на пример универсальной функции для платформы 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
КонецЕсли;
КонецЦикла;
Если в дальнейшем требуется не просто сопоставлять данные, но и напрямую получать ссылку на объект в 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.Наименование;
КонецЕсли;
При работе с системными ID платформы 1С 7.7 необходимо учитывать следующие технические нюансы:
0-9 и латинские буквы A-Z), дополненный пробелами. Нельзя приводить данный идентификатор к обычному числу, так как при переполнении числового диапазона в нем появляются буквенные символы.При интенсивном обмене данными через COM-соединение следует учитывать архитектурные ограничения платформы 1С 7.7:
dllhost.exe.База77.ОткрытьФорму()), которая упаковывает измененные данные в файл обмена (XML, JSON, текст) за одну операцию.