Как загрузить товары, цены и остатки в чистую 1С из файлов выгрузки для сайта

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

Ситуация, когда база данных 1С утеряна, но сохранились файлы выгрузки на сайт (в формате CommerceML 2), встречается в практике восстановления данных достаточно часто. Файлы import.xml и offers.xml содержат практически всю необходимую информацию для восстановления справочника номенклатуры и актуальных складских остатков. В этой статье мы разберем, как программно обработать эти файлы и корректно загрузить данные в «чистую» конфигурацию.

Анализируем структуру файлов обмена

Для начала проанализируем, как распределены данные в стандартной выгрузке 1С — Битрикс. Обычно выгрузка состоит из двух основных XML-файлов и папки с изображениями:

  1. import.xml — содержит классификатор (группы товаров), типы цен, склады, свойства (дополнительные реквизиты) и сам каталог товаров (наименования, артикулы, описания).
  2. offers.xml — содержит так называемые «предложения». Здесь хранятся цены и остатки в разрезе товаров или их характеристик.
  3. Папка import_files — содержит графические файлы, пути к которым прописаны в import.xml.

Важно понимать, что загрузка должна происходить строго последовательно: сначала import.xml (создание объектов), а затем offers.xml (заполнение числовых данных).

Подготовка: Использование GUID для синхронизации

Одной из главных задач при загрузке в пустую базу является сохранение уникальных идентификаторов (GUID). В файлах CommerceML идентификатор объекта хранится в теге Ид. Если мы просто создадим новые элементы, их внутренние ссылки в 1С не будут совпадать с теми, что ожидает сайт при следующем обмене. Это приведет к дублированию товаров на сайте.

Рассмотрим пример кода, который позволяет создать элемент справочника с конкретным UUID, извлеченным из XML:


// Предположим, мы прочитали Идентификатор из XML
СтрокаGUID = "550e8400-e29b-41d4-a716-446655440000";
НовыйGUID = Новый УникальныйИдентификатор(СтрокаGUID);

НовыйТовар = Справочники.Номенклатура.СоздатьЭлемент();
// Устанавливаем ссылку заранее, до записи объекта
НовыйТовар.УстановитьСсылкуНового(Справочники.Номенклатура.ПолучитьСсылку(НовыйGUID));
НовыйТовар.Наименование = "Наименование из XML";
НовыйТовар.Записать();

Реализация загрузки каталога из import.xml

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


Чтение = Новый ЧтениеXML;
Чтение.ОткрытьФайл(ПутьКФайлу);

Пока Чтение.Прочитать() Цикл
    Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
        ИмяУзла = Чтение.Имя;
        
        Если ИмяУзла = "Товар" Тогда
            // Начинаем разбор конкретного товара
            ОбработатьДанныеТовара(Чтение);
        КонецЕсли;
    КонецЕсли;
КонецЦикла;

Внутри процедуры ОбработатьДанныеТовара необходимо реализовать логику сопоставления полей. Важный нюанс: в CommerceML свойства товаров (например, цвет, размер, материал) могут быть вынесены в отдельный блок ЗначенияСвойств. Чтобы их загрузить в 1С, в целевой базе уже должны быть созданы соответствующие Дополнительные реквизиты или Характеристики.

Загрузка цен и остатков из offers.xml

После того как справочник Номенклатура заполнен, перейдем к обработке предложений. В файле offers.xml данные связаны с товарами через тот же самый Ид. Выясним причину, по которой данные могут не загрузиться: часто это отсутствие в базе соответствующих Видов цен или Складов.

Проанализируем шаги по загрузке остатков:

  1. Прочитать блок ТипыЦен и создать аналогичные элементы в справочнике ВидыЦен.
  2. Прочитать блок Склады и создать элементы в справочнике Склады.
  3. В цикле по узлам Предложение найти товар по GUID.
  4. Создать документ УстановкаЦенНоменклатуры для записи цен.
  5. Создать документ ОприходованиеТоваров или ВводОстатков для фиксации количества.

Работа с изображениями

Чтобы товары в новой 1С выглядели полноценно, необходимо загрузить картинки. В файле import.xml путь к картинке указан относительно основной папки выгрузки, например: import_files/ab/ab12345.jpg. Нам нужно прочитать этот путь, найти файл на диске и поместить его в хранилище присоединенных файлов 1С.

Посмотрим на пример функции прикрепления файла:


// ПутьККартинке - полный путь к файлу на диске
ДвоичныеДанные = Новый ДвоичныеДанные(ПутьККартинке);
НовоеИзображение = Справочники.НоменклатураПрисоединенныеФайлы.СоздатьЭлемент();
НовоеИзображение.ВладелецФайла = СсылкаНаТовар;
НовоеИзображение.Наименование = "Основное фото";
НовоеИзображение.ФайлХранилище = Новый ХранилищеЗначения(ДвоичныеДанные, Новый СжатиеДанных(9));
НовоеИзображение.Записать();

Особенности работы на Управляемых формах

Разберем типичную проблему, упомянутую в обсуждении: сложность разделения кода на клиент и сервер в Управляемых формах. При разработке обработки загрузки помните, что работа с файловой системой (чтение XML) и создание объектов базы данных (СправочникОбъект, ДокументОбъект) должна происходить исключительно на сервере.

Рекомендация: Чтобы избежать зависания интерфейса при загрузке больших файлов (десятки тысяч позиций), используйте длительные операции или фоновые задания. Это позволит пользователю видеть прогресс загрузки, не блокируя работу системы.

Заключение

Восстановление базы из файлов сайта — задача трудоемкая, но вполне выполнимая штатными средствами платформы 1С. Основными инструментами здесь выступают объект ЧтениеXML и умение работать с UUID (GUID). Несмотря на то, что «готовой кнопки» в типовых конфигурациях для обратного импорта может не быть, структура CommerceML прозрачна и позволяет восстановить данные с высокой точностью.

← На главную