Загрузка XML в 1С Предприятие: какой способ выбрать и как не потерять данные
Содержание
Загрузить XML в 1С можно четырьмя путями, и выбор зависит от одного: кто создал файл. Если выгрузила другая база 1С или банк, нужен штатный механизм загрузки внутри программы. Если файл собрал сторонний сервис или вы сами, без обработки или кода не обойтись.
Начните с вопроса «откуда файл». От этого зависит и то, будет ли вообще загрузка в 1С Предприятие 8.3 работать без доработок, и сколько времени вы потратите. Ниже — как это определить, как подготовить файл и что делать, когда загрузка падает.
Сначала определите, что за XML перед вами
XML — это не формат данных, а способ их записи. Внутри может лежать что угодно: документы другой базы, банковская выписка, электронный счёт-фактура, номенклатура поставщика. 1С понимает не любой XML, а только тот, структура которого ей известна.
Откройте файл в обычном текстовом редакторе (подойдёт Блокнот++, VS Code) и посмотрите на первые строки. Там почти всегда понятно, чей это файл.
| Что видно в начале файла | Что это | Чем загружать |
|---|---|---|
Теги вида <Файл>, <КонтейнерСообщения> или корень с пространством имён http://v8.1c.ru/... | Выгрузка из другой базы 1С | Штатный обмен данными |
Строки 1CClientBankExchange | Выписка банка (обычно это текстовый формат, не XML) | Загрузка банковской выписки |
Теги <Документ>, ИНН, КПП, номер и дата | Электронный документ по формату ФНС | ЭДО-модуль или обработка файла документа |
| Свой набор тегов, список товаров, цены | Выгрузка стороннего сервиса | Универсальная обработка или свой код |
Если не узнаёте ни одной строки — это четвёртый вариант, самый трудозатратный. К нему вернёмся в разделе про чтение через XDTO.
Проверка и подготовка файла до загрузки
Половина неудач — это испорченный файл, а не 1С. Потратьте три минуты на проверку.
- Кодировка. Объявлена в первой строке:
<?xml version="1.0" encoding="UTF-8"?>. Если тамwindows-1251, а сохранён файл в UTF-8 (или наоборот), русские буквы превратятся в «кракозябры» или загрузка оборвётся. - Закрытые теги. Каждый открытый тег должен быть закрыт. Откройте файл в браузере: он покажет дерево или укажет строку с ошибкой.
- Спецсимволы. Знаки
&,<и>в тексте должны быть записаны как&,<и>. Название контрагента «Ромашка & Ко» с голым амперсандом ломает весь файл. - Размер. Файл на сотни мегабайт читайте потоково, а не целиком в память. Для штатных обменов это не проблема, для самописного кода — важно.
- Копия базы. Загрузка меняет данные. Если файл идёт в рабочую базу, сначала сделайте копию.
Не правьте XML в «Блокноте» с сохранением в ANSI. Редактор молча перекодирует файл, и потом вы ищете причину ошибки не там. Сохраняйте в той кодировке, которая указана в первой строке файла.
Проверить корректность быстро можно и средствами 1С: чтение в ЧтениеXML (пример ниже) выдаст ошибку с номером строки и столбца.
Штатная загрузка: файл из другой базы 1С
Самый частый случай — вам прислали выгрузку документов или справочников из другой базы. Здесь работает механизм обмена данными, и файл загружать надо именно через него, а не «открывать» как таблицу.
Если обмен уже настроен
Перейдите в раздел Администрирование → Синхронизация данных (в программах на базе БСП он есть почти везде: Бухгалтерия, ЗУП, Управление торговлей). Найдите настроенную синхронизацию с нужной базой и выберите загрузку данных из файла. 1С прочитает сообщение обмена и покажет, что будет загружено, а при совпадении данных предложит разрешить конфликты.
Если обмена нет
Попросите отправителя выгрузить данные по правилам вашей конфигурации. Настройка обмена с файлом создаётся в том же разделе: вы указываете каталог для файла сообщения, а в другой базе настраиваете зеркальную сторону. Отдельно «подсунуть» файл в чужой формат не получится: у сообщений обмена есть служебная информация (узлы обмена, номера сообщений), и без неё 1С отклонит загрузку.
💡 Совет. Если файл выгружала не 1С, а какая-то программа «под 1С», спросите у разработчика, для какого обмена он сделан. Без этого вы не узнаете, какую обработку открывать.
Универсальная обработка обмена в формате XML
Для баз с типовыми конфигурациями существует внешняя обработка «Универсальный обмен данными в формате XML». Распространяется она с диском ИТС. Обработка читает файл выгрузки вместе с правилами конвертации и переносит объекты между базами.
Порядок такой:
- Откройте обработку командой
Файл → Открыть(в режиме 1С:Предприятие, а не в Конфигураторе). - Перейдите на вкладку загрузки данных и укажите имя файла.
- Выберите, как поступать при ошибках, и нажмите кнопку загрузки.
- Прочитайте протокол: он показывает, какие объекты не загрузились и почему.
Перед запуском на рабочей базе проверьте загрузку на копии. Универсальная обработка при несовпадении правил молча создаёт дубли справочников, а удалить сотню дублей вручную тяжелее, чем сделать копию.
Банковская выписка и электронные документы
Если нужно просто принять от банка движение по счёту, в XML вы файл не открываете. В программах для бухгалтерии есть раздел Банк и касса, а в нём — банковские выписки. В командной панели списка выписок находится загрузка из файла: вы указываете файл, а 1С создаёт поступления и списания и сопоставляет контрагентов по ИНН.
Электронные документы (счета-фактуры, акты, УПД) в формате ФНС тоже приходят XML-файлами, но обычно их принимает ЭДО-модуль через оператора, и файл вручную вы не загружаете. Если оператор не подключён, а файл у вас на руках, смотрите в карточке документа возможность загрузки из файла. Тут есть тонкость: подлинность подписи проверяется отдельным файлом подписи, поэтому XML без него годится лишь как данные.
Своя структура: чтение XML через XDTO и ЧтениеXML
Когда файл создала сторонняя система и штатного механизма для неё нет, остаётся писать обработку. В 1С есть два инструмента, и выбирать нужно по задаче.
| Метод | Когда подходит | Минусы |
|---|---|---|
ЧтениеXML (потоковое) | Большие файлы, простая структура, нужны отдельные поля | Больше кода, нужно следить за типом узла |
ФабрикаXDTO + схема | Есть схема (xsd), структура сложная и вложенная | Нужно подключить пакет XDTO, при расхождении со схемой падает |
ПостроительDOM | Нужно ходить по дереву туда-обратно | Весь файл целиком в памяти |
Потоковое чтение
Минимальный рабочий пример: пройти по файлу и вывести имена элементов и их текст. Для реальной задачи вы подставите свои теги.
Чтение = Новый ЧтениеXML;
Чтение.ОткрытьФайл("C:\Обмен\goods.xml");
ТекущееИмя = "";
Пока Чтение.Прочитать() Цикл
Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
ТекущееИмя = Чтение.Имя;
ИначеЕсли Чтение.ТипУзла = ТипУзлаXML.Текст Тогда
Сообщить(ТекущееИмя + " = " + Чтение.Значение);
КонецЕсли;
КонецЦикла;
Чтение.Закрыть();
Что здесь важно. Метод Прочитать() двигает указатель на следующий узел и возвращает Ложь в конце файла. Значение лежит в отдельном текстовом узле после начала элемента, поэтому имя нужно запоминать. Атрибуты элемента читают сразу после НачалоЭлемента, пока указатель не ушёл дальше.
Чтение через схему XDTO
Если у вас есть xsd, идея такая: вы подключаете схему как пакет XDTO, а затем читаете файл в готовый объект, у которого свойства называются так же, как теги.
Чтение = Новый ЧтениеXML;
Чтение.ОткрытьФайл("C:\Обмен\order.xml");
Объект = ФабрикаXDTO.ПрочитатьXML(Чтение);
Чтение.Закрыть();
Дальше вы обращаетесь к свойствам объекта и создаёте по ним документы или справочники. Если тег в файле не описан в схеме, чтение завершится ошибкой: схема работает как строгий контроль. Это удобно, когда формат жёсткий, и неудобно, когда отправитель «творит».
Не получается подобрать схему — читайте потоком. Он простит лишние теги, просто вы их не будете обрабатывать.
Куда складывать прочитанное
Не создавайте документы прямо в цикле чтения, пока не убедились, что файл целиком корректен. Лучше сначала собрать данные в таблицу значений, показать пользователю предпросмотр и только потом записывать. Так вы отсекаете половину ошибок: например, незаполненные ИНН или неизвестные единицы измерения.
Поиск существующих элементов делайте по коду, ИНН или артикулу, но не по наименованию. Наименование отправитель легко поменяет, и вы получите дубли.
Типичные ошибки при загрузке XML
Ошибки чаще повторяются, чем кажется. Смотрите на текст сообщения: в нём обычно уже есть подсказка.
- 🔸 Ошибка разбора XML с указанием строки и столбца. Файл повреждён или в нём неэкранированный спецсимвол. Откройте файл на этой строке в редакторе и найдите
&или оборванный тег. - 🔸 Русские буквы стали «кракозябрами». Кодировка в заголовке не совпадает с реальной. Пересохраните файл в нужной кодировке.
- 🔸 «Неверный формат файла» при штатной загрузке. Вы подсунули файл от другого типа обмена или от другой конфигурации. Выясните у отправителя, какой именно механизм использовался при выгрузке.
- 🔸 Тег не описан в схеме. Касается чтения через XDTO. Либо обновите схему, либо перейдите на потоковое чтение.
- 🔸 Загрузка прошла, но часть объектов пропала. Проверьте протокол. Обычно причина — не найден обязательный реквизит или элемент справочника не сопоставился.
- 🔸 Дубли контрагентов и номенклатуры. Сопоставление шло по наименованию. Настройте сопоставление по ИНН или коду и повторите загрузку на копии.
Если загрузку в рабочую базу нужно откатить, убедитесь, что есть копия: штатной кнопки «отменить всю загрузку» нет. Документы можно пометить на удаление, но справочные дубли придётся чистить отдельно.
Автоматизация: регулярная загрузка без участия человека
Если файл приходит каждый день (прайс поставщика, заказы интернет-магазина), ручная загрузка быстро надоедает. Есть три пути.
- Регламентное задание. В режиме 1С:Предприятие вы пишете обработку, которая берёт файл из каталога и грузит его. Затем запускаете её регламентным заданием по расписанию. Работает на файловом и серверном варианте, но пользователь не должен получать диалогов.
- Обмен через каталог. Отправитель кладёт файл в общую папку, а в 1С настроен штатный обмен, который сам забирает сообщение. Это самый чистый вариант, если обе стороны на 1С.
- Веб-сервис. Отправитель отправляет данные в сервис вашей базы, 1С разбирает их и записывает. Подходит для интеграций с сайтом, но требует публикации базы и прав доступа.
При автоматизации добавьте две вещи, без которых потом будет больно. Первая — журнал: что загрузили, что отклонили, сколько записей. Вторая — перенос обработанного файла в архивную папку, чтобы один и тот же файл не загрузился дважды.
Частые вопросы
Можно ли открыть XML в 1С как таблицу, как в Excel?
Подойдёт ли файл, выгруженный из 1С 8.2, для базы на 8.3?
Что делать, если XML весит сотни мегабайт?
ЧтениеXML и записывайте данные порциями. Загрузка целиком в ПостроительDOM займёт много памяти и может упасть.