JSON в 1С нужен почти в каждой интеграции: сайт присылает заказ, Telegram отдаёт сообщения, Python-сервис ждёт товары. Платформа 8.3 умеет писать и читать JSON сама: объект ЗаписьJSON с функцией ЗаписатьJSON превращает структуру, соответствие или массив в строку, а ЧтениеJSON с функцией ПрочитатьJSON разбирает строку JSON обратно в структуру или соответствие. Ниже разобраны запись в строку и в файл, чтение в структуру и в соответствие, даты, числа и null, большие объёмы, JSON в HTTP-запросе и HTTP-сервисе, сериализация объектов через XDTO и типичные ошибки. Весь код взят из моих учебных конфигураций, на которых я веду курсы по интеграции 1С.
Что такое JSON в 1С и когда он лучше XDTO?
JSON это текстовый формат обмена: объекты в фигурных скобках, массивы в квадратных, строки, числа, true, false и null. В 1С он ложится на три коллекции: объект JSON становится структурой или соответствием, массив JSON становится массивом. Больше платформе ничего не нужно, схему данных описывать не надо.
В 1С есть и второй путь обмена, XDTO: пакет со схемой, фабрика, сериализатор. Он нужен, когда с обеих сторон 1С или когда формат задан XSD-схемой. Для всего остального я беру JSON:
| Задача | JSON (ЗаписатьJSON / ПрочитатьJSON) |
XDTO (СериализаторXDTO, пакеты) |
|---|---|---|
| Обмен с сайтом, мобильным приложением, Python, JS | Да, формат понимают все | Неудобно: на той стороне нужен разбор формата 1С |
| Обмен между двумя базами 1С целыми объектами | Придётся собирать и разбирать поля руками | Да, объект уходит и восстанавливается целиком |
| Формат описан XSD-схемой (ФНС, ЭДО, банки) | Нет | Да, через пакет XDTO |
| Ответы REST API: Telegram, amoCRM, маркетплейсы | Да | Нет |
Подробно про XDTO, фабрику и пакеты я писал в статье XDTO в 1С: XML и JSON. Здесь речь только о JSON.
Как записать JSON в 1С: ЗаписьJSON и ЗаписатьJSON
Запись идёт в три шага: создать ЗаписьJSON, указать, куда писать (строка или файл), и передать данные в глобальную функцию ЗаписатьJSON. Эту функцию я держу в общем модуле почти каждой учебной конфигурации в одном и том же виде:
Функция ЗаписатьСтрокуJSON(Данные, ФормироватьСПереносами = Ложь) Экспорт
ЗаписьJSON = Новый ЗаписьJSON;
Если ФормироватьСПереносами Тогда
// Читаемый JSON с отступами табуляцией: для отладки и логов
ЗаписьJSON.УстановитьСтроку(Новый ПараметрыЗаписиJSON(, Символы.Таб));
Иначе
// Одна строка без переносов: для передачи по сети
ЗаписьJSON.УстановитьСтроку(Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет, Символы.Таб));
КонецЕсли;
НастройкиСериализацииJSON = Новый НастройкиСериализацииJSON;
НастройкиСериализацииJSON.ВариантЗаписиДаты = ВариантЗаписиДатыJSON.ЛокальнаяДатаСоСмещением;
НастройкиСериализацииJSON.ФорматСериализацииДаты = ФорматДатыJSON.ISO;
ЗаписатьJSON(ЗаписьJSON, Данные, НастройкиСериализацииJSON);
// Закрыть() для записи в строку возвращает готовый текст JSON
Возврат ЗаписьJSON.Закрыть();
КонецФункции
Обратите внимание на последнюю строку: при записи в строку Закрыть() возвращает результат. Отдельного метода «получить строку» нет.
Чтобы собрать структуру в JSON, данные готовят обычными коллекциями. Вот так в учебном HTTP-сервисе формируется список товаров:
МассивТоваров = Новый Массив;
СтруктураТовара = Новый Структура;
СтруктураТовара.Вставить("UUID", "86fabe85-8300-11ea-847a-3085a93c8c97");
СтруктураТовара.Вставить("Name", "Товар 1");
МассивТоваров.Добавить(СтруктураТовара);
ДанныеJSON = ЗаписатьСтрокуJSON(МассивТоваров, Истина);
На выходе получается массив объектов:
[
{
"UUID": "86fabe85-8300-11ea-847a-3085a93c8c97",
"Name": "Товар 1"
}
]
Какие типы 1С можно записать в JSON?
ЗаписатьJSON принимает не всё подряд. Без дополнительной обработки записываются:
| Тип 1С | Что получится в JSON |
|---|---|
| Строка | строка |
| Число | число |
| Булево | true / false |
| Неопределено | null |
| Дата | строка в формате из НастройкиСериализацииJSON |
| Структура, Соответствие (с ключами-строками), ФиксированнаяСтруктура | объект |
| Массив, ФиксированныйМассив | массив |
Ссылку на справочник, таблицу значений или объект документа напрямую передать нельзя, платформа остановится на ошибке о недопустимом типе. Их сначала перекладывают в структуру или соответствие.
Как выгрузить таблицу значений и ссылки в JSON?
Таблицу значений проще всего превратить в массив соответствий: строка таблицы становится объектом JSON, колонки становятся его свойствами. Ссылку записывают как строку с уникальным идентификатором через XMLСтрока. Фрагмент из учебной конфигурации, где я сравниваю JSON и XDTO на выгрузке справочника:
Выгрузка = РезультатЗапроса.Выгрузить();
Данные = Новый Массив;
Для каждого ТекущийЭлемент Из Выгрузка Цикл
СтруктураДанных = Новый Соответствие;
СтруктураДанных.Вставить("Ссылка", XMLСтрока(ТекущийЭлемент.Ссылка));
СтруктураДанных.Вставить("ПометкаУдаления", ТекущийЭлемент.ПометкаУдаления);
СтруктураДанных.Вставить("Код", ТекущийЭлемент.Код);
СтруктураДанных.Вставить("Наименование", ТекущийЭлемент.Наименование);
Данные.Добавить(СтруктураДанных);
КонецЦикла;
Так же решается запрос «массив структур в JSON»: массив, в каждом элементе структура или соответствие, и одним вызовом ЗаписатьJSON всё уходит в строку.
Как записать JSON в файл?
Вместо УстановитьСтроку вызывается ОткрытьФайл. Четвёртым параметром передаются те же ПараметрыЗаписиJSON:
ЗаписьJSON = Новый ЗаписьJSON;
ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON(, Символы.Таб);
ЗаписьJSON.ОткрытьФайл(КаталогВременныхФайлов() + "ВыгрузкаJSON.txt",,, ПараметрыЗаписиJSON);
ЗаписатьJSON(ЗаписьJSON, Данные);
ЗаписьJSON.Закрыть();
Второй и третий параметры ОткрытьФайл задают кодировку и запись BOM. Если файл будет читать не 1С, а скрипт на Python или PHP, кодировку лучше задать явно: UTF-8.
Экранирование: кириллица, слеши и кавычки
По умолчанию 1С пишет кириллицу как есть. Некоторым API нужно иначе. Подпись запроса к Amazon S3, например, считается от строки, где всё вне ASCII заменено на \uXXXX. Для таких случаев у ПараметрыЗаписиJSON есть параметры экранирования:
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку(Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет,, Истина,
ЭкранированиеСимволовJSON.СимволыВнеASCII, Истина, Истина, Истина, Истина, Истина));
По порядку: без переносов, без отступа, двойные кавычки, экранировать символы вне ASCII, затем угловые скобки, разделители строк, амперсанд, одинарные кавычки и слеш. Без нужды всё это не включайте: JSON раздувается и плохо читается в логе.
Как прочитать JSON в 1С: в структуру или в соответствие?
Чтение зеркально записи: ЧтениеJSON, источник (строка или файл) и глобальная функция ПрочитатьJSON. Её второй параметр решает, во что превратятся объекты JSON: Ложь даёт структуру, Истина даёт соответствие. Рабочий вариант из конфигурации с JWT-авторизацией:
Функция ПрочитатьСтрокуJSON(Знач СтрокаJSON, Знач ИменаСвойствСоЗначениямиДата = Неопределено,
ПрочитатьВСоответствие = Истина) Экспорт
Результат = Неопределено;
Попытка
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(СтрокаJSON);
Результат = ПрочитатьJSON(ЧтениеJSON, ПрочитатьВСоответствие, ИменаСвойствСоЗначениямиДата);
Исключение
ЗаписьЖурналаРегистрации("JWT", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
Возврат Неопределено;
КонецПопытки;
Возврат Результат;
КонецФункции
Разбор у меня всегда стоит в Попытке. Честно говоря, чужой JSON приходит битым чаще, чем кажется, и упавший обмен без записи в журнале потом приходится разбирать по догадкам.
Почему соответствие безопаснее структуры?
Строку JSON в структуру прочитать можно, и часто так и делают. Я по умолчанию читаю в соответствие, и у этого три причины.
- Имена свойств. Ключ структуры обязан быть правильным идентификатором 1С. Свойства
order-id,1c_codeили@typeв структуру не лягут,ПрочитатьJSONупадёт на первом же таком ключе. В соответствии ключом может быть любая строка. - Регистр. В JSON
Nameиnameэто разные свойства, а в структуре 1С это один ключ. Соответствие хранит ключи как есть. - Отсутствующие поля.
Данные.orderпри отсутствии свойства даёт исключение.Данные.Получить("order")илиДанные["order"]вернётНеопределено, и это спокойно проверяется вЕсли.
Как это выглядит в обработчике, который принимает заказ с сайта:
Данные = ns_Обмен.ПрочитатьСтрокуJSON(ДанныеJSON, ИменаСвойствСоЗначениямиДата);
ДанныеЗаказа = Данные.Получить("order");
Если ДанныеЗаказа <> Неопределено Тогда
Результат = ns_Документы.ДобавитьОбновитьЗаказ(ДанныеЗаказа);
Если Результат = Неопределено Тогда
КодОтвета = 400;
КонецЕсли;
Иначе
КодОтвета = 400;
КонецЕсли;
Структура удобна, когда формат ваш и стабилен: обращение через точку короче и подсказывается в конфигураторе. Для ответа чужого API выбирайте соответствие.
Чтение JSON из файла
Файл открывается методом ОткрытьФайл, дальше всё так же:
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.ОткрытьФайл(КаталогВременныхФайлов() + "ВыгрузкаJSON.txt");
Результат = ПрочитатьJSON(ЧтениеJSON, Истина);
ЧтениеJSON.Закрыть();
После чтения из массива соответствий можно восстановить элементы справочника с теми же ссылками. Идентификатор, который при записи ушёл через XMLСтрока, превращается обратно в ссылку:
Для каждого ТекущийОбъект Из СписокОбъектов Цикл
НоваяСсылка = Справочники.Номенклатура.ПолучитьСсылку(
Новый УникальныйИдентификатор(ТекущийОбъект["Ссылка"]));
НовыйОбъект = Справочники.Номенклатура.СоздатьЭлемент();
НовыйОбъект.УстановитьСсылкуНового(НоваяСсылка);
НовыйОбъект.Наименование = ТекущийОбъект["Наименование"];
НовыйОбъект.Код = ТекущийОбъект["Код"];
НовыйОбъект.Записать();
КонецЦикла;
Даты, числа и null: что происходит при преобразовании
Типов в JSON меньше, чем в 1С, поэтому на границе часть информации теряется. Где именно, проще показать таблицей:
| Значение | При записи из 1С | При чтении в 1С |
|---|---|---|
| Дата | строка, формат задают НастройкиСериализацииJSON |
строка, пока не указать свойство в ИменаСвойствСоЗначениямиДата |
| Число | число с точкой как разделителем | Число |
Неопределено / null |
null |
Неопределено |
| Пустая строка | "" |
пустая строка, не Неопределено |
| Ссылка | ошибка типа, нужна XMLСтрока |
строка с идентификатором |
Как передать дату в JSON 1С?
При записи формат даты задают два свойства настроек. ФорматСериализацииДаты = ФорматДатыJSON.ISO даёт строку вида 2026-10-21T15:30:00. ВариантЗаписиДаты = ВариантЗаписиДатыJSON.ЛокальнаяДатаСоСмещением добавляет часовой пояс: +03:00. Смещение я пишу всегда: сервер сайта часто живёт в UTC, и без смещения заказ из 23:30 по Москве попадёт не в тот день.
При чтении даты сами собой не распознаются, приходят строкой. Чтобы получить тип Дата, имена таких свойств передают третьим параметром ПрочитатьJSON:
ИменаСвойствСоЗначениямиДата = Новый Массив;
ИменаСвойствСоЗначениямиДата.Добавить("updated_at");
ИменаСвойствСоЗначениямиДата.Добавить("date");
Данные = ПрочитатьСтрокуJSON(Результат.Тело, ИменаСвойствСоЗначениямиДата);
Это рабочий фрагмент из обмена 1С с сайтом на Django. Если в JSON дата в другом формате, например 21.10.2026, такой список не поможет: строку придётся разбирать самостоятельно.
Числа и пустые значения
Число из 1С в JSON уходит числом, без пробелов между разрядами. Проблема начинается, когда другая сторона ждёт строку, а программист отдаёт результат Строка(Сумма): получается 1 250,50 с неразрывным пробелом и запятой. Для таких полей в обмене с сайтом у меня есть отдельная функция:
Функция ДобавитьЗначение(ТекущееЗначение, ПреобразоватьЧислоВСтроку = Ложь) Экспорт
Если НЕ ЗначениеЗаполнено(ТекущееЗначение) Тогда
Возврат Неопределено; // в JSON уйдёт null
КонецЕсли;
Если ТипЗнч(ТекущееЗначение) = Тип("Строка") Тогда
Возврат СокрЛП(ТекущееЗначение);
КонецЕсли;
Если ТипЗнч(ТекущееЗначение) = Тип("Число") Тогда
Если ПреобразоватьЧислоВСтроку Тогда
Возврат Формат(ТекущееЗначение, "ЧДЦ=2; ЧРГ=''; ЧГ=0");
Иначе
Возврат ТекущееЗначение;
КонецЕсли;
КонецЕсли;
Если ТипЗнч(ТекущееЗначение) = Тип("Дата") Тогда
Возврат Формат(ТекущееЗначение, "ДФ=yyyy-MM-dd");
КонецЕсли;
// Ссылку на справочник отдаём идентификатором
МетаданныеПолноеИмя = ТекущееЗначение.Метаданные().ПолноеИмя();
Если СтрНайти(МетаданныеПолноеИмя, "Справочник") > 0 Тогда
Возврат XMLСтрока(ТекущееЗначение);
КонецЕсли;
Возврат Неопределено;
КонецФункции
Здесь же решено, что пустое значение уходит как null, а не как 0 или "". О таком правиле лучше договориться с другой стороной заранее: для сайта «цена 0» и «цены нет» совсем не одно и то же.
Большой JSON: потоковая запись и чтение
ЗаписатьJSON и ПрочитатьJSON держат весь документ в памяти. Для ответа API на сотню записей это нормально. Для выгрузки всего справочника номенклатуры на сотни тысяч позиций уже нет: структура в памяти весит в разы больше самого файла.
На больших объёмах ЗаписьJSON пишут по элементам. В учебных конфигурациях такого кода нет, поэтому пример короткий и строго по синтаксис-помощнику:
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.ОткрытьФайл(ИмяФайла);
ЗаписьJSON.ЗаписатьНачалоМассива();
Пока Выборка.Следующий() Цикл
ЗаписьJSON.ЗаписатьНачалоОбъекта();
ЗаписьJSON.ЗаписатьИмяСвойства("code");
ЗаписьJSON.ЗаписатьЗначение(Выборка.Код);
ЗаписьJSON.ЗаписатьИмяСвойства("name");
ЗаписьJSON.ЗаписатьЗначение(Выборка.Наименование);
ЗаписьJSON.ЗаписатьКонецОбъекта();
КонецЦикла;
ЗаписьJSON.ЗаписатьКонецМассива();
ЗаписьJSON.Закрыть();
Выборка запроса читается по одной строке, и в памяти не копится ничего. Чтение тоже можно вести по токенам: ЧтениеJSON.Прочитать() сдвигается на следующий элемент, ТипТекущегоЗначения говорит, что под курсором, ТекущееЗначение отдаёт значение. Удобнее всего комбинировать: дойти до начала очередного объекта в массиве и прочитать только его через ПрочитатьJSON:
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.ОткрытьФайл(ИмяФайла);
Пока ЧтениеJSON.Прочитать() Цикл
Если ЧтениеJSON.ТипТекущегоЗначения = ТипЗначенияJSON.НачалоОбъекта Тогда
Элемент = ПрочитатьJSON(ЧтениеJSON, Истина); // один объект из массива
// обработать Элемент и забыть о нём
КонецЕсли;
КонецЦикла;
ЧтениеJSON.Закрыть();
Для HTTP-обмена объём лучше резать ещё раньше, страницами: клиент просит ?page=3, сервис отдаёт сто записей и ссылку на следующую страницу. Как это сделано в бэкенде для мобильного приложения, показано в статье про JSON и пагинацию в HTTP-сервисе 1С.
Для нетиповых значений есть ещё функция преобразования. Её имя и модуль передают в ЗаписатьJSON после настроек сериализации. Платформа вызывает её для каждого значения, которое не умеет записать сама, например для ссылки. Функция получает параметры Свойство, Значение, ДополнительныеПараметры, Отказ и возвращает то, что нужно записать вместо исходного значения. На небольших обменах я обычно обхожусь подготовкой данных, как в ДобавитьЗначение выше: так видно, что именно уходит наружу.
JSON в HTTP-запросе и HTTP-сервисе
Чаще всего JSON в 1С ходит по HTTP. Тут есть две стороны: 1С вызывает чужой API или сама отвечает как HTTP-сервис.
1С отправляет POST-запрос с JSON
Функция из обмена с сайтом на Django. Тело ставится через УстановитьТелоИзСтроки с кодировкой UTF-8 и без BOM, заголовок Content-Type объявлен явно:
HTTPСоединение = Новый HTTPСоединение(АдресСервера, Порт,,,, 30, SSL);
Заголовки = Новый Соответствие;
Заголовки.Вставить("Authorization", СтрШаблон("Token %1", Токен));
Заголовки.Вставить("Content-Type", "application/json");
HTTPЗапрос = Новый HTTPЗапрос(АдресРесурса, Заголовки);
HTTPЗапрос.УстановитьТелоИзСтроки(СформироватьJSON(ДанныеДляЗапроса),
КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
Результат = HTTPСоединение.ВызватьHTTPМетод("POST", HTTPЗапрос);
ДанныеВозврата = Новый Структура("Код, Тело", Результат.КодСостояния, Результат.ПолучитьТелоКакСтроку());
Ответ разбирается только после проверки кода состояния. Если сервер вернул 500 или 502, в теле HTML-страница ошибки, и ПрочитатьJSON на ней споткнётся о первый же символ <.
1С принимает и отдаёт JSON в HTTP-сервисе
Обработчик POST из учебного REST API, к которому обращается Python-клиент:
Функция ProductsV1POST(Запрос)
ДанныеJSON = Запрос.ПолучитьТелоКакСтроку();
Данные = ПрочитатьСтрокуJSON(ДанныеJSON);
ДанныеОтвета = СформироватьДанныеОтвета();
Попытка
Возврат ВернутьДанные(ДанныеОтвета,
Новый Структура("message, data", "Товары добавлены в базу", Данные), 200);
Исключение
Возврат ВернутьОшибку(ДанныеОтвета, ОписаниеОшибки(), 501);
КонецПопытки;
КонецФункции
Функция СформироватьОтвет(Данные, Код)
Ответ = Новый HTTPСервисОтвет(Код);
Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
ДанныеJSON = ЗаписатьСтрокуJSON(Данные, Истина);
Ответ.УстановитьТелоИзСтроки(ДанныеJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
Возврат Ответ;
КонецФункции
У ответа единый конверт: соответствие с ключами response и error. Клиенту не нужно гадать, где данные, а где описание ошибки. Как создать сам сервис, настроить шаблоны URL и опубликовать его, разобрано в статье HTTP-сервисы 1С. Если доступ к сервису закрыт токеном, полезная нагрузка JWT тоже JSON, и функции записи и чтения там те же; пример в разборе JWT-авторизации в 1С.
Сериализация объектов: когда нужен СериализаторXDTO
Запросы «1С сериализация JSON» обычно про другое: как выгрузить документ целиком, со всеми реквизитами и табличными частями, и загрузить его в другой базе. Обычный ЗаписатьJSON этого не умеет, а СериализаторXDTO умеет и пишет в тот же ЗаписьJSON:
Процедура СериализоватьXDTO_JSON(ОбъектСериализации) Экспорт
ЗаписьJSON = Новый ЗаписьJSON;
ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON(, Символы.Таб);
ЗаписьJSON.ОткрытьФайл(КаталогВременныхФайлов() + "ВыгрузкаXDTO_JSON.txt",,, ПараметрыЗаписиJSON);
СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, ОбъектСериализации, НазначениеТипаXML.Явное);
ЗаписьJSON.Закрыть();
КонецПроцедуры
Функция ДесериализоватьXDTO_JSON() Экспорт
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.ОткрытьФайл(КаталогВременныхФайлов() + "ВыгрузкаXDTO_JSON.txt");
ДесериализованныйОбъект = СериализаторXDTO.ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
Возврат ДесериализованныйОбъект;
КонецФункции
Формально это JSON, но со служебными полями 1С о типах. Сайт на Laravel такую выгрузку без отдельного разбора не поймёт, другая база 1С с той же конфигурацией прочитает её одной строкой. Отсюда правило: сериализатор нужен для обмена 1С ↔ 1С, а для внешних систем данные собирают в структуры и соответствия вручную. Как работают фабрика XDTO и пакеты и чем отличается выгрузка в XML, разобрано в статье XDTO в 1С.
Почему 1С пишет «Непредвиденный символ при чтении JSON» и что делать с другими ошибками
Сразу скажу, ошибки JSON в 1С почти всегда сводятся к пяти ситуациям:
| Ошибка | Типичная причина | Что проверить |
|---|---|---|
| Непредвиденный символ при чтении JSON | На вход пришёл не JSON: HTML-страница ошибки, пустое тело, текст OK, обрезанный ответ |
Код состояния ответа до разбора; первые 200 символов тела в журнале регистрации |
| Чтение в структуру падает на имени свойства | Имя свойства не идентификатор 1С (order-id, 1c_code) или ключи отличаются только регистром |
Читать в соответствие: второй параметр ПрочитатьJSON = Истина |
| Передано значение недопустимого типа при записи | В данных ссылка, таблица значений или объект | Ссылку привести к строке через XMLСтрока, таблицу переложить в массив соответствий |
| Приёмник данных JSON не открыт | ЗаписатьJSON вызван до УстановитьСтроку или ОткрытьФайл, либо после Закрыть() |
Порядок вызовов; один объект ЗаписьJSON на одну запись |
| Недопустимое состояние потока чтения JSON | ЧтениеJSON уже прочитан до конца или закрыт, а его читают снова |
Новый ЧтениеJSON на каждый разбор |
Есть ещё одна частая и при этом тихая ошибка: дата строкой там, где ждали Дата. Код не падает, но сравнение Данные["date"] > НачалоДня(ТекущаяДата()) сравнивает строку с датой. Если поле хранит дату, внесите его в ИменаСвойствСоЗначениямиДата.
Где отработать JSON-обмен на практике
Всё, что выше, это фундамент: запись, чтение, даты и транспорт по HTTP. В живой интеграции к нему добавляются журнал обмена, повторная отправка при сбоях, версии формата и защита от двойной загрузки одного заказа. Собрать это один раз на учебном проекте проще, чем чинить на рабочем обмене. Такой проект разбирается на курсе по интеграции 1С через HTTP-сервисы и JSON.