Как реализовать выгрузку документов между базами 1С через HTTP-сервисы

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

Передача данных между базами 1С — это одна из самых частых задач интеграции. Когда требуется не просто синхронизировать справочники, а оперативно передать документ так, чтобы он сразу создался и провелся в целевой системе, HTTP-сервисы становятся наиболее гибким инструментом. В этой статье мы подробно разберем, как организовать процесс выгрузки документа из одной базы в другую, используя метод POST и современные подходы к сериализации данных. В качестве альтернативы можно использовать универсальную обработку для обмена данными между базами через JSON.

Почему именно POST, а не GET?

Разберем фундаментальное различие этих методов в контексте 1С. Метод GET предназначен для получения данных. Все параметры запроса в нем передаются непосредственно в строке URL. Это накладывает серьезные ограничения: по умолчанию большинство веб-серверов ограничивают длину строки запроса (обычно до 4 Кб). Если вы попытаетесь передать структуру документа с множеством строк в табличной части, данные просто будут обрезаны или сервер вернет ошибку.

Для нашей задачи — выгрузки данных — мы выберем метод POST. Он позволяет передавать данные в теле запроса. Здесь практически нет ограничений на объем информации (они регулируются только настройками веб-сервера), и данные передаются в зашифрованном виде, если используется протокол HTTPS. Проанализируем ситуацию: нам нужно не просто «попросить» данные у базы-приемника, а «отправить» ей пакет данных для обработки. Это классический сценарий для POST-запроса.

Выбор формата данных: JSON против XML

Для передачи документа нам нужно превратить объект 1С (ДокументОбъект или ТаблицуЗначений) в строку. Рассмотрим два основных варианта:

  1. JSON — современный, компактный и быстрый формат. Платформа 1С имеет встроенные инструменты для работы с ним (ЧтениеJSON, ЗаписьJSON). Это лучший выбор для веб-интеграций.
  2. XML / XDTO — более строгий формат. Он полезен, если структуры документов в базах сильно различаются или если вы используете стандарт EnterpriseData. Фабрика XDTO позволяет автоматически сериализовать объект 1С в XML-пакет. Если для этих целей уже подготовлены правила конвертации, можно настроить регулярный обмен данными по расписанию поверх существующего плана.

В большинстве случаев мы рекомендуем использовать JSON, так как он создает меньшую нагрузку на сеть и проще в отладке.

Подготовка данных на стороне базы-отправителя

Рассмотрим по шагам процесс подготовки данных. Нам необходимо собрать данные документа в структуру или таблицу значений, а затем сериализовать их. Важный момент: ссылки 1С (Номенклатура, Контрагенты) нельзя передать «как есть», их нужно преобразовать в строковое представление уникального идентификатора (GUID).

Пример подготовки данных в JSON:


// Формируем структуру данных документа
ДанныеДокумента = Новый Структура;
ДанныеДокумента.Вставить("Номер", Объект.Номер);
ДанныеДокумента.Вставить("Дата", Объект.Дата);
ДанныеДокумента.Вставить("Контрагент_UID", Строка(Объект.Контрагент.УникальныйИдентификатор()));

ТабличнаяЧасть = Новый Массив;
Для Каждого СтрокаТЧ Из Объект.Товары Цикл
    НоваяСтрока = Новый Структура;
    НоваяСтрока.Вставить("Номенклатура_UID", Строка(СтрокаТЧ.Номенклатура.УникальныйИдентификатор()));
    НоваяСтрока.Вставить("Количество", СтрокаТЧ.Количество);
    НоваяСтрока.Вставить("Цена", СтрокаТЧ.Цена);
    ТабличнаяЧасть.Добавить(НоваяСтрока);
КонецЦикла;
ДанныеДокумента.Вставить("Товары", ТабличнаяЧасть);

// Сериализация в JSON
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ДанныеДокумента);
СтрокаЗапроса = ЗаписьJSON.Закрыть();

Отправка запроса через HTTPСоединение

После того как данные подготовлены, нам нужно отправить их в базу-приемник. Выясним, как настроить соединение. Используем объект HTTPСоединение и HTTPЗапрос.


Сервер = "192.168.1.10"; // Адрес базы-приемника
Ресурс = "/BaseB/hs/Exchange/CreateDocument"; // Путь к вашему HTTP-сервису

Соединение = Новый HTTPСоединение(Сервер, , "Пользователь", "Пароль");
Запрос = Новый HTTPЗапрос(Ресурс);
Запрос.Заголовки.Вставить("Content-Type", "application/json");
Запрос.УстановитьТелоИзСтроки(СтрокаЗапроса, КодировкаТекста.UTF8);

Попытка
    Ответ = Соединение.ОтправитьДляОбъекта(Запрос, "POST");
    Если Ответ.КодСостояния = 201 Тогда
        Сообщить("Документ успешно создан в базе-приемнике");
    Иначе
        Сообщить("Ошибка при создании: " + Ответ.ПолучитьТелоКакСтроку());
    КонецЕсли;
Исключение
    Сообщить("Ошибка связи с сервером: " + ОписаниеОшибки());
КонецПопытки;

Создание HTTP-сервиса в базе-приемнике

Теперь перейдем к принимающей стороне. Нам нужно создать в конфигурации новый объект HTTP-сервис. Назовем его Exchange, установим корневой URL hs. Внутри создадим шаблон ресурса CreateDocument и метод POST.

Разберем программный код обработчика метода POST. Основная задача — прочитать JSON, найти ссылочные объекты по переданным GUID и создать документ. При необходимости можно воспользоваться готовым модулем HTTP-сервиса для приема и записи объектов.


Функция CreateDocumentPost(Запрос)
    
    ТелоЗапроса = Запрос.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
    
    ЧтениеJSON = Новый ЧтениеJSON;
    ЧтениеJSON.УстановитьСтроку(ТелоЗапроса);
    Данные = ПрочитатьJSON(ЧтениеJSON);
    ЧтениеJSON.Закрыть();
    
    // Создаем документ
    НовыйДокумент = Документы.ПриходТовара.СоздатьДокумент();
    НовыйДокумент.Дата = Данные.Дата;
    
    // Поиск контрагента по UUID
    СсылкаКонтрагент = Справочники.Контрагенты.ПолучитьСсылку(Новый УникальныйИдентификатор(Данные.Контрагент_UID));
    Если СсылкаКонтрагент.Пустая() Тогда
        // Здесь можно реализовать логику создания контрагента, если он не найден
    КонецЕсли;
    НовыйДокумент.Контрагент = СсылкаКонтрагент;
    
    // Заполнение табличной части
    Для Каждого СтрокаJSON Из Данные.Товары Цикл
        НоваяСтрока = НовыйДокумент.Товары.Добавить();
        НоваяСтрока.Номенклатура = Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор(СтрокаJSON.Номенклатура_UID));
        НоваяСтрока.Количество = СтрокаJSON.Количество;
        НоваяСтрока.Цена = СтрокаJSON.Цена;
    КонецЦикла;
    
    Попытка
        НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение);
        Ответ = Новый HTTPСервисОтвет(201); // Created
        Ответ.УстановитьТелоИзСтроки("Документ создан успешно");
    Исключение
        Ответ = Новый HTTPСервисОтвет(500); // Internal Server Error
        Ответ.УстановитьТелоИзСтроки("Ошибка при проведении: " + КраткоеОписаниеОшибки(ИнформацияОбОшибке()));
    КонецПопытки;
    
    Возврат Ответ;
    
КонецФункции

Проблема отсутствующих ссылок и рекурсия

Проанализируем важный нюанс, упомянутый в обсуждении. Что делать, если в базе-приемнике нет номенклатуры, которую мы передаем? Если просто записать пустую ссылку, документ будет некорректным.

Существует два подхода к решению этой проблемы:

  1. Предварительная проверка: Перед отправкой документа база-отправитель делает запрос к сервису «ПроверитьНаличиеОбъектов», передавая список всех GUID. Если чего-то не хватает — сначала выгружаются справочники.
  2. Метод Upsert (Update or Insert): В обработчике создания документа на стороне приемника добавляется логика: если Ссылка.ПолучитьОбъект() = Неопределено, то сервис создает новый элемент справочника с переданным уникальным идентификатором. Это позволяет гарантировать целостность данных.

Технические ограничения и настройка веб-сервера

Если вы планируете передавать большой объем данных (например, сотни документов за раз или документы с тысячами строк), стандартных настроек веб-сервера может не хватить. Рассмотрим основные моменты:

Важный совет по производительности: Для передачи сверхбольших объемов данных не считывайте всё тело запроса в строку функцией ПолучитьТелоКакСтроку(), так как это потребляет много оперативной памяти. Вместо этого используйте ПолучитьТелоКакПоток() и читайте данные порциями напрямую в парсер JSON.

Резюме

Мы выяснили, что для надежной выгрузки документов из 1С в 1С лучше всего использовать связку HTTP-сервис + метод POST + JSON. Это позволяет передавать данные практически неограниченного объема, обрабатывать их в транзакции на стороне приемника и возвращать понятный ответ о результате операции. Помните о проверке уникальных идентификаторов и настройках веб-сервера для стабильной работы обмена. Чтобы убедиться в корректности проведенных документов, можно автоматически сравнить проводки между проверяемыми базами.

← На главную