Как перенести номенклатуру между базами 1С с сохранением GUID?

Программист 1С v8.3 (Управляемые формы) Управленческий учет IT и автоматизация бизнеса
← На главную

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

Почему важно сохранять GUID при обмене с сайтом?

Проанализируем ситуацию: большинство современных интеграций 1С с веб-сайтами (например, на платформе 1С-Битрикс) используют внутренний идентификатор 1С (GUID) в качестве ключа сопоставления. На стороне сайта он обычно хранится в поле XML_ID или ExternalID. Если мы перенесем товар в новую базу, просто создав его заново (даже с тем же наименованием и артикулом), система присвоит ему новый УникальныйИдентификатор. При следующей выгрузке на сайт произойдет следующее:

  1. Сайт не найдет товар по новому GUID.
  2. Система создаст дубликат товара в каталоге интернет-магазина.
  3. История заказов останется привязанной к старому (уже несуществующему в новой 1С) товару.
  4. Остатки и цены перестанут обновляться для старых карточек на сайте.

Чтобы избежать этих проблем, рассмотрим основные инструменты для корректного переноса данных.

Способ 1: Использование стандартной обработки «Выгрузка и загрузка данных XML»

Рассмотрим самый простой и надежный метод. Стандартная обработка ВыгрузкаЗагрузкаДанныхXML.epf предназначена для обмена данными между идентичными или очень похожими конфигурациями. Ее главное преимущество заключается в том, что она переносит объекты «как есть», на уровне сериализации XML, полностью сохраняя внутренние ссылки.

Выясним, как работает этот механизм:

  1. Программа считывает объект из базы-источника вместе с его внутренним идентификатором.
  2. При загрузке в базу-приемник обработка проверяет наличие объекта с таким GUID.
  3. Если объект не найден, он создается именно с тем идентификатором, который указан в файле.
  4. Если объект уже существует, он обновляется (перезаписывается).

Важный момент: при использовании этой обработки в коде платформы устанавливается флаг ОбменДанными.Загрузка = Истина. Это позволяет игнорировать прикладные проверки модулей объектов (например, проверку на уникальность кода или заполнение обязательных реквизитов), что гарантирует точное воссоздание структуры данных из источника.

Способ 2: Программный перенос с использованием УстановитьСсылкуНового()

Если нам требуется перенести данные выборочно или выполнить дополнительную трансформацию в процессе, разберем программный метод создания объектов с сохранением их идентификаторов. Посмотрим на пример кода, который позволяет вручную создать элемент справочника с предопределенным GUID:


// ГУИД - это строковое представление уникального идентификатора из базы-источника
Идентификатор  = Новый УникальныйИдентификатор(ГУИД);
НоменклатураСсылка = Справочники.Номенклатура.ПолучитьСсылку(Идентификатор);

// Проверим, существует ли уже объект с таким идентификатором в приемнике
НоменклатураОбъект = НоменклатураСсылка.ПолучитьОбъект();

Если НоменклатураОбъект = Неопределено Тогда
    // Если объекта нет, создаем новый элемент
    НоменклатураОбъект = Справочники.Номенклатура.СоздатьЭлемент();
    
    // Ключевой метод: устанавливаем ссылку ДО записи объекта
    НоменклатураОбъект.УстановитьСсылкуНового(НоменклатураСсылка);
    
    // Заполняем остальные реквизиты
    НоменклатураОбъект.Наименование = "Наименование из источника";
    НоменклатураОбъект.Артикул = "12345";
    
    // Обязательно используем ОбменДанными.Загрузка для подавления лишних проверок
    НоменклатураОбъект.ОбменДанными.Загрузка = Истина;
    
    НоменклатураОбъект.Записать();
КонецЕсли;

Проанализируем этот код: метод УстановитьСсылкуНового() позволяет зарезервировать конкретный GUID для еще не созданного объекта. Важно помнить, что этот метод работает только для новых объектов. Если объект уже записан в базу, изменить его GUID через стандартный встроенный язык 1С невозможно.

Связанные данные: Единицы измерения и Характеристики

Проанализируем ситуацию глубже: перенос одной лишь номенклатуры часто бывает недостаточен. Справочник Номенклатура тесно связан с другими объектами. Если мы перенесем товар, но не перенесем его Единицы измерения (которые часто являются подчиненным справочником) с сохранением их GUID, то в новой базе в поле «Базовая единица» мы увидим сообщение «Объект не найден».

Поэтому при переносе рекомендуем соблюдать следующую последовательность:

  1. Выгружать сначала иерархию (Группы номенклатуры). Группы — это те же элементы справочника со своими GUID.
  2. Переносить сопутствующие справочники: ЕдиницыИзмерения, ВидыНоменклатуры, ХарактеристикиНоменклатуры.
  3. Переносить саму Номенклатуру.
  4. При необходимости перенести данные регистров сведений, например, Штрихкоды, так как они тоже могут участвовать в обмене с сайтом.

Проверка результата

После завершения переноса обязательно выполним проверку. В тонком клиенте это сделать довольно просто. Рассмотрим алгоритм:

  1. В базе-источнике откроем карточку номенклатуры.
  2. Нажмем «Получить ссылку» (кнопка скрепки или через меню «Сервис-Параметры»).
  3. Скопируем внутреннюю ссылку (e1cib/data/...).
  4. В базе-приемнике нажмем «Перейти по ссылке» (Shift+F11) и вставим скопированное значение.

Если объект открылся корректно — поздравляем, GUID сохранен успешно. Если система выдает ошибку или открывает пустую форму — значит, при переносе был сгенерирован новый идентификатор.

Типичные ошибки и риски

Разберем, на что стоит обратить внимание, чтобы не «прострелить ногу» в процессе работы:

Подводя итог, использование стандартной обработки «Выгрузка и загрузка данных XML» является наиболее безопасным и быстрым способом сохранения GUID при условии идентичности структур баз. Для более сложных сценариев программисту следует использовать метод УстановитьСсылкуНового(). Для интерактивного выборочного переноса данных между базами также подойдёт обработка для переноса объектов 1С с анализом различий.

← На главную