Загрузка XML-файла в 1С 8.3: от входящей УПД до своего кода

· 9 мин

Содержание

Загрузить 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 откройте Покупки → Поступление (акты, накладные, УПД). В командной панели списка есть подменю ЭДО, в нём — команда загрузки электронного документа из файла.

  1. Выберите команду загрузки и укажите XML-файл.
  2. Программа покажет содержимое документа: продавца, номенклатуру, суммы, НДС.
  3. Сопоставьте номенклатуру поставщика со своей. Сопоставление запоминается, и следующий файл от этого поставщика пройдёт быстрее.
  4. Если контрагента нет в базе, программа предложит создать его по ИНН и КПП из файла.
  5. Создайте документ поступления и проверьте суммы перед проведением.

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

Сообщение синхронизации из другой базы

Если обмен между базами настроен через общий каталог или почту, 1С сама кладёт и забирает файлы Message_XX_YY.xml (часто упакованные в zip). Вручную загружать их не нужно.

  1. Положите файл в каталог обмена, указанный в настройке.
  2. Откройте Администрирование → Синхронизация данных → Настройки синхронизации данных.
  3. Выделите нужную настройку и нажмите «Синхронизировать».

Загрузится только сообщение, адресованное этой базе. Префиксы в имени файла — это коды узлов «откуда» и «куда».

Перенос между базами одной конфигурации

Для переноса части справочников или документов между двумя базами с одинаковой конфигурацией подходит обработка «Выгрузка и загрузка данных XML» (файл ВыгрузкаЗагрузкаДанныхXML83.epf, распространяется на ИТС). В базе-источнике она выгружает выбранные объекты в XML, в базе-приёмнике загружает их обратно.

Конфигурации должны совпадать до реквизита. Если в приёмнике другой релиз или доработки, загрузка остановится на первом несовпадающем объекте или запишет данные не туда.

3. Правила обмена: как загрузить XML из другой конфигурации

Когда структура баз разная, например старая самописная конфигурация и Бухгалтерия 3.0, нужен посредник — правила обмена. Это тоже XML-файл. Его готовят в конфигурации «Конвертация данных » 2.x: описывают, какой объект источника во что превращается в приёмнике, по каким полям искать существующие элементы, что делать при отсутствии.

Порядок работы с универсальным обменом

  1. В базе-приёмнике включите команду «Все функции»: Главное меню → Сервис → Параметры → Показывать команду «Все функции».
  2. Откройте Все функции → Обработки → Универсальный обмен данными в формате XML. В конфигурациях на БСП она встроена. Для старых конфигураций есть внешний файл УниверсальныйОбменДаннымиXML.epf.
  3. В базе-источнике той же обработкой на вкладке выгрузки укажите файл правил и выгрузите данные. Получится <ФайлОбмена>, в котором правила уже лежат внутри.
  4. В приёмнике перейдите на вкладку загрузки, укажите файл данных и запустите загрузку.
  5. После загрузки откройте протокол обмена. В нём перечислены объекты, которые не удалось записать, и причины.

Как настроить правила, чтобы не наплодить дублей

  • 🧩 Поля поиска. Для контрагентов ищите по ИНН и КПП, для номенклатуры — по артикулу или коду. Поиск по наименованию ломается на первом лишнем пробеле.
  • 🧩 Режим записи документов. Загружайте документы без проведения. Проведите их потом отдельно, когда проверите остатки.
  • 🧩 Пробный прогон. Первый раз загружайте в копию базы . Сравните количество элементов в файле и в приёмнике.
  • 🧩 Версия правил. Правила пишут под конкретные релизы источника и приёмника. После обновления любой из баз их нужно проверить: переименованный реквизит молча оставит поле пустым.

Для типовых пар конфигураций (например, переход с Бухгалтерии 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: пользователя. Порядок такой:

  1. На клиенте пользователь выбирает файл, его содержимое помещается во временное хранилище.
  2. На сервере берёте двоичные данные из хранилища через ПолучитьИзВременногоХранилища.
  3. Записываете их во временный файл (ПолучитьИмяВременногоФайла("xml")) и читаете его.
  4. После чтения удаляете временный файл через УдалитьФайлы.

Когда удобнее 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 переносит выбранные объекты и добавляется к существующим данным.
Можно ли загружать XML по расписанию?
Да. Дополнительную обработку в БСП можно назначить регламентным заданием, а синхронизация данных умеет запускаться по расписанию сама.
Где взять правила обмена для своей пары конфигураций?
Для типовых переходов они встроены в конфигурации. Для нетиповых пар правила разрабатывают в «Конвертации данных» под конкретные релизы.