При интеграции 1С со сторонними системами (веб-сайтами, CRM, складскими программами или самописными сервисами) разработчики часто сталкиваются с необходимостью загрузки данных из файлов формата XML. Разберем по шагам, почему для таких файлов не всегда подходит стандартная обработка обмена, какие механизмы платформы использовать для разбора структуры и как правильно сопоставлять данные при загрузке документов в «1С:Бухгалтерию».
Типовая обработка «Универсальный обмен данными в формате XML» (известная также как обработка обмена через правила «Конвертации данных 2.1») жестко ориентирована на внутренний формат сериализации 1С. Она способна считывать только те файлы, которые были выгружены из базы 1С по специальным правилам обмена (ПВД/ПКО), либо файлы, строго повторяющие структуру таких правил.
Если стороннее приложение выгрузило файл в своей собственной произвольной структуре, универсальная обработка не сможет распознать теги и сопоставить их с метаданными информационной базы. В этом случае необходимо разрабатывать собственный алгоритм импорта данных.
Выясним причину выбора того или иного инструмента для разбора входящего файла. Платформа 1С:Предприятие 8 предоставляет несколько способов работы с XML:
ЧтениеXML): последовательно считывает документ узел за узлом. Это наиболее быстрый и нетребовательный к оперативной памяти способ. Он идеально подходит для файлов любого размера — от нескольких килобайт до сотен мегабайт. При изменении набора реквизитов в сторонней программе (например, добавлении новых тегов) код с потоковым чтением продолжит работать стабильно, если неизвестные теги просто пропускаются.ПостроительDOM и ДокументDOM): загружает весь XML-файл в память целиком в виде дерева объектов. Данный способ удобен для навигации по сложным вложенным узлам, но требует значительного объема оперативной памяти. Большие файлы могут вызвать ошибку нехватки памяти.ФабрикаXDTO): используется в случаях, когда для стороннего XML предоставлена схема XSD. Механизм автоматически валидирует структуру и приводит типы данных (строки, числа, даты) к типам платформы.ПреобразованиеXSL): позволяет преобразовать входящий нестандартный XML в формат, поддерживаемый типовыми механизмами (например, EnterpriseData или CommerceML), после чего выполнить стандартную загрузку.Проанализируем ситуацию, когда данные из XML уже прочитаны и требуется найти соответствующие элементы в базе 1С или создать новые. Сопоставление сущностей рекомендуется строить по следующим правилам:
ИНН + КПП.ИНН.Артикул + Наименование.ШтрихкодыНоменклатуры.СоответствияОбъектовИнформационныхБаз. Он предназначен для хранения связок между ссылками 1С и строковыми идентификаторами любых внешних систем.ДополнительныеРеквизитыИСведения).Рассмотрим пример создания внешней обработки для потокового чтения XML-файла и загрузки данных в документ «Поступление (акт, накладная)»:
&НаСервере
Процедура ЗагрузитьДокументыИзXMLНаСервере(ПолноеИмяФайла)
Чтение = Новый ЧтениеXML;
Чтение.ОткрытьФайл(ПолноеИмяФайла);
Пока Чтение.Прочитать() Цикл
// Обрабатываем начало узла документа
Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента И Чтение.Имя = "Document" Тогда
ОбработатьУзелДокумента(Чтение);
КонецЕсли;
КонецЦикла;
Чтение.Закрыть();
КонецПроцедуры
&НаСервере
Процедура ОбработатьУзелДокумента(Чтение)
НомерДок = Чтение.ПолучитьАтрибут("Number");
ДатаДок = XMLЗначение(Тип("Дата"), Чтение.ПолучитьАтрибут("Date"));
ИННКонтрагента = "";
КППКонтрагента = "";
// Считываем внутренние данные документа
Пока Чтение.Прочитать() Цикл
Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
Если Чтение.Имя = "Vendor" Тогда
ИННКонтрагента = Чтение.ПолучитьАтрибут("INN");
КППКонтрагента = Чтение.ПолучитьАтрибут("KPP");
ИначеЕсли Чтение.Имя = "Lines" Тогда
// Переход к обработке строк
КонецЕсли;
ИначеЕсли Чтение.ТипУзла = ТипУзлаXML.КонецЭлемента И Чтение.Имя = "Document" Тогда
// Завершение чтения текущего документа
Прервать;
КонецЕсли;
КонецЦикла;
// Поиск контрагента по ИНН и КПП
КонтрагентСсылка = НайтиКонтрагентаПоРеквизитам(ИННКонтрагента, КППКонтрагента);
// Создание документа в 1С
Если ЗначениеЗаполнено(КонтрагентСсылка) Тогда
ДокОбъект = Документы.ПоступлениеТоваровУслуг.СоздатьДокумент();
ДокОбъект.Дата = ДатаДок;
ДокОбъект.НомерВходящегоДокумента = НомерДок;
ДокОбъект.Контрагент = КонтрагентСсылка;
// Заполнение остальных обязательных реквизитов (Организация, Договор и т.д.)
// ДокОбъект.Записать(РежимЗаписиДокумента.Запись);
КонецЕсли;
КонецПроцедуры
Разберем важные нюансы, которые необходимо учитывать при промышленной эксплуатации алгоритма загрузки:
2026-03-30), а дробные числа содержат точку. Для их безопасной конвертации всегда используйте функцию платформы XMLЗначение(Тип("Дата"), СтрокаXML) и XMLЗначение(Тип("Число"), СтрокаXML), что исключит ошибки региональных настроек Windows.ЧтениеXML проектируйте ветвления по тегам так, чтобы появление новых незнакомых элементов или атрибутов в файле от сторонней программы игнорировалось без вызова исключений.