Загрузка XML-файла в 1С 8.3: обработки, правила обмена и код

· 11 мин

Содержание

Чтобы импортировать XML в 1С, откройте Все функции → Обработки → Универсальный обмен данными в формате XML, перейдите на вкладку «Загрузка», укажите файл и нажмите «Загрузить данные». Это работает, если файл выгружен по правилам Конвертации данных: правила обычно уже лежат внутри самого файла.

Частое заблуждение — что 1С «понимает любой XML». Нет. Программа загружает только файлы известной ей структуры: выгрузку по правилам обмена, сериализацию из такой же конфигурации, формат EnterpriseData или электронные документы по формату ФНС. Для произвольного XML от сайта или внешней системы нужны свои правила или код. Поэтому первый шаг — понять, что за файл у вас в руках.

Подготовка: определяем, какой XML пришёл

Откройте файл в Блокноте, Notepad++ или браузере и посмотрите на первые 10–20 строк. По корневому элементу почти всегда понятно, каким способом его загружать.

Что видно в начале файлаОткуда файлЧем загружать
<ФайлОбмена ...> и блок <ПравилаОбмена>Выгрузка по правилам Конвертации данных 2.xУниверсальный обмен данными в формате XML
<V8Exch:_1CV8DtUD ...>Обработка «Выгрузка и загрузка данных XML»Та же обработка в базе с той же конфигурацией
Пространство имён EnterpriseDataСинхронизация через универсальный форматАдминистрирование → Синхронизация данных
<Файл ... ВерсФорм=...>Электронный документ по формату ФНС (УПД, акт, накладная)Загрузка электронного документа из файла в списке документов
Произвольные теги (<order>, <item>)Сайт, маркетплейс, внешняя системаСвои правила обмена или своя обработка

Ещё три проверки до загрузки:

  • 📄 Кодировка. Смотрите атрибут encoding в первой строке. Если там windows-1251, а файл фактически сохранён в UTF-8 (или наоборот), вместо кириллицы придут «кракозябры» либо загрузка упадёт.
  • 🧩 Целостность. Файл должен заканчиваться закрывающим тегом корневого элемента. Обрезанный при передаче файл не прочитается.
  • 🗂 Размер. Файлы на сотни мегабайт лучше загружать в клиент-серверную базу ночью: обработка может идти десятки минут.

Загрузка меняет данные в базе: создаёт и перезаписывает элементы справочников, документы, иногда проводит их. Перед первой загрузкой сделайте резервную копию базы (выгрузку в .dt или копию каталога файловой базы). Откатить загрузку кнопкой нельзя.

Какой у вас XML-файл?

Загрузка XML через универсальный обмен данными

Обработка «Универсальный обмен данными в формате XML» входит в типовые конфигурации на БСП: Бухгалтерию 3.0, ЗУП 3.1, УТ 11, КА и ERP. Если её нет в списке обработок, она распространяется в составе Конвертации данных 2.x как внешняя обработка V8Exchan83.epf.

Как открыть обработку

  1. Включите пункт «Все функции»: Главное меню (☰) → Сервис → Параметры, флажок «Отображать команду “Все функции”».
  2. Откройте Главное меню → Все функции → Обработки.
  3. Найдите в списке «Универсальный обмен данными в формате XML».

Нужны права администратора: обработка пишет данные в обход части прикладных проверок.

Порядок загрузки

  1. Перейдите на вкладку «Загрузка».
  2. В поле имени файла укажите XML-файл (или ZIP-архив, если выгрузку сжимали при отправке).
  3. Проверьте настройки на вкладке «Дополнительно» (описаны ниже).
  4. Нажмите «Загрузить данные» и дождитесь окончания. Ход загрузки и ошибки выводятся в окно сообщений.
  5. Проверьте результат: откройте 3–5 загруженных документов и сверьте суммы, контрагентов, склады с базой-источником.

Настройки, которые реально влияют на результат

  • 🔁 Использовать транзакции и количество элементов в транзакции. При большой порции одна ошибка откатывает всю порцию. Для первой пробной загрузки поставьте 100–500 элементов: найти проблемный объект проще.
  • ⚙️ Загрузка в режиме обмена данными. Объекты пишутся с ОбменДанными.Загрузка = Истина: без части проверок и подписок на события. Быстрее, но документы потом нужно перепровести, если правила их не проводят.
  • 📝 Протокол обмена. Включите запись протокола в файл и укажите путь. При загрузке на 20 000 объектов окно сообщений не сохранит всё, а файл сохранит.

Если загрузка останавливается на одном объекте, отметьте режим продолжения при ошибке (если он есть в вашей версии обработки) и загрузите остальное. Проблемные объекты потом разберёте по протоколу.

Правила обмена в Конвертации данных: когда и как их готовить

Правила нужны, когда структура источника и приёмника различается: например, данные из УТ 10.3 переносят в Бухгалтерию 3.0 или из самописной базы в ЗУП. Для пар типовых конфигураций готовые правила часто есть в поставке конфигурации или на диске ИТС. Сначала поищите их, а не пишите с нуля.

Порядок работы в Конвертации данных 2.x

  1. Выгрузите структуру метаданных обеих конфигураций. Для этого в каждой базе запускают обработку MD83Exp.epf из комплекта Конвертации данных. Она сохраняет описание объектов в XML.
  2. В базе Конвертации данных загрузите обе структуры и создайте конвертацию «источник → приёмник».
  3. Настройте правила конвертации объектов (ПКО): какой справочник или документ во что превращается.
  4. Для каждого ПКО задайте правила конвертации свойств (ПКС): реквизит к реквизиту, табличная часть к табличной части.
  5. Задайте правила поиска. Обычно контрагента ищут по ИНН и КПП, номенклатуру — по артикулу или коду, документ — по номеру и дате.
  6. Создайте правила выгрузки данных (ПВД): что и с каким отбором выгружать.
  7. Сохраните правила в XML-файл.

Дальше в базе-источнике тот же «Универсальный обмен данными» на вкладке «Выгрузка»: указываете файл правил, период, отбор и выгружаете. Правила попадают в файл обмена. В базе-приёмнике загружаете этот файл, как в разделе выше.

Как сопоставить поля

Самая частая причина дублей после импорта — неудачные правила поиска. Если контрагента ищут по наименованию, «ООО Ромашка» и «Ромашка ООО» станут двумя элементами.

Сопоставление полей
ИНН + КПП контрагента→Справочник «Контрагенты», поиск
Артикул товара→Справочник «Номенклатура», поиск
Номер + дата документа→Документ-приёмник, поиск
Ставка НДС строкой («20%»)→Перечисление ставок НДС
Единица измерения (код ОКЕИ)→Классификатор единиц измерения

Для произвольного XML от сайта или маркетплейса Конвертация данных 2.x подходит хуже: она рассчитана на обмен между базами 1С. Для таких файлов проще написать обработку на встроенном языке (следующий раздел).

Конвертация данных 3.x и EnterpriseData

Современные типовые конфигурации обмениваются через универсальный формат EnterpriseData. Здесь правила — это не XML-файл, а модуль менеджера обмена внутри конфигурации. Пользователю ничего готовить не нужно: обмен настраивается в Администрирование → Синхронизация данных. Если связи по сети нет, выбирают вариант передачи через файл или общий каталог. Файл из базы-источника кладут в каталог, и база-приёмник забирает его при очередной синхронизации.

Перенос между одинаковыми базами: обработка «Выгрузка и загрузка данных XML»

Когда источник и приёмник — одна и та же конфигурация одного релиза, правила не нужны. Обработка «Выгрузка и загрузка данных XML» (ВыгрузкаЗагрузкаДанныхXML83.epf) сериализует объекты вместе с их внутренними ссылками.

Как пользоваться:

  1. В базе-источнике откройте обработку через Главное меню → Файл → Открыть.
  2. Отметьте объекты в дереве метаданных, задайте период и выгрузите в файл.
  3. В базе-приёмнике откройте ту же обработку, на вкладке загрузки укажите файл и запустите.

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

СпособКогда подходитРиски
Универсальный обмен + правила КД 2.xРазные конфигурации, разовый переносДубли при слабых правилах поиска
«Выгрузка и загрузка данных XML»Одинаковые конфигурации и релизыПерезапись объектов, нужна полная совпадающая структура
Синхронизация через EnterpriseDataПостоянный обмен типовых конфигурацийОшибки сопоставления при первой синхронизации
Своя обработка на ЧтениеXMLФайлы внешних системНужен программист, поддержка при смене формата

Программный импорт XML на встроенном языке

Для произвольного файла пишут внешнюю обработку или расширение. Возьмём пример файла с прайсом:

<?xml version="1.0" encoding="UTF-8"?>
<Товары>
  <Товар Артикул="A-1001" Наименование="Бумага А4, 500 листов" Цена="350.00"/>
  <Товар Артикул="A-1002" Наименование="Ручка шариковая синяя" Цена="25.50"/>
</Товары>

Потоковое чтение через объект ЧтениеXML не загружает весь файл в память, поэтому подходит и для больших выгрузок. Код выполняется на сервере, значит путь к файлу должен быть доступен серверу 1С, а не только компьютеру пользователя.

&НаСервере
Процедура ЗагрузитьТоварыИзXML(ИмяФайла)

    Чтение = Новый ЧтениеXML;
    Чтение.ОткрытьФайл(ИмяФайла);

    Загружено = 0;
    Ошибок = 0;

    Пока Чтение.Прочитать() Цикл

        Если Чтение.ТипУзла <> ТипУзлаXML.НачалоЭлемента
            Или Чтение.Имя <> "Товар" Тогда
            Продолжить;
        КонецЕсли;

        Артикул      = Чтение.ЗначениеАтрибута("Артикул");
        Наименование = Чтение.ЗначениеАтрибута("Наименование");
        ЦенаСтрокой  = Чтение.ЗначениеАтрибута("Цена");

        Попытка
            Ссылка = Справочники.Номенклатура.НайтиПоРеквизиту("Артикул", Артикул);
            Если Ссылка.Пустая() Тогда
                Объект = Справочники.Номенклатура.СоздатьЭлемент();
                Объект.Артикул = Артикул;
            Иначе
                Объект = Ссылка.ПолучитьОбъект();
            КонецЕсли;
            Объект.Наименование = Наименование;
            Объект.Записать();
            Загружено = Загружено + 1;
        Исключение
            Ошибок = Ошибок + 1;
            ЗаписьЖурналаРегистрации("ЗагрузкаТоваровXML",
                УровеньЖурналаРегистрации.Ошибка, , ,
                СтрШаблон("Артикул %1: %2", Артикул, ОписаниеОшибки()));
        КонецПопытки;

    КонецЦикла;

    Чтение.Закрыть();

    Сообщить(СтрШаблон("Загружено: %1, ошибок: %2",
        Формат(Загружено, "ЧН=0; ЧГ=0"), Формат(Ошибок, "ЧН=0; ЧГ=0")));

КонецПроцедуры

Что важно в этом примере:

  • 🔎 Поиск идёт по артикулу, поэтому повторная загрузка того же файла обновит элементы, а не создаст дубли.
  • 💰 Цена прочитана в ЦенаСтрокой, но в справочник не пишется: в типовых конфигурациях цены хранятся в регистре сведений и устанавливаются документом. Для цен создавайте и записывайте документ установки цен, а не правьте регистр напрямую.
  • 🧾 В Бухгалтерии и УТ у номенклатуры есть обязательные реквизиты (вид номенклатуры, единица измерения). Записать() их не проверяет, но пустые значения потом всплывут в документах. Заполняйте их значениями по умолчанию.
  • 🧱 Обработку держите внешней или в расширении конфигурации. Правка типовой конфигурации снимает её с поддержки и усложняет обновления.

Когда удобнее XDTO

Если к файлу есть XSD-схема (так бывает с форматами госорганов и крупных площадок), её можно импортировать в конфигуратор как пакет XDTO. Тогда файл читается целиком в объект: ФабрикаXDTO.ПрочитатьXML(Чтение, Тип), и к данным обращаются через точку, как к свойствам. Для больших файлов (сотни мегабайт) потоковое ЧтениеXML надёжнее: XDTO держит всё дерево в памяти.

Ошибки при импорте XML и где искать причину

Сначала смотрите сообщения обработки и протокол, затем журнал регистрации: Администрирование → Обслуживание → Журнал регистрации, отбор по уровню «Ошибка» и по времени загрузки.

Диагностика: выберите симптом

В своей обработке пишите в журнал регистрации не только ошибки, но и итог: сколько прочитано, сколько создано и обновлено. Через месяц на вопрос «почему не загрузился заказ» ответит журнал, а не память программиста.

Автоматическая загрузка XML по расписанию

Когда файл приходит каждый день (выгрузка с сайта, остатки поставщика), руками его не грузят. Есть три рабочих варианта.

Синхронизация данных

Для обмена через EnterpriseData расписание задаётся прямо в настройке синхронизации в разделе Администрирование → Синхронизация данных. Включается сценарий синхронизации, указываются дни и интервал. Это самый простой путь, если обе стороны — типовые конфигурации.

Регламентное задание в расширении

Для своего формата код загрузки кладут в расширение конфигурации и создают регламентное задание. В клиент-серверной базе задания выполняет сервер 1С по расписанию. Файловая база выполняет регламентные задания только при открытом сеансе, поэтому там этот вариант ненадёжен.

Каталог с файлами должен быть доступен учётной записи, под которой работает служба сервера 1С. Обработанный файл переносите в подпапку архива, чтобы не загрузить его повторно.

Запуск из планировщика Windows

Для файловой базы подходит запуск 1С с параметром /Execute, который открывает внешнюю обработку сразу после входа:

"C:\Program Files\1cv8\8.3.xx.xxxx\bin\1cv8.exe" ENTERPRISE /F"D:\Bases\Torg" /N"Обмен" /P"пароль" /Execute"D:\Obmen\ZagruzkaXML.epf" /DisableStartupMessages

Обработка в обработчике ПриОткрытии выполняет загрузку и завершает работу через ЗавершитьРаботуСистемы(Ложь). Задачу создают в планировщике Windows на ночное время.

Для такого запуска заведите отдельного пользователя 1С с минимально нужными правами. Пароль в командной строке виден всем, у кого есть доступ к планировщику. Каждый запуск занимает лицензию на время работы.

Перед включением автозагрузки
Выполнено: 0 / 6

Частые вопросы

Можно ли загрузить в 1С XML-выписку из банка?
Нет, банковский обмен идёт в текстовом формате 1CClientBankExchange (файл kl_to_1c.txt), а не в XML. Его загружают через обработку обмена с банком в разделе «Банк и касса».
Почему универсальный обмен не просит файл правил при загрузке?
При выгрузке правила сохраняются внутрь файла обмена. Отдельный файл правил нужен только если выгрузку делали без них.
Можно ли открыть XML-файл в 1С для просмотра?
Можно через Файл → Открыть: платформа покажет его как текстовый документ. Для просмотра структуры удобнее браузер или Notepad++ с подсветкой тегов.
Подойдёт ли универсальный обмен для файла с сайта на Битриксе?
Нет. Для обмена с сайтом используется формат CommerceML и отдельная настройка обмена с сайтом в конфигурации. Универсальная обработка понимает только файлы, выгруженные по правилам Конвертации данных.
Сколько времени займёт загрузка 50 000 документов?
Зависит от сервера и правил: от десятков минут до нескольких часов. Сначала загрузите один месяц, засеките время и умножьте на число месяцев.