Как загрузить произвольный XML-файл из сторонней программы в 1С:Бухгалтерию?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

При интеграции 1С со сторонними системами (веб-сайтами, CRM, складскими программами или самописными сервисами) разработчики часто сталкиваются с необходимостью загрузки данных из файлов формата XML. Разберем по шагам, почему для таких файлов не всегда подходит стандартная обработка обмена, какие механизмы платформы использовать для разбора структуры и как правильно сопоставлять данные при загрузке документов в «1С:Бухгалтерию».

Почему не подходит типовая обработка «Универсальный обмен данными в формате XML»

Типовая обработка «Универсальный обмен данными в формате XML» (известная также как обработка обмена через правила «Конвертации данных 2.1») жестко ориентирована на внутренний формат сериализации 1С. Она способна считывать только те файлы, которые были выгружены из базы 1С по специальным правилам обмена (ПВД/ПКО), либо файлы, строго повторяющие структуру таких правил.

Если стороннее приложение выгрузило файл в своей собственной произвольной структуре, универсальная обработка не сможет распознать теги и сопоставить их с метаданными информационной базы. В этом случае необходимо разрабатывать собственный алгоритм импорта данных.

Основные механизмы чтения XML в платформе 1С

Выясним причину выбора того или иного инструмента для разбора входящего файла. Платформа 1С:Предприятие 8 предоставляет несколько способов работы с XML:

  1. Потоковое чтение (ЧтениеXML): последовательно считывает документ узел за узлом. Это наиболее быстрый и нетребовательный к оперативной памяти способ. Он идеально подходит для файлов любого размера — от нескольких килобайт до сотен мегабайт. При изменении набора реквизитов в сторонней программе (например, добавлении новых тегов) код с потоковым чтением продолжит работать стабильно, если неизвестные теги просто пропускаются.
  2. Объектная модель DOM (ПостроительDOM и ДокументDOM): загружает весь XML-файл в память целиком в виде дерева объектов. Данный способ удобен для навигации по сложным вложенным узлам, но требует значительного объема оперативной памяти. Большие файлы могут вызвать ошибку нехватки памяти.
  3. Механизм XDTO (ФабрикаXDTO): используется в случаях, когда для стороннего XML предоставлена схема XSD. Механизм автоматически валидирует структуру и приводит типы данных (строки, числа, даты) к типам платформы.
  4. XSLT-трансформация (ПреобразованиеXSL): позволяет преобразовать входящий нестандартный XML в формат, поддерживаемый типовыми механизмами (например, EnterpriseData или CommerceML), после чего выполнить стандартную загрузку.

Организация поиска и сопоставления объектов

Проанализируем ситуацию, когда данные из XML уже прочитаны и требуется найти соответствующие элементы в базе 1С или создать новые. Сопоставление сущностей рекомендуется строить по следующим правилам:

  1. Контрагенты:
    • Для юридических лиц поиск только по ИНН ненадежен из-за наличия обособленных подразделений (филиалов). Оптимально выполнять поиск по комбинации ИНН + КПП.
    • Для индивидуальных предпринимателей и физических лиц КПП отсутствует, поэтому сопоставление выполняется по 12-значному ИНН.
  2. Номенклатура:
    • Поиск рекомендуется выполнять по связке Артикул + Наименование.
    • Если в сторонней системе зафиксированы штрихкоды, поиск можно выполнять по регистру сведений ШтрихкодыНоменклатуры.
  3. Использование внешних идентификаторов (GUID):
    • Если стороннее ПО передает свой уникальный идентификатор (GUID), не требуется вносить изменения в структуру типовой конфигурации и добавлять новые реквизиты в справочники.
    • В типовых конфигурациях на базе БСП (включая «1С:Бухгалтерию») присутствует регистр сведений СоответствияОбъектовИнформационныхБаз. Он предназначен для хранения связок между ссылками 1С и строковыми идентификаторами любых внешних систем.
    • Также для хранения внешнего кода можно использовать стандартный механизм дополнительных реквизитов (план видов характеристик ДополнительныеРеквизитыИСведения).

Практический пример: чтение файла и создание документа

Рассмотрим пример создания внешней обработки для потокового чтения XML-файла и загрузки данных в документ «Поступление (акт, накладная)»:


&НаСервере
Процедура ЗагрузитьДокументыИзXMLНаСервере(ПолноеИмяФайла)
    Чтение = Новый ЧтениеXML;
    Чтение.ОткрытьФайл(ПолноеИмяФайла);
    
    Пока Чтение.Прочитать() Цикл
        // Обрабатываем начало узла документа
        Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента И Чтение.Имя = "Document" Тогда
            ОбработатьУзелДокумента(Чтение);
        КонецЕсли;
    КонецЦикла;
    
    Чтение.Закрыть();
КонецПроцедуры

&НаСервере
Процедура ОбработатьУзелДокумента(Чтение)
    НомерДок = Чтение.ПолучитьАтрибут("Number");
    ДатаДок  = XMLЗначение(Тип("Дата"), Чтение.ПолучитьАтрибут("Date"));
    
    ИННКонтрагента = "";
    КППКонтрагента = "";
    
    // Считываем внутренние данные документа
    Пока Чтение.Прочитать() Цикл
        Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
            Если Чтение.Имя = "Vendor" Тогда
                ИННКонтрагента = Чтение.ПолучитьАтрибут("INN");
                КППКонтрагента = Чтение.ПолучитьАтрибут("KPP");
            ИначеЕсли Чтение.Имя = "Lines" Тогда
                // Переход к обработке строк
            КонецЕсли;
        ИначеЕсли Чтение.ТипУзла = ТипУзлаXML.КонецЭлемента И Чтение.Имя = "Document" Тогда
            // Завершение чтения текущего документа
            Прервать;
        КонецЕсли;
    КонецЦикла;
    
    // Поиск контрагента по ИНН и КПП
    КонтрагентСсылка = НайтиКонтрагентаПоРеквизитам(ИННКонтрагента, КППКонтрагента);
    
    // Создание документа в 1С
    Если ЗначениеЗаполнено(КонтрагентСсылка) Тогда
        ДокОбъект = Документы.ПоступлениеТоваровУслуг.СоздатьДокумент();
        ДокОбъект.Дата = ДатаДок;
        ДокОбъект.НомерВходящегоДокумента = НомерДок;
        ДокОбъект.Контрагент = КонтрагентСсылка;
        // Заполнение остальных обязательных реквизитов (Организация, Договор и т.д.)
        // ДокОбъект.Записать(РежимЗаписиДокумента.Запись);
    КонецЕсли;
КонецПроцедуры

Рекомендации по устойчивости алгоритма и транзакциям

Разберем важные нюансы, которые необходимо учитывать при промышленной эксплуатации алгоритма загрузки:

  1. Преобразование типов: Даты в XML часто хранятся в международном формате ISO 8601 (например, 2026-03-30), а дробные числа содержат точку. Для их безопасной конвертации всегда используйте функцию платформы XMLЗначение(Тип("Дата"), СтрокаXML) и XMLЗначение(Тип("Число"), СтрокаXML), что исключит ошибки региональных настроек Windows.
  2. Управление транзакциями: Не оборачивайте весь процесс загрузки большого файла в одну глобальную транзакцию. При возникновении ошибки на последнем документе откатятся все предыдущие, а длительная транзакция заблокирует таблицы базы для других пользователей. Записывайте и фиксируйте документы по отдельности либо небольшими порциями (пакетами по 20–50 штук).
  3. Устойчивость к изменениям схемы: При разработке парсера на базе ЧтениеXML проектируйте ветвления по тегам так, чтобы появление новых незнакомых элементов или атрибутов в файле от сторонней программы игнорировалось без вызова исключений.
← На главную