Загрузка XML-файла в 1С 8.3: от входящей УПД до своего кода
Содержание
Загрузить XML в 1С можно четырьмя путями, и выбор зависит от того, что лежит внутри файла. Электронную накладную или УПД от поставщика загружают из списка входящих документов. Сообщение обмена между базами — через Администрирование → Синхронизация данных. Выгрузку из другой конфигурации — обработкой «Универсальный обмен данными в формате XML» с файлом правил. Произвольный XML от сайта или внешней программы — своим кодом на объекте ЧтениеXML.
Универсальной кнопки «загрузить любой хмл-файл» в 1С нет. Платформа должна понимать, какой элемент файла превратить в какой справочник или документ. Эту связь задаёт либо формат (ФНС, EnterpriseData, формат обмена), либо правила, либо программист. Всё ниже относится к платформе 8.3 и типовым конфигурациям на БСП: Бухгалтерии 3.0, УТ 11, ЗУП 3.1.
1. Что внутри файла: подготовка и выбор способа загрузки XML
Откройте файл в любом текстовом редакторе, лучше с подсветкой XML: Notepad++, VS Code. Браузер тоже подойдёт, он покажет дерево элементов. Смотрите на три вещи.
- 🔎 Первая строка. Объявление вида
<?xml version="1.0" encoding="UTF-8"?>. Кодировка в нём должна совпадать с реальной кодировкой файла. - 🔎 Корневой элемент. По его имени понятно, откуда файл.
<Файл ... ВерсФорм="5.01">— электронный документ в формате ФНС.<ФайлОбмена ...>— выгрузка универсальным обменом.<Message>с пространством имёнEnterpriseData— сообщение синхронизации. - 🔎 Повторяющиеся блоки. Строки товаров, контрагенты, позиции прайса. Их количество — быстрая проверка, что файл выгружен целиком.
Дальше — таблица выбора:
| Что за файл | Способ загрузки | Нужен программист |
|---|---|---|
| УПД, ТОРГ-12, акт в формате ФНС | Загрузка электронного документа из файла в списке поступлений | Нет |
Сообщение Message_XX_YY.xml из другой базы | Синхронизация данных через каталог | Нет, если обмен настроен |
| Выгрузка из базы с той же конфигурацией | Обработка «Выгрузка и загрузка данных XML» | Нет |
| Выгрузка из другой конфигурации | Универсальный обмен + правила из «Конвертации данных» | Для правил — да |
| Прайс, заказы с сайта, файл банка-партнёра | Внешняя обработка или расширение на ЧтениеXML/XDTO | Да |
Выписка банка в формате 1CClientBankExchange — это не XML, а текстовый файл. Её загружают обработкой обмена с банком, а не способами из этой статьи.
Проверка корректности до загрузки
Файл, который не открывается в браузере как дерево, 1С тоже не прочитает. Браузер сразу покажет строку и позицию первой ошибки разметки. Это быстрее, чем ловить ту же ошибку в журнале загрузки.
Перед любой загрузкой в рабочую базу сделайте резервную копию. Загрузка создаёт и меняет объекты пачкой, и откатить её одной кнопкой нельзя.
2. Загрузка XML стандартными средствами 1С без программиста
Электронная УПД или накладная от поставщика
Поставщик прислал XML по почте, а не через оператора ЭДО. В Бухгалтерии 3.0 откройте Покупки → Поступление (акты, накладные, УПД). В командной панели списка есть подменю ЭДО, в нём — команда загрузки электронного документа из файла.
- Выберите команду загрузки и укажите XML-файл.
- Программа покажет содержимое документа: продавца, номенклатуру, суммы, НДС.
- Сопоставьте номенклатуру поставщика со своей. Сопоставление запоминается, и следующий файл от этого поставщика пройдёт быстрее.
- Если контрагента нет в базе, программа предложит создать его по ИНН и КПП из файла.
- Создайте документ поступления и проверьте суммы перед проведением.
Загружается только файл в утверждённом формате ФНС. Файл, который выгрузила чья-то самописная программа, этим способом не пройдёт.
Сообщение синхронизации из другой базы
Если обмен между базами настроен через общий каталог или почту, 1С сама кладёт и забирает файлы Message_XX_YY.xml (часто упакованные в zip). Вручную загружать их не нужно.
- Положите файл в каталог обмена, указанный в настройке.
- Откройте
Администрирование → Синхронизация данных → Настройки синхронизации данных. - Выделите нужную настройку и нажмите «Синхронизировать».
Загрузится только сообщение, адресованное этой базе. Префиксы в имени файла — это коды узлов «откуда» и «куда».
Перенос между базами одной конфигурации
Для переноса части справочников или документов между двумя базами с одинаковой конфигурацией подходит обработка «Выгрузка и загрузка данных XML» (файл ВыгрузкаЗагрузкаДанныхXML83.epf, распространяется на ИТС). В базе-источнике она выгружает выбранные объекты в XML, в базе-приёмнике загружает их обратно.
Конфигурации должны совпадать до реквизита. Если в приёмнике другой релиз или доработки, загрузка остановится на первом несовпадающем объекте или запишет данные не туда.
3. Правила обмена: как загрузить XML из другой конфигурации
Когда структура баз разная, например старая самописная конфигурация и Бухгалтерия 3.0, нужен посредник — правила обмена. Это тоже XML-файл. Его готовят в конфигурации «Конвертация данных » 2.x: описывают, какой объект источника во что превращается в приёмнике, по каким полям искать существующие элементы, что делать при отсутствии.
Порядок работы с универсальным обменом
- В базе-приёмнике включите команду «Все функции»:
Главное меню → Сервис → Параметры → Показывать команду «Все функции». - Откройте
Все функции → Обработки → Универсальный обмен данными в формате XML. В конфигурациях на БСП она встроена. Для старых конфигураций есть внешний файлУниверсальныйОбменДаннымиXML.epf. - В базе-источнике той же обработкой на вкладке выгрузки укажите файл правил и выгрузите данные. Получится
<ФайлОбмена>, в котором правила уже лежат внутри. - В приёмнике перейдите на вкладку загрузки, укажите файл данных и запустите загрузку.
- После загрузки откройте протокол обмена. В нём перечислены объекты, которые не удалось записать, и причины.
Как настроить правила, чтобы не наплодить дублей
- 🧩 Поля поиска. Для контрагентов ищите по ИНН и КПП, для номенклатуры — по артикулу или коду. Поиск по наименованию ломается на первом лишнем пробеле.
- 🧩 Режим записи документов. Загружайте документы без проведения. Проведите их потом отдельно, когда проверите остатки.
- 🧩 Пробный прогон. Первый раз загружайте в копию базы . Сравните количество элементов в файле и в приёмнике.
- 🧩 Версия правил. Правила пишут под конкретные релизы источника и приёмника. После обновления любой из баз их нужно проверить: переименованный реквизит молча оставит поле пустым.
Для типовых пар конфигураций (например, переход с Бухгалтерии 2.0 на 3.0) готовые правила уже встроены в механизм перехода. Писать свои не нужно.
4. Загрузка XML-файла через внешнюю обработку или расширение
Когда формат файла придумал не 1С, а сайт, маркетплейс или поставщик, загрузку пишет программист. Код можно оформить двумя способами.
| Способ | Когда выбирать | Особенности |
|---|---|---|
Внешняя обработка .epf | Разовая загрузка, тест формата | Не трогает конфигурацию, открывается из файла |
| Дополнительная обработка в БСП | Регулярная загрузка пользователями | Регистрируется в справочнике, можно повесить на расписание |
Расширение .cfe | Загрузка встроена в интерфейс, нужны новые реквизиты | Переживает обновления типовой, если не ломаются точки встраивания |
Как открыть и подключить обработку
- 📂 Разово:
Главное меню → Файл → Открыть, выберите.epf. Нужно право «Интерактивное открытие внешних обработок». - 📂 Постоянно: в Бухгалтерии 3.0 включите флажок в
Администрирование → Печатные формы, отчеты и обработки → Дополнительные отчеты и обработки, затем добавьте обработку в справочник. - 📂 Расширение: в Конфигураторе
Конфигурация → Расширения конфигурации, загрузите.cfe. Расширения работают на платформе с номером не ниже 8.3.6.
При открытии внешней обработки платформа предупреждает о возможной опасности. Это защита от опасных действий: открывайте только файлы из проверенного источника. Обработка из интернета получает те же права, что и ваш пользователь, и может изменить или удалить данные.
5. Программная загрузка XML в 1С через ЧтениеXML
Объект ЧтениеXML читает файл последовательно, узел за узлом. Он не держит весь документ в памяти, поэтому справляется и с файлами на сотни мегабайт.
Пример файла от поставщика:
<?xml version="1.0" encoding="UTF-8"?>
<Товары>
<Товар Артикул="A-101">
<Наименование>Бумага А4</Наименование>
<Цена>420.50</Цена>
<Количество>10</Количество>
</Товар>
<Товар Артикул="B-205">
<Наименование>Папка-регистратор</Наименование>
<Цена>185</Цена>
<Количество>24</Количество>
</Товар>
</Товары>
Серверная функция, которая читает его в таблицу значений:
Функция ПрочитатьТоварыИзXML(ИмяФайла)
Результат = Новый ТаблицаЗначений;
Результат.Колонки.Добавить("Артикул", Новый ОписаниеТипов("Строка"));
Результат.Колонки.Добавить("Наименование", Новый ОписаниеТипов("Строка"));
Результат.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число"));
Результат.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число"));
Чтение = Новый ЧтениеXML;
Чтение.ОткрытьФайл(ИмяФайла);
ТекущаяСтрока = Неопределено;
ТекущееПоле = "";
Пока Чтение.Прочитать() Цикл
Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
Если Чтение.Имя = "Товар" Тогда
ТекущаяСтрока = Результат.Добавить();
ТекущаяСтрока.Артикул = Чтение.ПолучитьАтрибут("Артикул");
ИначеЕсли ТекущаяСтрока <> Неопределено Тогда
ТекущееПоле = Чтение.Имя;
КонецЕсли;
ИначеЕсли Чтение.ТипУзла = ТипУзлаXML.Текст И ТекущаяСтрока <> Неопределено Тогда
Если ТекущееПоле = "Наименование" Тогда
ТекущаяСтрока.Наименование = Чтение.Значение;
ИначеЕсли ТекущееПоле = "Цена" Тогда
ТекущаяСтрока.Цена = Число(Чтение.Значение);
ИначеЕсли ТекущееПоле = "Количество" Тогда
ТекущаяСтрока.Количество = Число(Чтение.Значение);
КонецЕсли;
ИначеЕсли Чтение.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
Если Чтение.Имя = "Товар" Тогда
ТекущаяСтрока = Неопределено;
КонецЕсли;
ТекущееПоле = "";
КонецЕсли;
КонецЦикла;
Чтение.Закрыть();
Возврат Результат;
КонецФункции
На выходе две строки: A-101 на 4 205 ₽ (420,50 × 10) и B-205 на 4 440 ₽ (185 × 24). Дальше по артикулу ищете номенклатуру и заполняете табличную часть документа.
Что учесть в клиент-серверной базе
ЧтениеXML.ОткрытьФайл открывает файл там, где выполняется код. Серверный код не видит диск C: пользователя. Порядок такой:
- На клиенте пользователь выбирает файл, его содержимое помещается во временное хранилище.
- На сервере берёте двоичные данные из хранилища через
ПолучитьИзВременногоХранилища. - Записываете их во временный файл (
ПолучитьИмяВременногоФайла("xml")) и читаете его. - После чтения удаляете временный файл через
УдалитьФайлы.
Когда удобнее XDTO или DOM
- 📦 XDTO. Если у формата есть XSD-схема, импортируйте её в Конфигураторе как XDTO-пакет (
Общие → XDTO-пакеты, импорт XML-схемы). ТогдаФабрикаXDTO.ПрочитатьXML(Чтение)вернёт объект, и к полям можно обращаться через точку. Повторяющиеся элементы придут списком. - 🌳 DOM.
ПостроительDOMчитает файл целиком вДокументDOM. Нужные узлы достают XPath-выражениями. Удобно для небольших файлов со сложной вложенностью, но память расходуется на весь файл сразу.
Для больших выгрузок оставайтесь на ЧтениеXML. DOM на файле в несколько сотен мегабайт легко съедает память 32-разрядного клиента.
6. Ошибки при загрузке XML-файла в 1С
Частые ошибки и как их избежать
- ❌ Загрузка сразу в рабочую базу. Первый прогон нового формата или новых правил — только в копию.
- ❌ Проведение при загрузке. Документы с неполными данными проводятся с ошибками и портят остатки. Загружайте записанными, проводите после сверки.
- ❌ Старые правила после обновления. Обновили приёмник — перепроверьте правила на тестовом файле.
- ❌ Один пользователь на всё. Загрузку под учётной записью с полными правами лучше выделить отдельно: в журнале регистрации будет видно, что создано загрузкой, а что вручную.
7. Частые вопросы о загрузке XML в 1С
Можно ли открыть XML-файл в 1С просто для просмотра?
Главное меню → Файл → Открыть платформа откроет XML как текстовый документ. Данные при этом в базу не попадают.Как загрузить XML в файловую базу и в серверную, есть ли разница?
Чем XML-выгрузка отличается от файла .dt?
.dt — полная копия базы, загружается в Конфигураторе и затирает все данные. XML переносит выбранные объекты и добавляется к существующим данным.