В практике 1С-программиста часто возникают задачи интеграции с внешними сервисами, сайтами или аналитическими системами. Одна из распространенных ситуаций: сервис требует выгрузку данных в формате XML, но документации мало, или она отсутствует. Рассмотрим кейс, когда при анализе требований выясняется, что требуемый формат подозрительно похож на стандартный обмен между базами 1С. Разберем, как идентифицировать такой обмен и почему ручное формирование XML-файла в этом случае — тупиковый путь.
Первым шагом при любой интеграции является анализ формата данных. Допустим, мы получили (или подсмотрели в логах сервиса) следующий заголовок XML-файла:
<?xml version="1.0" encoding="UTF-8"?>
<ФайлОбмена Комментарий="Выгрузка" ИдПравилКонвертации="EFD80137-DDFF-929B-3A8C-3A2DF44C4653"
ИмяКонфигурацииПриемника="БухгалтерияПредприятия"
ИмяКонфигурацииИсточника="БухгалтерияПредприятия"
ВерсияФормата="2.0" >
<ПравилаОбмена>
<ВерсияФормата>2.01</ВерсияФормата>
...
Давайте проанализируем ключевые атрибуты этого заголовка, чтобы понять, с чем мы имеем дело.
ИдПравилКонвертации (GUID): Это уникальный идентификатор правил обмена. Он генерируется в конфигурации «Конвертация данных 2.0» (КД 2). Это явный признак того, что принимающая сторона ожидает файл, сформированный именно по этим правилам.ВерсияФормата="2.01": Указывает на использование классического механизма обмена через XML (не EnterpriseData/XDTO, где версии обычно 1.X, а именно формат КД 2.0).Источник и Приемник: Указывают на то, что сервис маскируется под конфигурацию 1С (например, «БухгалтерияПредприятия»), чтобы стандартные механизмы 1С могли корректно загрузить или выгрузить данные.Вывод: Перед нами не произвольный XML-формат, придуманный разработчиками сайта, а стандартный пакет обмена 1С, созданный с помощью технологии «Конвертация данных 2.0». Это кардинально меняет подход к разработке.
У начинающих разработчиков часто возникает соблазн использовать объект ЗаписьXML и просто воспроизвести структуру тегов вручную. Рассмотрим, почему в данном случае это является грубой ошибкой.
Формат КД 2.0 — это сложная, иерархическая структура, которая описывает не только значения полей, но и метаданные типов, ссылки на объекты и правила их поиска.
Основные проблемы ручной сборки:
ИдПравилКонвертации должен строго соответствовать тому файлу правил (Rules.xml), который загружен на стороне приемника (сайта). Если вы ошибетесь хоть в одном теге структуры, загрузка на сайте упадет с ошибкой чтения.Поскольку мы выяснили, что формат основан на КД 2.0, правильным решением будет использование типовых механизмов платформы. Разберем по шагам, как действовать в такой ситуации.
В большинстве случаев, если сервис (сайт) умеет принимать данные в формате 1С, разработчики сервиса предоставляют готовую внешнюю обработку или расширение. Внутри этих решений уже «зашиты» нужные правила обмена.
Вам необходимо:
Если готовая обработка вас не устраивает (например, нужно настроить фоновое выполнение, а обработка требует ручного запуска), вы можете извлечь из нее самое главное — Правила конвертации.
Как это сделать:
ПравилаОбмена или ПравилаОбменаXML)..xml.Теперь у вас есть файл правил, который понимает принимающая сторона.
Имея файл правил, мы можем использовать типовую обработку УниверсальныйОбменДаннымиXML (она есть практически во всех типовых конфигурациях или на диске ИТС) или написать свой код, использующий менеджер обмена.
Рассмотрим пример программного кода, который можно поместить в регламентное задание для автоматической выгрузки:
// Пример программной выгрузки данных по правилам обмена
Процедура ВыполнитьВыгрузкуНаСайт()
ИмяФайлаПравил = "C:\Exchange\Rules.xml"; // Файл, который мы достали из макета
ИмяФайлаДанных = "C:\Exchange\Upload.xml"; // Файл, который отправим на сайт
ОбработкаОбмена = Обработки.УниверсальныйОбменДаннымиXML.Создать();
ОбработкаОбмена.РежимОбмена = "Выгрузка";
ОбработкаОбмена.ИмяФайлаПравилОбмена = ИмяФайлаПравил;
ОбработкаОбмена.ИмяФайлаОбмена = ИмяФайлаДанных;
// Загружаем правила
ОбработкаОбмена.ЗагрузитьПравилаОбмена();
// Устанавливаем параметры (если они есть в правилах)
ОбработкаОбмена.Параметры.Вставить("ДатаНачала", НачалоДня(ТекущаяДата()));
ОбработкаОбмена.Параметры.Вставить("ДатаОкончания", КонецДня(ТекущаяДата()));
// Выполняем выгрузку
Попытка
ОбработкаОбмена.ВыполнитьВыгрузку();
Исключение
ЗаписьЖурналаРегистрации("ОбменСайт", УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки());
Возврат;
КонецПопытки;
// Далее код отправки полученного файла ИмяФайлаДанных на сайт (через HTTP или FTP)
ОтправитьФайлНаСайт(ИмяФайлаДанных);
КонецПроцедуры
Если вы разрабатываете интеграцию «с нуля» и сервис поддерживает другие методы, стоит рассмотреть отказ от файлового обмена через XML в пользу HTTP-запросов (REST API).
Современные сервисы часто принимают данные в формате JSON. Формировать JSON из 1С намного проще и нагляднее, чем XML формата КД.
Пример простой отправки данных, если сервис это поддерживает:
// Формируем JSON вручную (здесь это оправдано простотой структуры)
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписьJSON.ЗаписатьНачалоОбъекта();
ЗаписьJSON.ЗаписатьСвойство("OrgName", "ООО Ромашка");
ЗаписьJSON.ЗаписатьСвойство("Sum", 1000);
ЗаписьJSON.ЗаписатьКонецОбъекта();
СтрокаJSON = ЗаписьJSON.Закрыть();
// Отправка
Соединение = Новый HTTPСоединение("api.kub-24.ru", 443, , , , , Новый ЗащищенноеСоединениеOpenSSL);
Запрос = Новый HTTPЗапрос("/api/upload");
Запрос.УстановитьТелоИзСтроки(СтрокаJSON);
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
ИдПравилКонвертации и ПравилаОбмена — это Конвертация Данных 2.0.Обработки.УниверсальныйОбменДаннымиXML в фоновом задании.