XML-файл в 1С 8.3: просмотр, загрузка обработкой и чтение кодом
Содержание
Открыть XML
-файл в 1С 8.3 «двойным щелчком» нельзя: платформа не показывает его как документ. Есть три рабочих пути. Выгрузку из такой же базы загружают обработкой «Выгрузка и загрузка данных XML». Чужой XML (прайс, выгрузку с сайта, файл контрагента) сначала смотрят в текстовом редакторе, а затем читают кодом через ЧтениеXML или DOM.
Типичная ситуация: поставщик прислал прайс в XML, а коллега из соседней фирмы — файл выгрузки справочников. Оба файла «XML», но открываются в 1С по-разному, и путь выбирают по происхождению файла.
Какой способ открыть XML в 1С выбрать
Сначала определите, кто и чем создал файл. От этого зависит всё остальное.
| Откуда файл | Чем открывать | Нужен программист |
|---|---|---|
| Выгружен из 1С той же конфигурации обработкой «Выгрузка и загрузка данных XML» | Та же обработка, вкладка загрузки | Нет |
| Выгружен по правилам обмена (файл правил из «Конвертации данных») | Обработка «Универсальный обмен данными в формате XML» | Нет, если правила готовы |
| Электронный документ (УПД, акт, счёт-фактура в формате ФНС) | Механизм ЭДО конфигурации | Нет |
| Прайс, выгрузка с сайта, файл из другой программы | Своя обработка на ЧтениеXML / DOM / XDTO | Да, или 1С-ник с базовыми навыками |
Как посмотреть содержимое XML-файла перед загрузкой
Прежде чем грузить что-то в рабочую базу, загляните внутрь файла. Это две минуты, которые сразу отвечают на три вопроса: какая кодировка, какие теги, сколько записей.
Чем открыть
- 🌐 Браузер (Chrome, Firefox, Edge) — перетащите файл в окно. Покажет дерево тегов, а при ошибке структуры — строку, где сломалось.
- 📝 Notepad++ с плагином XML Tools — подсветка, команда форматирования (Pretty print) и проверка синтаксиса. Плагин ставится через
Плагины → Управление плагинами. - 💻 VS Code — подсветка и сворачивание узлов из коробки, для проверки по схеме есть расширения.
- 📄 Блокнот Windows — подойдёт для маленького файла, но файл в одну строку на 50 МБ он покажет плохо.
Что смотреть в первую очередь
- Первую строку — объявление
<?xml version="1.0" encoding="UTF-8"?>. Значениеencodingподскажет, в какой кодировке файл. - Корневой тег — по нему видно, откуда файл. У выгрузки универсальной обработки корень
V8Exp:Data, у файлов по правилам обмена —ФайлОбмена, у электронных документов ФНС —Файл. - Повторяющийся элемент —
Товар,Строка,Позиция. Именно его вы будете перебирать в цикле. - Где лежат значения: в атрибутах (
<Товар Артикул="A-101">) или во вложенных тегах (<Цена>450.00</Цена>). От этого зависит код.
Если файл весит сотни мегабайт, не открывайте его в браузере целиком — повиснет. Возьмите Notepad++ или VS Code, они читают большие файлы заметно легче.
Загрузка XML в 1С через обработку «Выгрузка и загрузка данных XML»
Это универсальная внешняя обработка от фирмы 1С. Её распространяют для пользователей с подпиской ИТС, файл обычно называется ВыгрузкаЗагрузкаДанныхXML83.epf. Она переносит справочники, документы и регистры между базами одинаковой конфигурации.
Шаг 1. Откройте обработку
- Запустите 1С в режиме «1С:Предприятие» под пользователем с полными правами.
- Откройте главное меню (кнопка с тремя полосками слева вверху) →
Файл → Открыть, или нажмитеCtrl+O. - Выберите файл
.epf. - Если появится предупреждение безопасности о внешнем файле — подтвердите открытие. Без права на интерактивное открытие внешних обработок команда будет недоступна: попросите администратора базы.
Шаг 2. Загрузите файл
- Перейдите на вкладку
Загрузка. - В поле имени файла выберите ваш XML.
- Нажмите кнопку загрузки данных и дождитесь сообщения о завершении.
Что важно знать до загрузки
Сделайте резервную копию базы перед загрузкой. Обработка записывает объекты в режиме обмена данными: многие проверки заполнения не срабатывают, а совпавшие по ссылке объекты перезаписываются. Откатить такую загрузку кнопкой «Отмена» нельзя.
- 🔁 Ссылки сохраняются. Если в приёмнике уже есть объект с той же внутренней ссылкой, он будет перезаписан, а не задвоен.
- 🧩 Разные релизы одной конфигурации — риск. Реквизиты, которых нет в приёмнике, при загрузке потеряются или вызовут ошибку.
- 🚫 Между разными конфигурациями (например, из УТ в Бухгалтерию) эта обработка не подходит. Там нужен обмен по правилам и обработка «Универсальный обмен данными в формате 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 и перейдите на эту строку: причина почти всегда видна глазами.
Как проверить структуру до загрузки
- Синтаксис. В Notepad++ с XML Tools есть команда проверки синтаксиса. Она покажет первую ошибку с номером строки.
- Соответствие схеме. Если отправитель дал XSD-схему, проверьте файл по ней в том же плагине. Это ловит пропущенные обязательные теги, которые синтаксически корректны.
- В коде. Оберните чтение в
Попытка ... Исключение, а в обработчике выводитеОписаниеОшибки()пользователю. Так бухгалтер увидит номер строки, а не «программа упала».
Попытка
Документ = Построитель.Прочитать(Чтение);
Исключение
Сообщить("Файл не прочитан: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
Пространства имён — частая причина «пустой» загрузки. Если у тегов есть префикс (<ns:Товар>), то Чтение.Имя вернёт имя с префиксом, а для сравнения без префикса используйте свойство ЛокальноеИмя.
Кодировка и спецсимволы в XML-файле для 1С
Вместо русских букв «кракозябры» или ошибка на первой же кириллице — признак проблемы с кодировкой.
Кодировки
- 🔤
ЧтениеXMLопределяет кодировку по объявлениюencodingв первой строке. Если там написаноUTF-8, а файл сохранён вwindows-1251, разбор упадёт на первой русской букве. - 🛠 Исправление: откройте файл в Notepad++, посмотрите реальную кодировку в строке состояния внизу и либо поправьте
encodingв первой строке, либо перекодируйте файл через менюКодировки. - 🧷 Метка BOM в начале UTF-8 файла для
ЧтениеXMLне мешает. А вот при чтении файла как текста черезЧтениеТекстаона может попасть в первую строку лишним символом.
Спецсимволы
В значениях тегов пять символов нельзя писать как есть. Их заменяют сущностями:
| Символ | Как записать в XML |
|---|---|
& | & |
< | < |
> | > |
" | " |
' | ' |
При чтении 1С сама превращает сущности обратно: из ООО "Ромашка" в реквизит попадёт ООО "Ромашка". Отдельно ничего декодировать не надо.
Отдельная беда — невидимые управляющие символы (коды 1–31, кроме табуляции и переводов строки). Они попадают в наименования при копировании из Excel или PDF. В XML 1.0 они запрещены, и разбор останавливается. Найти их помогает поиск в Notepad++ в режиме регулярных выражений по шаблону [\x01-\x08\x0B\x0C\x0E-\x1F].
Правьте файл вручную только в копии. Если исправлений много, надёжнее попросить отправителя переделать выгрузку: ручные правки в XML на 10 000 строк легко ломают структуру.