Как определить формат и восстановить связь с объектом 1С 7.7 по внутреннему идентификатору Ид77 в 1С 8?

Программист 1С v7.7
← На главную

При переносе данных из 1С 7.7 в 1С 8 часто возникает необходимость сохранить связь между старыми и новыми объектами. Для этого в 1С 8 создают специальные реквизиты, например, Ид77, которые хранят идентификатор исходного объекта из 1С 7.7. Однако формат этого идентификатора может быть неочевидным, что затрудняет его использование для поиска соответствующих объектов в базе 1С 7.7. Рассмотрим, как понять структуру такого идентификатора и как по нему установить соответствие с объектом в 1С 7.7.

Анализ структуры внутреннего идентификатора 1С 7.7

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

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

{"B","0","0","172","0","0"," 20653100"}

Разберем основные части этого идентификатора:

  1. Первый параметр ("B"): Этот параметр указывает на тип объекта. Например, "B" часто обозначает объект справочника (СправочникОбъект), "D" – документ (ДокументОбъект), а "F" – набор записей регистра и т.д.
  2. Четвертый параметр ("172"): В стандартном случае, когда мы работаем с конкретным элементом справочника (например, через Спр.ТекущийЭлемент()), этот параметр является внутренним идентификатором вида объекта или, иными словами, ID таблицы метаданных. Он уникален для каждого типа справочника (например, справочника "Номенклатура", "Контрагенты" и т.д.).
  3. Седьмой параметр ("20653100"): Это уникальный внутренний идентификатор конкретного экземпляра объекта в данной таблице. То есть, это ID конкретного элемента справочника (например, конкретной позиции номенклатуры). Ведущие пробелы являются частью внутреннего форматирования.

Особенности формирования Ид77 при переносе данных

Теперь рассмотрим, как выглядит реквизит Ид77 в базе 1С 8, который был получен при переносе:

МК{"B","0","0","0","0","0"," 493 11464100"}

Мы видим несколько отличий от стандартного представления 1С 7.7:

  1. Префикс ("МК"): Перед строкой идентификатора добавлена некоторая буквенная комбинация.
  2. Четвертый параметр ("0"): Вместо ID таблицы здесь стоит "0".
  3. Седьмой параметр (" 493 11464100"): Этот параметр стал значительно длиннее и содержит два числа, разделенные пробелами.

Эти изменения не случайны и говорят нам о том, как именно был сформирован идентификатор в 1С 7.7 перед переносом. Причиной такого формата является использование в 1С 7.7 ссылки неопределенного типа или generic-объекта Справочник вместо ссылки на конкретный элемент справочника.

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

Вариант 1: Использование конкретного элемента справочника

Если мы получаем строковое представление для конкретного элемента, например, с формы справочника, где реквизит имеет тип "Справочник.Номенклатура", то функция ЗначениеВСтрокуВнутр() вернет нам привычный формат:


// Предположим, что Спр - это Справочник.Номенклатура.ТекущийЭлемент()
Объект = Спр.ТекущийЭлемент();
СтрокаИД = ЗначениеВСтрокуВнутр(Объект);
// Результат: {"B","0","0","84","0","0","    110660001"}
// Где 84 - ID таблицы для Номенклатуры, 110660001 - ID элемента

Здесь четвертый параметр (в данном случае "84") содержит ID таблицы справочника, а седьмой параметр ("110660001") – ID самого элемента.

Вариант 2: Использование объекта неопределенного типа

Если же мы получаем строковое представление для объекта, который имеет неопределенный вид, например, для переменной, объявленной как Справочник без указания конкретного типа, или для реквизита на форме "Неопределенный Справочник", то результат будет другим:


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

В этом случае четвертый параметр становится "0", а ID таблицы ("84") и ID элемента ("110660001") объединяются в седьмом параметре. Именно такой формат мы и наблюдаем в реквизите Ид77 в 1С 8. Это означает, что при формировании Ид77 в 1С 7.7 использовался объект, который обрабатывался как "неопределенный справочник" или "справочник произвольного вида".

Как восстановить соответствие с объектом в 1С 7.7

Теперь, когда мы поняли структуру Ид77, мы можем восстановить исходный идентификатор 1С 7.7 и использовать его для поиска объекта. Рассмотрим наш пример:

Ид77 = "МК{\"B\",\"0\",\"0\",\"0\",\"0\",\"0\",\" 493 11464100\"}"

Следуем шагам для восстановления:

  1. Извлечение значимой части: Прежде всего, мы отбрасываем префикс "МК" и берем только строковое представление идентификатора в фигурных скобках.
  2. Разбор седьмого параметра: В седьмом параметре " 493 11464100" мы видим два числа. Первые десять символов (после возможного удаления ведущих пробелов) содержат ID таблицы, а оставшаяся часть – ID элемента.
  3. Формирование корректной строки 1С 7.7: Мы берем ID таблицы из седьмого параметра и помещаем его в четвертый параметр, а остаток седьмого параметра оставляем на месте.

Давайте разберем это на примере:

Исходный Ид77 в 1С 8:

МК{"B","0","0","0","0","0"," 493 11464100"}

Мы берем строковую часть без префикса: {"B","0","0","0","0","0"," 493 11464100"}

Разбираем седьмой параметр: " 493 11464100".

Извлекаем первые значащие цифры, которые являются ID таблицы: "493".

Извлекаем оставшуюся часть, которая является ID элемента: " 11464100".

Формируем корректную строку для 1С 7.7, где "493" становится четвертым параметром:

{"B","0","0","493","0","0"," 11464100"}

Теперь, имея эту строку, мы можем использовать функцию ЗначениеИзСтрокиВнутр() в 1С 7.7 для получения ссылки на исходный объект:


// Пример кода в 1С 7.7
СтрокаИД77 = "{\"B\",\"0\",\"0\",\"493\",\"0\",\"0\",\"    11464100\"}";
ОбъектИз77 = ЗначениеИзСтрокиВнутр(СтрокаИД77);

Если ТипЗначения(ОбъектИз77) = "Справочник" Тогда
    Сообщить("Найден объект справочника: " + ОбъектИз77.Наименование);
Иначе
    Сообщить("Объект не найден или имеет другой тип.");
КонецЕсли;

Таким образом, по преобразованной строке мы можем установить соответствие с объектом в 1С 7.7-базе.

Значение префиксов ("МК", "ВЛ", "ОП")

Префиксы, такие как "МК", "ВЛ", "ОП", которые встречаются в начале Ид77, имеют важное значение. Вероятно, они указывают на источник данных. Это стандартная практика при переносе данных из нескольких различных информационных баз 1С 7.7 в одну объединенную базу 1С 8. Или же это может быть связано с использованием распределенных информационных баз (РИБ) в 1С 7.7.

Рассмотрим, почему используются префиксы:

  1. Обеспечение уникальности: В разных базах 1С 7.7 могут существовать объекты с одинаковыми внутренними ID таблиц и ID элементов, но относящиеся к разным сущностям. При объединении данных из нескольких источников в одну базу 1С 8 добавление префикса позволяет гарантировать уникальность идентификатора в целевой системе.
  2. Отслеживание происхождения: Префиксы позволяют понять, из какой именно исходной базы 1С 7.7 был перенесен данный объект. Например, "МК" может означать "Мясокомбинат", "ВЛ" – "Владыкино", "ОП" – "Основное Производство" или "Оптовая Продажа".
  3. Работа с РИБ: В условиях распределенной базы 1С 7.7 система не контролирует уникальность внутренних идентификаторов между разными узлами. Добавление префикса базы-источника является необходимым для обеспечения уникальности и правильного обмена данными.

Если вы столкнулись с такими префиксами, это с высокой вероятностью означает, что ваша 1С 8 база является результатом слияния или консолидации данных из нескольких разрозненных 1С 7.7 систем.

Общий процесс переноса и роль Ид77

Перенос данных из 1С 7.7 в 1С 8.х обычно осуществляется с помощью специально разработанных правил обмена или обработок переноса данных. В рамках этих процессов:

  1. Сопоставление объектов: Определяются правила, по которым объекты из 1С 7.7 (например, по наименованию, коду, ИНН/КПП) сопоставляются с объектами в 1С 8.
  2. Создание новых объектов: Если соответствующий объект в 1С 8 не найден, он создается на основе данных из 1С 7.7.
  3. Сохранение связей: Для созданных или найденных объектов в 1С 8 вводится дополнительный реквизит (например, Ид77), в который записывается внутренний идентификатор исходного объекта 1С 7.7. Это позволяет в будущем проверять полноту и корректность переноса, а также при необходимости восстанавливать связь с историческими данными.

Именно для сохранения этой исторической связи и возможности ее восстановления и был создан реквизит Ид77 в 1С 8. Понимание его структуры позволяет эффективно использовать его для решения задач, связанных с данными 1С 7.7.

Вывод

Мы выяснили, что формат реквизита Ид77, содержащего идентификатор объекта 1С 7.7 в базе 1С 8, отличается от стандартного представления ЗначениеВСтрокуВнутр(Спр.ТекущийЭлемент()) из-за способа его формирования в 1С 7.7 – через объект неопределенного типа. Мы также определили, что префиксы, такие как "МК", "ВЛ", "ОП", используются для обозначения источника данных или для обеспечения уникальности при консолидации нескольких баз.

Теперь мы обладаем всеми необходимыми знаниями для того, чтобы:

  1. Расшифровать структуру Ид77.
  2. Извлечь из него ID таблицы и ID элемента 1С 7.7.
  3. Сформировать корректную строку для функции ЗначениеИзСтрокиВнутр() в 1С 7.7.
  4. Установить соответствие с исходным объектом в 1С 7.7 базе.

Этот подход позволяет нам эффективно работать с перенесенными данными и поддерживать целостность информации между разными версиями платформы 1С.

← На главную