При сопровождении систем на базе 1С:Предприятие часто возникает задача переноса справочников (например, Номенклатуры) из одной информационной базы в другую. Особую сложность эта процедура приобретает, когда база-источник уже интегрирована с внешними системами, такими как интернет-магазин или мобильное приложение. В таких случаях критически важно сохранить GUID (уникальный идентификатор) каждого объекта. Разберем подробно, почему это необходимо и какими способами можно осуществить такой перенос.
Проанализируем ситуацию: большинство современных интеграций 1С с веб-сайтами (например, на платформе 1С-Битрикс) используют внутренний идентификатор 1С (GUID) в качестве ключа сопоставления. На стороне сайта он обычно хранится в поле XML_ID или ExternalID. Если мы перенесем товар в новую базу, просто создав его заново (даже с тем же наименованием и артикулом), система присвоит ему новый УникальныйИдентификатор. При следующей выгрузке на сайт произойдет следующее:
Чтобы избежать этих проблем, рассмотрим основные инструменты для корректного переноса данных.
Рассмотрим самый простой и надежный метод. Стандартная обработка ВыгрузкаЗагрузкаДанныхXML.epf предназначена для обмена данными между идентичными или очень похожими конфигурациями. Ее главное преимущество заключается в том, что она переносит объекты «как есть», на уровне сериализации XML, полностью сохраняя внутренние ссылки.
Выясним, как работает этот механизм:
Важный момент: при использовании этой обработки в коде платформы устанавливается флаг ОбменДанными.Загрузка = Истина. Это позволяет игнорировать прикладные проверки модулей объектов (например, проверку на уникальность кода или заполнение обязательных реквизитов), что гарантирует точное воссоздание структуры данных из источника.
Если нам требуется перенести данные выборочно или выполнить дополнительную трансформацию в процессе, разберем программный метод создания объектов с сохранением их идентификаторов. Посмотрим на пример кода, который позволяет вручную создать элемент справочника с предопределенным GUID:
// ГУИД - это строковое представление уникального идентификатора из базы-источника
Идентификатор = Новый УникальныйИдентификатор(ГУИД);
НоменклатураСсылка = Справочники.Номенклатура.ПолучитьСсылку(Идентификатор);
// Проверим, существует ли уже объект с таким идентификатором в приемнике
НоменклатураОбъект = НоменклатураСсылка.ПолучитьОбъект();
Если НоменклатураОбъект = Неопределено Тогда
// Если объекта нет, создаем новый элемент
НоменклатураОбъект = Справочники.Номенклатура.СоздатьЭлемент();
// Ключевой метод: устанавливаем ссылку ДО записи объекта
НоменклатураОбъект.УстановитьСсылкуНового(НоменклатураСсылка);
// Заполняем остальные реквизиты
НоменклатураОбъект.Наименование = "Наименование из источника";
НоменклатураОбъект.Артикул = "12345";
// Обязательно используем ОбменДанными.Загрузка для подавления лишних проверок
НоменклатураОбъект.ОбменДанными.Загрузка = Истина;
НоменклатураОбъект.Записать();
КонецЕсли;
Проанализируем этот код: метод УстановитьСсылкуНового() позволяет зарезервировать конкретный GUID для еще не созданного объекта. Важно помнить, что этот метод работает только для новых объектов. Если объект уже записан в базу, изменить его GUID через стандартный встроенный язык 1С невозможно.
Проанализируем ситуацию глубже: перенос одной лишь номенклатуры часто бывает недостаточен. Справочник Номенклатура тесно связан с другими объектами. Если мы перенесем товар, но не перенесем его Единицы измерения (которые часто являются подчиненным справочником) с сохранением их GUID, то в новой базе в поле «Базовая единица» мы увидим сообщение «Объект не найден».
Поэтому при переносе рекомендуем соблюдать следующую последовательность:
ЕдиницыИзмерения, ВидыНоменклатуры, ХарактеристикиНоменклатуры.Номенклатуру.Штрихкоды, так как они тоже могут участвовать в обмене с сайтом.После завершения переноса обязательно выполним проверку. В тонком клиенте это сделать довольно просто. Рассмотрим алгоритм:
Если объект открылся корректно — поздравляем, GUID сохранен успешно. Если система выдает ошибку или открывает пустую форму — значит, при переносе был сгенерирован новый идентификатор.
Разберем, на что стоит обратить внимание, чтобы не «прострелить ногу» в процессе работы:
Записать(), а потом решили установить GUID. Ссылка должна быть определена до физической записи в таблицу базы данных.Подводя итог, использование стандартной обработки «Выгрузка и загрузка данных XML» является наиболее безопасным и быстрым способом сохранения GUID при условии идентичности структур баз. Для более сложных сценариев программисту следует использовать метод УстановитьСсылкуНового(). Для интерактивного выборочного переноса данных между базами также подойдёт обработка для переноса объектов 1С с анализом различий.