Как за один HTTP-запрос обновить объект в 1С через OData, не зная его GUID?

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

При интеграции сторонних систем с 1С через интерфейс REST API (OData) часто возникает необходимость обновить реквизиты объекта (справочника или документа), имея только значение бизнес-реквизита — например, код, артикул или ИНН. Рассмотрим, почему попытка выполнить обновление без предварительного получения уникального идентификатора (GUID) завершается ошибкой и какие альтернативные подходы позволяют решить эту задачу за один HTTP-запрос.

Анализ проблемы и ограничений OData в 1С

Проанализируем стандартное поведение интерфейса OData в платформе 1С:Предприятие при попытке отправить PATCH или PUT запрос с параметрами отбора.

Попытка передать параметры $filter и $top непосредственно в URL при вызове метода PATCH приводят к ошибке с кодом 19 (HTTP 405 Method Not Allowed): "Использованный HTTP метод запрещен в данном контексте".

Выясним причины такого поведения платформы:

  1. Концептуальные ограничения REST: Архитектура REST предусматривает, что модифицирующие запросы (PATCH, PUT, DELETE) адресованы строго конкретному ресурсу. В 1С канонический URL объекта обязательно должен содержать его уникальный идентификатор (например, Catalog_Номенклатура(guid'...')).
  2. Ограничение параметров отбора: Параметры $filter и $top поддерживаются платформой 1С исключительно для чтения данных через GET-запросы. Платформа не поддерживает групповые или условные операции изменения через стандартный OData.
  3. Ограничения пакетных запросов ($batch): В рамках одного HTTP-запроса с типом $batch платформа не умеет передавать GUID, полученный в выполнении GET, в последующую операцию PATCH. Каждая операция изменения внутри пакета обязана содержать явный GUID.

Из этого следует вывод: **в рамках стандартного OData 1С нельзя обновить объект за один HTTP-запрос без знания GUID**. Стандартный REST-сценарий требует двух последовательных запросов: сначала GET для поиска GUID, затем PATCH или PUT с полученным GUID.

Альтернативные способы решения за один HTTP-запрос

Если условие «один HTTP-запрос» является критически важным для архитектуры интеграции, проанализируем проверенные варианты обхода этого ограничения.

Вариант 1. Создание собственного HTTP-сервиса (HTTPService)

Разберем наиболее удобный и рекомендованный способ — разработку собственного HTTP-сервиса на стороне 1С (в основной конфигурации или через расширение).

Схема реализации выглядит следующим образом:

  1. В конфигураторе создается объект метаданных HTTP-сервис.
  2. Настраивается шаблон URL (например, /update_by_code) и HTTP-метод (POST или PATCH).
  3. В обработчике на языке BSL пишется логика поиска и обновления объекта.

Рассмотрим пример кода обработчика HTTP-сервиса:


Функция ОбновитьОбъектПоРеквизиту(Запрос)
    
    // Получаем JSON из тела запроса
    ТелоЗапроса = Запрос.ПолучитьТелоКакСтроку("UTF-8");
    ЧтениеJSON = Новый ЧтениеJSON;
    ЧтениеJSON.УстановитьСтроку(ТелоЗапроса);
    Данные = ПрочитатьJSON(ЧтениеJSON);
    ЧтениеJSON.Закрыть();
    
    // Выполняем поиск объекта по реквизиту
    СсылкаНаОбъект = Справочники.Номенклатура.НайтиПоРеквизиту("Артикул", Данные.Артикул);
    
    Если Не ЗначениеЗаполнено(СсылкаНаОбъект) Тогда
        Ответ = Новый HTTPСервисОтвет(404);
        Ответ.УстановитьТелоИзСтроки("Объект не найден", "UTF-8");
        Возврат Ответ;
    КонецЕсли;
    
    // Модифицируем и записываем объект
    Объект1С = СсылкаНаОбъект.ПолучитьОбъект();
    Объект1С.Наименование = Данные.НовоеНаименование;
    Объект1С.Записать();
    
    Ответ = Новый HTTPСервисОтвет(200);
    Ответ.УстановитьТелоИзСтроки("Объект успешно обновлен", "UTF-8");
    Возврат Ответ;
    
КонецФункции

При таком подходе внешняя система делает всего один HTTP-запрос, а поиск через Справочники.<Имя>.НайтиПоРеквизиту() или Запрос 1С и запись объекта происходят полностью на стороне сервера 1С.

Вариант 2. Передача GUID из внешней системы при создании

Рассмотрим сценарий, когда внешняя система сама создает объекты в 1С:

  1. При первичном создании объекта через OData POST-запрос внешняя система самостоятельно генерирует UUID и передает его в поле Ref_Key.
  2. Сторонняя система сохраняет этот GUID в своей базе данных.
  3. В дальнейшем для любых обновлений используется уже известное значение GUID напрямую через стандартный PATCH-запрос.

Вариант 3. Использование SOAP Web-сервисов

Если протокол REST не является строгим требованием, рассмотрим использование Web-сервисов (SOAP). На стороне 1С создается метод Web-сервиса, принимающий ключ поиска и обновляемые значения. Сервер 1С производит поиск по реквизиту, метод ПолучитьОбъект() и запись в рамках одной SOAP-операции.

Таким образом, для выполнения обновления за один HTTP-запрос без знания GUID оптимальным решением является использование собственного **HTTP-сервиса** в 1С.

← На главную