Загрузка данных из XML-файла в 1С 8.3
Содержание
Загрузить 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С либо скачивается с портала поддержки.
Порядок действий:
- Откройте обработку:
Файл → Открытьи выберите.epf. - Перейдите на закладку «Загрузка».
- Укажите путь к XML-файлу.
- Нажмите «Загрузить данные».
Обработка сама разбирает объекты и дописывает их в базу. Главное условие — структура метаданных источника и приёмника должна совпадать. Если в базе-источнике был реквизит, которого нет в приёмнике, объект не загрузится или загрузится частично.
Когда способ не подходит:
- файл сформирован не 1С;
- версии конфигураций сильно различаются (например, перенос между БП 2.0 и БП 3.0 так не делается — для этого есть отдельные правила конвертации);
- нужно не просто перенести, а сопоставить данные с существующими.
Для сложных переносов между разными конфигурациями используют «Конвертацию данных» (правила в формате КД 2.0 или 3.0) — это отдельный инструмент, где обмен описывается правилами сопоставления объектов.
Способ 2. Универсальная обработка загрузки из файла
Когда XML пришёл со стороны — от поставщика, оператора, учётной системы — его структура произвольна. Тут нужна обработка, которая умеет разбирать внешний XML и раскладывать значения по реквизитам документов и справочников.
Варианты:
- Отраслевые и готовые обработки. Для частых форматов (прайс-листы поставщиков, выписки, данные ЕГАИС/маркировки) обычно есть готовое решение — оно знает конкретную структуру и настраивается галочками.
- Настраиваемые загрузчики вида «Загрузка данных из внешнего файла». Вы указываете файл, а в форме сопоставляете элементы XML с полями объекта 1С.
Ключевой момент настройки — сопоставление полей: какому элементу 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 объектов — записали, очистили массив, продолжаете. Так память не растёт линейно с размером файла.
- Отключите лишнее на время загрузки. Проведение документов, оповещение об изменении, автоматические пересчёты сильно тормозят массовый импорт.
- Грузите в монопольном режиме или ночью. Массовая запись конфликтует с работой пользователей по блокировкам.
Если файл приходит регулярно и большой, вынесите загрузку в фоновое задание. Пользователь запускает его и не ждёт у зависшего окна, а результат смотрит в журнале регистрации.
Ошибки загрузки: симптом и причина
Разбор XML падает по узнаваемым причинам. Ниже — не повтор шагов, а привязка конкретного сообщения к тому, что чинить.
<?xml?>. Откройте файл в редакторе, который показывает кодировку, и пересохраните без BOM. Либо источник отдал не XML, а HTML-страницу с ошибкой — проверьте первые строки.encoding="...".ЧтениеXML и запись порциями.Если один и тот же файл загрузили дважды, не удаляйте дубли вручную по списку — так легко снести оригиналы. Сначала найдите задвоенные объекты отбором по дате загрузки или по пустому признаку, проверьте движения документов и только потом удаляйте через помеченные на удаление с контролем ссылок.
Частые вопросы
Чем отличается загрузка XML от загрузки из Excel?
.xlsx) и CSV грузят обработкой «Загрузка данных из табличного документа» — это таблица «строки × колонки». XML — это дерево с вложенностью, у него другие инструменты: типовой обмен, сопоставление полей или чтение кодом.Почему после загрузки в тексте «кракозябры»?
<?xml ... encoding="..."?>, в какой кодировке файл, и читайте его в той же. Чаще всего путаница между UTF-8 и windows-1251.Можно ли загрузить XML от другой конфигурации 1С напрямую?
XML загрузился, но документы не проведены — почему?
Как понять, какие строки файла не загрузились?
Администрирование → Журнал регистрации и отфильтруйте по своему событию.