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

· 10 мин

Содержание

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

Типичная ситуация: поставщик прислал прайс в XML, а коллега из соседней фирмы — файл выгрузки справочников. Оба файла «XML», но открываются в 1С по-разному, и путь выбирают по происхождению файла.

Какой способ открыть XML в 1С выбрать

Сначала определите, кто и чем создал файл. От этого зависит всё остальное.

Откуда файлЧем открыватьНужен программист
Выгружен из 1С той же конфигурации обработкой «Выгрузка и загрузка данных XML»Та же обработка, вкладка загрузкиНет
Выгружен по правилам обмена (файл правил из «Конвертации данных»)Обработка «Универсальный обмен данными в формате XML»Нет, если правила готовы
Электронный документ (УПД, акт, счёт-фактура в формате ФНС)Механизм ЭДО конфигурацииНет
Прайс, выгрузка с сайта, файл из другой программыСвоя обработка на ЧтениеXML / DOM / XDTOДа, или 1С-ник с базовыми навыками
Что у вас за XML-файл?

Как посмотреть содержимое XML-файла перед загрузкой

Прежде чем грузить что-то в рабочую базу, загляните внутрь файла. Это две минуты, которые сразу отвечают на три вопроса: какая кодировка, какие теги, сколько записей.

Чем открыть

  • 🌐 Браузер (Chrome, Firefox, Edge) — перетащите файл в окно. Покажет дерево тегов, а при ошибке структуры — строку, где сломалось.
  • 📝 Notepad++ с плагином XML Tools — подсветка, команда форматирования (Pretty print) и проверка синтаксиса. Плагин ставится через Плагины → Управление плагинами.
  • 💻 VS Code — подсветка и сворачивание узлов из коробки, для проверки по схеме есть расширения.
  • 📄 Блокнот Windows — подойдёт для маленького файла, но файл в одну строку на 50 МБ он покажет плохо.

Что смотреть в первую очередь

  1. Первую строку — объявление <?xml version="1.0" encoding="UTF-8"?>. Значение encoding подскажет, в какой кодировке файл.
  2. Корневой тег — по нему видно, откуда файл. У выгрузки универсальной обработки корень V8Exp:Data, у файлов по правилам обмена — ФайлОбмена, у электронных документов ФНС — Файл.
  3. Повторяющийся элемент — Товар, Строка, Позиция. Именно его вы будете перебирать в цикле.
  4. Где лежат значения: в атрибутах (<Товар Артикул="A-101">) или во вложенных тегах (<Цена>450.00</Цена>). От этого зависит код.

Если файл весит сотни мегабайт, не открывайте его в браузере целиком — повиснет. Возьмите Notepad++ или VS Code, они читают большие файлы заметно легче.

Загрузка XML в 1С через обработку «Выгрузка и загрузка данных XML»

Это универсальная внешняя обработка от фирмы 1С. Её распространяют для пользователей с подпиской ИТС, файл обычно называется ВыгрузкаЗагрузкаДанныхXML83.epf. Она переносит справочники, документы и регистры между базами одинаковой конфигурации.

Шаг 1. Откройте обработку

  1. Запустите 1С в режиме «1С:Предприятие» под пользователем с полными правами.
  2. Откройте главное меню (кнопка с тремя полосками слева вверху) → Файл → Открыть, или нажмите Ctrl+O.
  3. Выберите файл .epf.
  4. Если появится предупреждение безопасности о внешнем файле — подтвердите открытие. Без права на интерактивное открытие внешних обработок команда будет недоступна: попросите администратора базы.

Шаг 2. Загрузите файл

  1. Перейдите на вкладку Загрузка.
  2. В поле имени файла выберите ваш XML.
  3. Нажмите кнопку загрузки данных и дождитесь сообщения о завершении.

Что важно знать до загрузки

Сделайте резервную копию базы перед загрузкой. Обработка записывает объекты в режиме обмена данными: многие проверки заполнения не срабатывают, а совпавшие по ссылке объекты перезаписываются. Откатить такую загрузку кнопкой «Отмена» нельзя.

  • 🔁 Ссылки сохраняются. Если в приёмнике уже есть объект с той же внутренней ссылкой, он будет перезаписан, а не задвоен.
  • 🧩 Разные релизы одной конфигурации — риск. Реквизиты, которых нет в приёмнике, при загрузке потеряются или вызовут ошибку.
  • 🚫 Между разными конфигурациями (например, из УТ в Бухгалтерию) эта обработка не подходит. Там нужен обмен по правилам и обработка «Универсальный обмен данными в формате XML» (V8Exchan83.epf).

Чтение XML-файла средствами встроенного языка 1С

Если файл пришёл не из 1С, готовой кнопки нет. Нужна внешняя обработка, которая разберёт файл. Во встроенном языке 1С 8.3 для этого три инструмента.

ИнструментКак работаетКогда брать
ЧтениеXMLПотоковое чтение узел за узломБольшие файлы, простая плоская структура
ПостроительDOMСтроит дерево всего документа в памятиСредние файлы, нужен поиск по имени элемента
ФабрикаXDTO.ПрочитатьXMLПревращает XML в объект с полямиЕсть XSD-схема или структура стабильна

Пример файла, на котором показан код ниже:

<?xml version="1.0" encoding="UTF-8"?>
<Прайс Дата="2026-10-07">
  <Товар Артикул="A-101">
    <Наименование>Бумага А4, 500 л.</Наименование>
    <Цена>450.00</Цена>
  </Товар>
  <Товар Артикул="A-102">
    <Наименование>Скрепки 28 мм</Наименование>
    <Цена>35.50</Цена>
  </Товар>
</Прайс>

Передача файла с компьютера на сервер

В клиент-серверной базе и в веб-клиенте сервер не видит диск пользователя. Файл сначала помещают во временное хранилище, а на сервере сохраняют во временный файл.

&НаКлиенте
Процедура ЗагрузитьФайл(Команда)
    Оповещение = Новый ОписаниеОповещения("ПослеПомещенияФайла", ЭтотОбъект);
    НачатьПомещениеФайла(Оповещение, , , Истина, УникальныйИдентификатор);
КонецПроцедуры

&НаКлиенте
Процедура ПослеПомещенияФайла(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
    Если Результат Тогда
        ЗагрузитьНаСервере(Адрес);
    КонецЕсли;
КонецПроцедуры

Потоковое чтение через ЧтениеXML

&НаСервере
Процедура ЗагрузитьНаСервере(Адрес)

    ИмяФайла = ПолучитьИмяВременногоФайла("xml");
    ПолучитьИзВременногоХранилища(Адрес).Записать(ИмяФайла);

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

    Товары = Новый ТаблицаЗначений;
    Товары.Колонки.Добавить("Артикул");
    Товары.Колонки.Добавить("Наименование");
    Товары.Колонки.Добавить("Цена");

    ТекущийТовар = Неопределено;
    ТекущийТег = "";

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

    Чтение.Закрыть();
    УдалитьФайлы(ИмяФайла);

    СоздатьНоменклатуру(Товары);

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

После цикла в таблице Товары две строки: A-101 за 450 и A-102 за 35,5. Функция XMLЗначение переводит строку "35.50" в число корректно, потому что в XML разделитель дробной части — точка.

Чтение через DOM

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

Чтение = Новый ЧтениеXML;
Чтение.ОткрытьФайл(ИмяФайла);
Построитель = Новый ПостроительDOM;
Документ = Построитель.Прочитать(Чтение);
Чтение.Закрыть();

Для Каждого Узел Из Документ.ПолучитьЭлементыПоИмени("Товар") Цикл
    Артикул = Узел.ПолучитьАтрибут("Артикул");
    Наименование = Узел.ПолучитьЭлементыПоИмени("Наименование").Элемент(0).ТекстовоеСодержимое;
    Цена = XMLЗначение(Тип("Число"), Узел.ПолучитьЭлементыПоИмени("Цена").Элемент(0).ТекстовоеСодержимое);
КонецЦикла;

Через XDTO

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

Создание справочников и документов из данных XML

Прочитать файл — полдела. Дальше данные нужно превратить в объекты базы и не наплодить дублей.

Правило поиска: сначала найти, потом создать

Решите заранее, по какому полю сопоставлять: артикул, ИНН, код или GUID из файла. Наименование — плохой ключ: «Бумага А4» и «Бумага A4» с латинской буквой — это два разных товара.

&НаСервере
Процедура СоздатьНоменклатуру(Товары)

    НачатьТранзакцию();
    Попытка
        Для Каждого Строка Из Товары Цикл
            Ссылка = Справочники.Номенклатура.НайтиПоРеквизиту("Артикул", Строка.Артикул);
            Если Ссылка.Пустая() Тогда
                Объект = Справочники.Номенклатура.СоздатьЭлемент();
                Объект.Артикул = Строка.Артикул;
            Иначе
                Объект = Ссылка.ПолучитьОбъект();
            КонецЕсли;
            Объект.Наименование = Строка.Наименование;
            Объект.Записать();
        КонецЦикла;
        ЗафиксироватьТранзакцию();
    Исключение
        ОтменитьТранзакцию();
        ВызватьИсключение;
    КонецПопытки;

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

Что учесть при создании объектов

  • ✅ Обязательные реквизиты. Метод Записать() не запускает проверку заполнения, как при интерактивной записи. Элемент номенклатуры без вида номенклатуры и единицы измерения запишется, но в документах вызовет вопросы. Заполняйте такие реквизиты явно.
  • 💰 Цены не хранятся в карточке товара. В типовых конфигурациях их устанавливают отдельным документом установки цен, поэтому значение из тега Цена пишите туда, а не в справочник.
  • 📄 Документы создают через Документы.<Имя>.СоздатьДокумент(), заполняют шапку и табличную часть и записывают с режимом проведения, например Объект.Записать(РежимЗаписиДокумента.Проведение). Если проведение упадёт, исключение попадёт в Попытку, и транзакция откатится целиком.
  • 🧪 Тест на копии. Первый прогон делайте на копии базы. Ошибка в сопоставлении по ключу превращает 300 строк прайса в 300 новых карточек.

Ошибки разбора XML и проверка структуры файла

Самая частая жалоба — сообщение, которое начинается со слов Ошибка разбора XML. В нём после текста ошибки указаны номер строки и колонки в квадратных скобках. Откройте файл в Notepad++ или VS Code и перейдите на эту строку: причина почти всегда видна глазами.

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

Как проверить структуру до загрузки

  1. Синтаксис. В Notepad++ с XML Tools есть команда проверки синтаксиса. Она покажет первую ошибку с номером строки.
  2. Соответствие схеме. Если отправитель дал XSD-схему, проверьте файл по ней в том же плагине. Это ловит пропущенные обязательные теги, которые синтаксически корректны.
  3. В коде. Оберните чтение в Попытка ... Исключение, а в обработчике выводите ОписаниеОшибки() пользователю. Так бухгалтер увидит номер строки, а не «программа упала».
Попытка
    Документ = Построитель.Прочитать(Чтение);
Исключение
    Сообщить("Файл не прочитан: " + ОписаниеОшибки());
    Возврат;
КонецПопытки;

Пространства имён — частая причина «пустой» загрузки. Если у тегов есть префикс (<ns:Товар>), то Чтение.Имя вернёт имя с префиксом, а для сравнения без префикса используйте свойство ЛокальноеИмя.

Кодировка и спецсимволы в XML-файле для 1С

Вместо русских букв «кракозябры» или ошибка на первой же кириллице — признак проблемы с кодировкой.

Кодировки

  • 🔤 ЧтениеXML определяет кодировку по объявлению encoding в первой строке. Если там написано UTF-8, а файл сохранён в windows-1251, разбор упадёт на первой русской букве.
  • 🛠 Исправление: откройте файл в Notepad++, посмотрите реальную кодировку в строке состояния внизу и либо поправьте encoding в первой строке, либо перекодируйте файл через меню Кодировки.
  • 🧷 Метка BOM в начале UTF-8 файла для ЧтениеXML не мешает. А вот при чтении файла как текста через ЧтениеТекста она может попасть в первую строку лишним символом.

Спецсимволы

В значениях тегов пять символов нельзя писать как есть. Их заменяют сущностями:

СимволКак записать в XML
&&amp;
<&lt;
>&gt;
"&quot;
'&apos;

При чтении 1С сама превращает сущности обратно: из ООО &quot;Ромашка&quot; в реквизит попадёт ООО "Ромашка". Отдельно ничего декодировать не надо.

Отдельная беда — невидимые управляющие символы (коды 1–31, кроме табуляции и переводов строки). Они попадают в наименования при копировании из Excel или PDF. В XML 1.0 они запрещены, и разбор останавливается. Найти их помогает поиск в Notepad++ в режиме регулярных выражений по шаблону [\x01-\x08\x0B\x0C\x0E-\x1F].

Правьте файл вручную только в копии. Если исправлений много, надёжнее попросить отправителя переделать выгрузку: ручные правки в XML на 10 000 строк легко ломают структуру.

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

Можно ли открыть XML в 1С без программиста?
Да, если файл выгружен из такой же конфигурации или по готовым правилам обмена, либо это электронный документ ЭДО. Произвольный файл из другой программы без обработки не загрузить.
Почему обработка не открывается через Файл → Открыть?
У пользователя нет права на интерактивное открытие внешних обработок, или его запретили настройки безопасности. Откройте под администратором либо подключите обработку как дополнительную.
Как загрузить XML в базу 1С:Фреш или другую облачную базу?
Внешние обработки в облаке обычно запускают только после проверки и подключения как дополнительных. Узнайте порядок у провайдера сервиса.
Можно ли загрузить XML из 1С 7.7 в 1С 8.3?
Не напрямую обработкой выгрузки-загрузки. Перенос идёт через обработки переноса данных с правилами конвертации для конкретной пары конфигураций.
Как выгрузить данные из 1С в XML?
Той же обработкой «Выгрузка и загрузка данных XML», на вкладке выгрузки, или кодом через объект ЗаписьXML.