Передача данных между базами 1С — это одна из самых частых задач интеграции. Когда требуется не просто синхронизировать справочники, а оперативно передать документ так, чтобы он сразу создался и провелся в целевой системе, HTTP-сервисы становятся наиболее гибким инструментом. В этой статье мы подробно разберем, как организовать процесс выгрузки документа из одной базы в другую, используя метод POST и современные подходы к сериализации данных. В качестве альтернативы можно использовать универсальную обработку для обмена данными между базами через JSON.
Разберем фундаментальное различие этих методов в контексте 1С. Метод GET предназначен для получения данных. Все параметры запроса в нем передаются непосредственно в строке URL. Это накладывает серьезные ограничения: по умолчанию большинство веб-серверов ограничивают длину строки запроса (обычно до 4 Кб). Если вы попытаетесь передать структуру документа с множеством строк в табличной части, данные просто будут обрезаны или сервер вернет ошибку.
Для нашей задачи — выгрузки данных — мы выберем метод POST. Он позволяет передавать данные в теле запроса. Здесь практически нет ограничений на объем информации (они регулируются только настройками веб-сервера), и данные передаются в зашифрованном виде, если используется протокол HTTPS. Проанализируем ситуацию: нам нужно не просто «попросить» данные у базы-приемника, а «отправить» ей пакет данных для обработки. Это классический сценарий для POST-запроса.
Для передачи документа нам нужно превратить объект 1С (ДокументОбъект или ТаблицуЗначений) в строку. Рассмотрим два основных варианта:
ЧтениеJSON, ЗаписьJSON). Это лучший выбор для веб-интеграций.В большинстве случаев мы рекомендуем использовать JSON, так как он создает меньшую нагрузку на сеть и проще в отладке.
Рассмотрим по шагам процесс подготовки данных. Нам необходимо собрать данные документа в структуру или таблицу значений, а затем сериализовать их. Важный момент: ссылки 1С (Номенклатура, Контрагенты) нельзя передать «как есть», их нужно преобразовать в строковое представление уникального идентификатора (GUID).
Пример подготовки данных в JSON:
// Формируем структуру данных документа
ДанныеДокумента = Новый Структура;
ДанныеДокумента.Вставить("Номер", Объект.Номер);
ДанныеДокумента.Вставить("Дата", Объект.Дата);
ДанныеДокумента.Вставить("Контрагент_UID", Строка(Объект.Контрагент.УникальныйИдентификатор()));
ТабличнаяЧасть = Новый Массив;
Для Каждого СтрокаТЧ Из Объект.Товары Цикл
НоваяСтрока = Новый Структура;
НоваяСтрока.Вставить("Номенклатура_UID", Строка(СтрокаТЧ.Номенклатура.УникальныйИдентификатор()));
НоваяСтрока.Вставить("Количество", СтрокаТЧ.Количество);
НоваяСтрока.Вставить("Цена", СтрокаТЧ.Цена);
ТабличнаяЧасть.Добавить(НоваяСтрока);
КонецЦикла;
ДанныеДокумента.Вставить("Товары", ТабличнаяЧасть);
// Сериализация в JSON
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ДанныеДокумента);
СтрокаЗапроса = ЗаписьJSON.Закрыть();
После того как данные подготовлены, нам нужно отправить их в базу-приемник. Выясним, как настроить соединение. Используем объект HTTPСоединение и HTTPЗапрос.
Сервер = "192.168.1.10"; // Адрес базы-приемника
Ресурс = "/BaseB/hs/Exchange/CreateDocument"; // Путь к вашему HTTP-сервису
Соединение = Новый HTTPСоединение(Сервер, , "Пользователь", "Пароль");
Запрос = Новый HTTPЗапрос(Ресурс);
Запрос.Заголовки.Вставить("Content-Type", "application/json");
Запрос.УстановитьТелоИзСтроки(СтрокаЗапроса, КодировкаТекста.UTF8);
Попытка
Ответ = Соединение.ОтправитьДляОбъекта(Запрос, "POST");
Если Ответ.КодСостояния = 201 Тогда
Сообщить("Документ успешно создан в базе-приемнике");
Иначе
Сообщить("Ошибка при создании: " + Ответ.ПолучитьТелоКакСтроку());
КонецЕсли;
Исключение
Сообщить("Ошибка связи с сервером: " + ОписаниеОшибки());
КонецПопытки;
Теперь перейдем к принимающей стороне. Нам нужно создать в конфигурации новый объект 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
Ответ.УстановитьТелоИзСтроки("Ошибка при проведении: " + КраткоеОписаниеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Возврат Ответ;
КонецФункции
Проанализируем важный нюанс, упомянутый в обсуждении. Что делать, если в базе-приемнике нет номенклатуры, которую мы передаем? Если просто записать пустую ссылку, документ будет некорректным.
Существует два подхода к решению этой проблемы:
Ссылка.ПолучитьОбъект() = Неопределено, то сервис создает новый элемент справочника с переданным уникальным идентификатором. Это позволяет гарантировать целостность данных.Если вы планируете передавать большой объем данных (например, сотни документов за раз или документы с тысячами строк), стандартных настроек веб-сервера может не хватить. Рассмотрим основные моменты:
web.config в папке с публикацией базы, изменив параметр maxAllowedContentLength.LimitRequestBody.HTTPСоединение = Новый HTTPСоединение(Сервер, , , , , 600); (где 600 — это секунды).Важный совет по производительности: Для передачи сверхбольших объемов данных не считывайте всё тело запроса в строку функцией ПолучитьТелоКакСтроку(), так как это потребляет много оперативной памяти. Вместо этого используйте ПолучитьТелоКакПоток() и читайте данные порциями напрямую в парсер JSON.
Мы выяснили, что для надежной выгрузки документов из 1С в 1С лучше всего использовать связку HTTP-сервис + метод POST + JSON. Это позволяет передавать данные практически неограниченного объема, обрабатывать их в транзакции на стороне приемника и возвращать понятный ответ о результате операции. Помните о проверке уникальных идентификаторов и настройках веб-сервера для стабильной работы обмена. Чтобы убедиться в корректности проведенных документов, можно автоматически сравнить проводки между проверяемыми базами.