При интеграции сторонних систем с 1С через интерфейс REST API (OData) часто возникает необходимость обновить реквизиты объекта (справочника или документа), имея только значение бизнес-реквизита — например, код, артикул или ИНН. Рассмотрим, почему попытка выполнить обновление без предварительного получения уникального идентификатора (GUID) завершается ошибкой и какие альтернативные подходы позволяют решить эту задачу за один HTTP-запрос.
Проанализируем стандартное поведение интерфейса OData в платформе 1С:Предприятие при попытке отправить PATCH или PUT запрос с параметрами отбора.
Попытка передать параметры $filter и $top непосредственно в URL при вызове метода PATCH приводят к ошибке с кодом 19 (HTTP 405 Method Not Allowed): "Использованный HTTP метод запрещен в данном контексте".
Выясним причины такого поведения платформы:
PATCH, PUT, DELETE) адресованы строго конкретному ресурсу. В 1С канонический URL объекта обязательно должен содержать его уникальный идентификатор (например, Catalog_Номенклатура(guid'...')).$filter и $top поддерживаются платформой 1С исключительно для чтения данных через GET-запросы. Платформа не поддерживает групповые или условные операции изменения через стандартный OData.$batch): В рамках одного HTTP-запроса с типом $batch платформа не умеет передавать GUID, полученный в выполнении GET, в последующую операцию PATCH. Каждая операция изменения внутри пакета обязана содержать явный GUID.Из этого следует вывод: **в рамках стандартного OData 1С нельзя обновить объект за один HTTP-запрос без знания GUID**. Стандартный REST-сценарий требует двух последовательных запросов: сначала GET для поиска GUID, затем PATCH или PUT с полученным GUID.
Если условие «один HTTP-запрос» является критически важным для архитектуры интеграции, проанализируем проверенные варианты обхода этого ограничения.
Разберем наиболее удобный и рекомендованный способ — разработку собственного HTTP-сервиса на стороне 1С (в основной конфигурации или через расширение).
Схема реализации выглядит следующим образом:
/update_by_code) и HTTP-метод (POST или PATCH).Рассмотрим пример кода обработчика HTTP-сервиса:
Функция ОбновитьОбъектПоРеквизиту(Запрос)
// Получаем JSON из тела запроса
ТелоЗапроса = Запрос.ПолучитьТелоКакСтроку("UTF-8");
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(ТелоЗапроса);
Данные = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
// Выполняем поиск объекта по реквизиту
СсылкаНаОбъект = Справочники.Номенклатура.НайтиПоРеквизиту("Артикул", Данные.Артикул);
Если Не ЗначениеЗаполнено(СсылкаНаОбъект) Тогда
Ответ = Новый HTTPСервисОтвет(404);
Ответ.УстановитьТелоИзСтроки("Объект не найден", "UTF-8");
Возврат Ответ;
КонецЕсли;
// Модифицируем и записываем объект
Объект1С = СсылкаНаОбъект.ПолучитьОбъект();
Объект1С.Наименование = Данные.НовоеНаименование;
Объект1С.Записать();
Ответ = Новый HTTPСервисОтвет(200);
Ответ.УстановитьТелоИзСтроки("Объект успешно обновлен", "UTF-8");
Возврат Ответ;
КонецФункции
При таком подходе внешняя система делает всего один HTTP-запрос, а поиск через Справочники.<Имя>.НайтиПоРеквизиту() или Запрос 1С и запись объекта происходят полностью на стороне сервера 1С.
Рассмотрим сценарий, когда внешняя система сама создает объекты в 1С:
POST-запрос внешняя система самостоятельно генерирует UUID и передает его в поле Ref_Key.PATCH-запрос.Если протокол REST не является строгим требованием, рассмотрим использование Web-сервисов (SOAP). На стороне 1С создается метод Web-сервиса, принимающий ключ поиска и обновляемые значения. Сервер 1С производит поиск по реквизиту, метод ПолучитьОбъект() и запись в рамках одной SOAP-операции.
Таким образом, для выполнения обновления за один HTTP-запрос без знания GUID оптимальным решением является использование собственного **HTTP-сервиса** в 1С.