Загрузка данных из XML-файла в 1С 8.3

· 9 мин

Содержание

Загрузить XML в 1С 8.3 можно тремя путями: типовым механизмом «Выгрузка и загрузка данных XML» (когда данные выгружены из другой базы 1С), универсальной обработкой под конкретную структуру файла и чтением встроенным языком через ЧтениеXML или сериализатор XDTO. Выбор зависит от того, кто сформировал файл и что в нём лежит.

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

Чтобы не читать всю статью ради выбора, вот короткая сводка — какой способ под какой файл:

Откуда файлСпособИнструмент
Выгружен из другой базы 1С, конфигурации совпадаютТиповой обменОбработка «Выгрузка и загрузка данных XML»
Из 1С, но конфигурации разныеКонвертация данныхПравила КД 2.0 / 3.0
От поставщика, оператора, госоргана (внешний формат)Универсальная обработкаЗагрузчик с сопоставлением полей
Уникальный формат, сложная логика, большой объёмПрограммное чтениеЧтениеXML, сериализатор XDTO

Дальше каждый способ разобран по шагам. Если не уверены, что внутри файла, сначала загляните в него — об этом следующий раздел.

Проверка файла перед загрузкой

Прежде чем что-то грузить, откройте XML в текстовом редакторе (Notepad++, VS Code) и посмотрите первые строки. Они говорят о формате больше, чем расширение.

На что смотреть:

  • 📄 Первая строка — объявление <?xml version="1.0" encoding="UTF-8"?>. Запомните кодировку: UTF-8, windows-1251 или другую. Несовпадение кодировки — причина «кракозябр» при загрузке.
  • 🏷️ Корневой элемент. Если видите <v8:Data> или ссылки на пространства имён http://v8.1c.ru, файл сформирован самой 1С — подойдёт типовой обмен. Если корень произвольный (<Документ>, <Order>, <ДекларацияПоАлкоголю>), это внешний формат — нужен разбор вручную.
  • 📐 Схема. К файлу может прилагаться .xsd — описание структуры. По нему удобно понять, какие поля обязательны.

Проверьте файл на «читаемость»: браузер (Chrome, Firefox) открывает корректный XML с деревом элементов. Если браузер ругается на разметку — файл битый, грузить его бессмысленно, сначала чините источник.

Если к файлу приложена схема .xsd, не пренебрегайте ею. Схема перечисляет, какие элементы обязательны, какого они типа и в каком порядке идут. Сверив файл со схемой до загрузки, вы заранее увидите, что поставщик, к примеру, не заполнил обязательный ИНН или прислал дату в неожиданном формате — такие вещи иначе всплывают только в середине загрузки большого файла.

Перед любой загрузкой в рабочую базу сделайте резервную копию через Администрирование → Резервное копирование и восстановление. Загрузка данных меняет базу необратимо, а откатить выборочно импорт нельзя.

Способ 1. Типовой обмен данными XML между базами 1С

Этот способ работает, только если XML выгружен из другой базы 1С стандартной обработкой. Формат внутри — сериализованные объекты платформы, человеку он нечитаем, но между однотипными конфигурациями переносится один в один.

Понадобится внешняя обработка «Выгрузка и загрузка данных XML» (файл вида ВыгрузкаЗагрузкаДанныхXML.epf). Она входит в комплект поставки типовых конфигураций и лежит в каталоге шаблонов 1С либо скачивается с портала поддержки.

Порядок действий:

  1. Откройте обработку: Файл → Открыть и выберите .epf.
  2. Перейдите на закладку «Загрузка».
  3. Укажите путь к XML-файлу.
  4. Нажмите «Загрузить данные».

Обработка сама разбирает объекты и дописывает их в базу. Главное условие — структура метаданных источника и приёмника должна совпадать. Если в базе-источнике был реквизит, которого нет в приёмнике, объект не загрузится или загрузится частично.

Когда способ не подходит:

  • файл сформирован не 1С;
  • версии конфигураций сильно различаются (например, перенос между БП 2.0 и БП 3.0 так не делается — для этого есть отдельные правила конвертации);
  • нужно не просто перенести, а сопоставить данные с существующими.

Для сложных переносов между разными конфигурациями используют «Конвертацию данных» (правила в формате КД 2.0 или 3.0) — это отдельный инструмент, где обмен описывается правилами сопоставления объектов.

Способ 2. Универсальная обработка загрузки из файла

Когда XML пришёл со стороны — от поставщика, оператора, учётной системы — его структура произвольна. Тут нужна обработка, которая умеет разбирать внешний XML и раскладывать значения по реквизитам документов и справочников.

Варианты:

  • Отраслевые и готовые обработки. Для частых форматов (прайс-листы поставщиков, выписки, данные ЕГАИС/маркировки) обычно есть готовое решение — оно знает конкретную структуру и настраивается галочками.
  • Настраиваемые загрузчики вида «Загрузка данных из внешнего файла». Вы указываете файл, а в форме сопоставляете элементы XML с полями объекта 1С.

Ключевой момент настройки — сопоставление полей: какому элементу XML соответствует какой реквизит справочника или документа. Ошибётесь на этом шаге — данные приедут не в те колонки.

Сопоставление полей
Элемент XML <Контрагент><ИНН>→Справочник «Контрагенты», реквизит ИНН
Элемент XML <Товар><Артикул>→Справочник «Номенклатура», реквизит Артикул
Атрибут Цена→Регистр сведений «Цены номенклатуры»
Элемент <Количество>→Табличная часть «Товары», колонка Количество

Проверяйте, как обработка ведёт себя с дублями. Одни загрузчики создают новый элемент на каждую строку, другие ищут существующий по ИНН или артикулу и обновляют его. При неверной настройке справочник распухает дублями.

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

Способ 3. Чтение XML встроенным языком 1С

Когда формат уникальный, а объёмы и логика сложные, XML читают кодом. Два основных инструмента платформы: объект ЧтениеXML для последовательного разбора и сериализатор XDTO — когда файл всё-таки выгружен из 1С.

Если файл — сериализованный объект 1С, его разбирает сериализатор XDTO в несколько строк:

Чтение = Новый ЧтениеXML;
Чтение.ОткрытьФайл("C:\Обмен\data.xml");
Если СериализаторXDTO.ВозможностьЧтенияXML(Чтение) Тогда
    Объект = СериализаторXDTO.ПрочитатьXML(Чтение);
КонецЕсли;
Чтение.Закрыть();

Если формат произвольный, разбирайте поток узел за узлом. ЧтениеXML идёт по файлу последовательно и не держит весь документ в памяти:

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

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

        НаименованиеКонтрагента = "";
        ИНН = "";

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

        // здесь создаём или ищем элемент справочника
    КонецЕсли;
КонецЦикла;

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

Этот шаблон читает блоки <Контрагент> и достаёт из них наименование и ИНН. Дальше вы сами решаете, создать новый элемент справочника или найти существующий по ИНН.

Для документов и справочников создавайте объекты не в цикле чтения, а отдельным проходом по накопленным данным. Так проще откатить загрузку, если на середине файла встретится ошибка.

Если нужен произвольный доступ к элементам (прыгать по дереву, а не читать подряд), есть ПостроительDOM — он строит дерево в памяти. Но для больших файлов это дорого по памяти, о чём ниже.

Контроль данных и запись в журнал регистрации

Загрузка без проверки входных данных рано или поздно занесёт в базу мусор: пустые ИНН, отрицательные количества, даты из будущего. Контроль ставьте до записи объекта.

Минимальный набор проверок:

  • обязательные поля заполнены (наименование, код, ИНН);
  • числовые значения в допустимых границах;
  • ссылки на другие объекты разрешаются (нашёлся контрагент, номенклатура);
  • строка влезает в длину реквизита.

Всё, что не прошло контроль, пишите в журнал регистрации — его потом читают через Администрирование → Журнал регистрации. Так вы увидите, какие строки файла не загрузились и почему.

Контроль ставьте до записи, а не после. Записанный объект уже в базе: чтобы его убрать, придётся помечать на удаление и пересчитывать итоги. Проверка на входе дешевле отката. Если по одной записи возможны несколько проблем, собирайте все в одно сообщение — тогда пользователь поправит источник за один заход, а не будет гонять загрузку по кругу, вылавливая ошибки поштучно.

Попытка
    Объект.Записать();
Исключение
    ЗаписьЖурналаРегистрации(
        "Загрузка XML",
        УровеньЖурналаРегистрации.Ошибка,
        ,
        ,
        "Строка " + Строка(НомерСтроки) + ": "
            + ОписаниеОшибки());
КонецПопытки;

Параллельно ведите счётчик: загружено, пропущено, ошибок. В конце выведите пользователю итог одним сообщением, а не сотней всплывающих строк — иначе отчёт о загрузке невозможно прочитать.

Не глушите исключения пустым блоком Исключение КонецПопытки;. Молча проглоченная ошибка — это потерянные данные, о которых никто не узнает, пока не начнут сверять остатки.

Загрузка больших XML-файлов без переполнения памяти

Файл на сотни мегабайт нельзя грузить в память целиком. Если прочитать такой XML через DOM или собрать все объекты в один массив, сеанс упрётся в лимит памяти и 1С аварийно завершится.

Правила для больших объёмов:

  • Читайте потоком. Используйте ЧтениеXML (последовательный разбор), а не ПостроительDOM. Поток держит в памяти один узел, а не весь файл.
  • Пишите порциями. Накопили, например, 1000 объектов — записали, очистили массив, продолжаете. Так память не растёт линейно с размером файла.
  • Отключите лишнее на время загрузки. Проведение документов, оповещение об изменении, автоматические пересчёты сильно тормозят массовый импорт.
  • Грузите в монопольном режиме или ночью. Массовая запись конфликтует с работой пользователей по блокировкам.

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

Чек-лист перед запуском загрузки
Выполнено: 0 / 6

Ошибки загрузки: симптом и причина

Разбор XML падает по узнаваемым причинам. Ниже — не повтор шагов, а привязка конкретного сообщения к тому, что чинить.

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

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

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

Чем отличается загрузка XML от загрузки из Excel?
Excel (.xlsx) и CSV грузят обработкой «Загрузка данных из табличного документа» — это таблица «строки × колонки». XML — это дерево с вложенностью, у него другие инструменты: типовой обмен, сопоставление полей или чтение кодом.
Почему после загрузки в тексте «кракозябры»?
Не совпала кодировка. Посмотрите в объявлении <?xml ... encoding="..."?>, в какой кодировке файл, и читайте его в той же. Чаще всего путаница между UTF-8 и windows-1251.
Можно ли загрузить XML от другой конфигурации 1С напрямую?
Нет, если структуры метаданных различаются. Типовой обмен переносит данные только между одинаковыми (или очень близкими) конфигурациями. Для разных нужны правила конвертации (КД 2.0/3.0).
XML загрузился, но документы не проведены — почему?
Многие загрузчики пишут документы без проведения, чтобы не ломать последовательность. Проведите их отдельно пакетной обработкой после проверки, а не в момент загрузки.
Как понять, какие строки файла не загрузились?
Ведите запись ошибок в журнал регистрации с номером строки или идентификатором объекта. После загрузки откройте Администрирование → Журнал регистрации и отфильтруйте по своему событию.