Ситуация, когда база данных 1С утеряна, но сохранились файлы выгрузки на сайт (в формате CommerceML 2), встречается в практике восстановления данных достаточно часто. Файлы import.xml и offers.xml содержат практически всю необходимую информацию для восстановления справочника номенклатуры и актуальных складских остатков. В этой статье мы разберем, как программно обработать эти файлы и корректно загрузить данные в «чистую» конфигурацию.
Для начала проанализируем, как распределены данные в стандартной выгрузке 1С — Битрикс. Обычно выгрузка состоит из двух основных XML-файлов и папки с изображениями:
import.xml.Важно понимать, что загрузка должна происходить строго последовательно: сначала import.xml (создание объектов), а затем offers.xml (заполнение числовых данных).
Одной из главных задач при загрузке в пустую базу является сохранение уникальных идентификаторов (GUID). В файлах CommerceML идентификатор объекта хранится в теге Ид. Если мы просто создадим новые элементы, их внутренние ссылки в 1С не будут совпадать с теми, что ожидает сайт при следующем обмене. Это приведет к дублированию товаров на сайте.
Рассмотрим пример кода, который позволяет создать элемент справочника с конкретным UUID, извлеченным из XML:
// Предположим, мы прочитали Идентификатор из XML
СтрокаGUID = "550e8400-e29b-41d4-a716-446655440000";
НовыйGUID = Новый УникальныйИдентификатор(СтрокаGUID);
НовыйТовар = Справочники.Номенклатура.СоздатьЭлемент();
// Устанавливаем ссылку заранее, до записи объекта
НовыйТовар.УстановитьСсылкуНового(Справочники.Номенклатура.ПолучитьСсылку(НовыйGUID));
НовыйТовар.Наименование = "Наименование из XML";
НовыйТовар.Записать();
Разберем процесс чтения основного файла. Для этого удобнее всего использовать объект ЧтениеXML. Мы будем последовательно обходить узлы файла и искать информацию о товарах. Проанализируем типичный цикл обработки:
Чтение = Новый ЧтениеXML;
Чтение.ОткрытьФайл(ПутьКФайлу);
Пока Чтение.Прочитать() Цикл
Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
ИмяУзла = Чтение.Имя;
Если ИмяУзла = "Товар" Тогда
// Начинаем разбор конкретного товара
ОбработатьДанныеТовара(Чтение);
КонецЕсли;
КонецЕсли;
КонецЦикла;
Внутри процедуры ОбработатьДанныеТовара необходимо реализовать логику сопоставления полей. Важный нюанс: в CommerceML свойства товаров (например, цвет, размер, материал) могут быть вынесены в отдельный блок ЗначенияСвойств. Чтобы их загрузить в 1С, в целевой базе уже должны быть созданы соответствующие Дополнительные реквизиты или Характеристики.
После того как справочник Номенклатура заполнен, перейдем к обработке предложений. В файле offers.xml данные связаны с товарами через тот же самый Ид. Выясним причину, по которой данные могут не загрузиться: часто это отсутствие в базе соответствующих Видов цен или Складов.
Проанализируем шаги по загрузке остатков:
ТипыЦен и создать аналогичные элементы в справочнике ВидыЦен.Склады и создать элементы в справочнике Склады.Предложение найти товар по GUID.УстановкаЦенНоменклатуры для записи цен.ОприходованиеТоваров или ВводОстатков для фиксации количества.Чтобы товары в новой 1С выглядели полноценно, необходимо загрузить картинки. В файле import.xml путь к картинке указан относительно основной папки выгрузки, например: import_files/ab/ab12345.jpg. Нам нужно прочитать этот путь, найти файл на диске и поместить его в хранилище присоединенных файлов 1С.
Посмотрим на пример функции прикрепления файла:
// ПутьККартинке - полный путь к файлу на диске
ДвоичныеДанные = Новый ДвоичныеДанные(ПутьККартинке);
НовоеИзображение = Справочники.НоменклатураПрисоединенныеФайлы.СоздатьЭлемент();
НовоеИзображение.ВладелецФайла = СсылкаНаТовар;
НовоеИзображение.Наименование = "Основное фото";
НовоеИзображение.ФайлХранилище = Новый ХранилищеЗначения(ДвоичныеДанные, Новый СжатиеДанных(9));
НовоеИзображение.Записать();
Разберем типичную проблему, упомянутую в обсуждении: сложность разделения кода на клиент и сервер в Управляемых формах. При разработке обработки загрузки помните, что работа с файловой системой (чтение XML) и создание объектов базы данных (СправочникОбъект, ДокументОбъект) должна происходить исключительно на сервере.
Рекомендация: Чтобы избежать зависания интерфейса при загрузке больших файлов (десятки тысяч позиций), используйте длительные операции или фоновые задания. Это позволит пользователю видеть прогресс загрузки, не блокируя работу системы.
Восстановление базы из файлов сайта — задача трудоемкая, но вполне выполнимая штатными средствами платформы 1С. Основными инструментами здесь выступают объект ЧтениеXML и умение работать с UUID (GUID). Несмотря на то, что «готовой кнопки» в типовых конфигурациях для обратного импорта может не быть, структура CommerceML прозрачна и позволяет восстановить данные с высокой точностью.