Возможно ли через OData удалить запись регистра сведений и как это сделать правильно?

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

При интеграции различных информационных систем на базе 1С:Предприятие через протокол OData (стандартный интерфейс REST) разработчики часто сталкиваются с необходимостью не только считывать или добавлять данные, но и удалять конкретные записи из регистров сведений. На первый взгляд задача кажется тривиальной: отправить HTTP DELETE запрос. Однако на практике 1С часто возвращает ошибку 405 Method Not Allowed или 404 Not Found. Разберем подробно, как правильно формировать такие запросы, проанализируем причины ошибок и рассмотрим особенности работы с различными типами регистров.

Суть проблемы и механизм идентификации записи

Рассмотрим стандартную ситуацию: нам необходимо очистить запись в регистре сведений после того, как внешняя система (например, 1С:Документооборот) обработала данные, переданные из другой базы (например, 1С:Комплексная автоматизация). Проблема заключается в том, что в отличие от справочников или документов, у которых есть уникальный идентификатор UUID (GUID), запись регистра сведений идентифицируется ключом записи. Ключ записи — это совокупность значений всех его измерений. Если регистр является периодическим, то в ключ также входит поле Period.

Когда мы пытаемся отправить запрос DELETE на адрес таблицы регистра без указания точного ключа, платформа блокирует операцию, так как метод DELETE для всей таблицы (набора записей без фильтра по ключу) запрещен в целях безопасности и логики работы протокола в 1С. Для успешного удаления нам нужно адресовать запрос конкретному ресурсу — единственной записи.

Правильный синтаксис формирования запроса

Проанализируем структуру URL, которая необходима платформе для однозначного определения записи. Синтаксис выглядит следующим образом:

DELETE /ib/odata/standard.odata/InformationRegister_ИмяРегистра(Измерение1=Значение, Измерение2=Значение, Period=datetime'...')

Рассмотрим реальный пример удаления записи из регистра ЦеныНоменклатуры. Допустим, нам нужно удалить цену, установленную на определенную дату для конкретной номенклатуры и вида цены. Запрос будет выглядеть так:


DELETE /ib/odata/standard.odata/InformationRegister_ЦеныНоменклатуры(
    Period=datetime'2020-02-25T00:00:00', 
    ВидЦен_Key=guid'7211d1e0-89b0-11e8-9897-4ccc6a9463a2', 
    Номенклатура_Key=guid'6212af9e-57e5-11ea-f38b-309c23b26523', 
    Характеристика_Key=guid'00000000-0000-0000-0000-000000000000'
)

В ответ на такой запрос сервер 1С вернет код 204 No Content, что означает успешное выполнение операции удаления.

Важные технические нюансы формирования ключа

При формировании строки запроса следует придерживаться строгих правил, иначе система выдаст ошибку 405 Method Not Allowed, так как не сможет сопоставить URL с конкретной записью и решит, что вы пытаетесь применить метод к коллекции записей.

  1. Состав измерений: В скобках должны быть перечислены все измерения, определенные в конфигураторе для данного регистра. Даже если измерение не заполнено, его необходимо указать.
  2. Формат GUID: Ссылочные типы данных передаются с префиксом guid и заключаются в одинарные кавычки. Если значение измерения пустое (пустая ссылка), обязательно передаем "нулевой" GUID: guid'00000000-0000-0000-0000-000000000000'.
  3. Формат Даты (Period): Для периодических регистров поле Period является обязательным. Оно передается в формате datetime'YYYY-MM-DDThh:mm:ss'. Обратите внимание на букву T между датой и временем.
  4. Порядок полей: Хотя теоретически OData позволяет указывать ключи в любом порядке, практика показывает, что наиболее стабильно 1С отрабатывает запросы, где поля перечислены в том же порядке, в котором они идут в списке измерений в конфигураторе.

Независимые и подчиненные регистры: в чем разница для OData?

Выясним причину, по которой метод DELETE может не работать даже при правильном ключе. В 1С существует два принципиально разных типа регистров сведений:

  1. Независимые регистры: Записи в них создаются и удаляются произвольно. Для них вышеописанный метод DELETE работает идеально.
  2. Регистры, подчиненные регистратору: Записи в таких регистрах жестко привязаны к документу. Вы не можете просто удалить запись из такого регистра через InformationRegister_..., так как это нарушит целостность данных. В этом случае необходимо либо удалять сам документ-регистратор, либо изменять его движения. Через OData это делается путем взаимодействия с сущностью документа, а не регистра.

Пакетное удаление записей (Batch-запросы)

Если перед нами стоит задача удалить не одну запись, а сотни или тысячи, отправка индивидуальных HTTP-запросов на каждую запись будет крайне медленной из-за накладных расходов на установку TCP-соединения и авторизацию. Рассмотрим альтернативный вариант — использование $batch запросов.

Технология Batch позволяет упаковать множество команд (включая DELETE) в один POST-запрос. Это значительно ускоряет очистку регистров. Внутри тела запроса вы перечисляете заголовки и пути для каждой удаляемой записи. Платформа обработает их внутри одной транзакции (если это предусмотрено логикой), что повышает надежность операции.

Права доступа и безопасность

Для выполнения удаления через OData пользователь, под чьими учетными данными выполняется запрос, должен обладать соответствующими правами в 1С. Недостаточно иметь право Чтение. Требуется право Изменение для регистра сведений. Поскольку в архитектуре 1С удаление записи регистра — это фактически запись пустого набора по определенному ключу, проверяется именно право на запись/изменение.

Также важно помнить, что при удалении записи через OData в базе 1С срабатывают стандартные события объекта: ПередЗаписью и ПриЗаписи. Если в коде конфигурации прописаны проверки, которые вызывают Отказ = Истина, то OData вернет ошибку 400 Bad Request с текстом ошибки из 1С.

Анализ кодов ответов сервера

Проанализируем основные ответы, которые мы можем получить от платформы при попытке удаления:

  1. 204 No Content: Всё прошло успешно, запись удалена.
  2. 404 Not Found: Запись с таким набором измерений не существует. Проверьте правильность GUID и времени в поле Period.
  3. 405 Method Not Allowed: Ошибка в структуре URL. Скорее всего, пропущено одно из измерений, либо допущена опечатка в имени поля. Система не смогла "собрать" уникальный ключ и запретила метод для всей таблицы.
  4. 401 Unauthorized: Проблемы с авторизацией или пользователю не разрешен доступ к стандартному интерфейсу OData.

Таким образом, удаление записей регистров сведений через OData — это мощный инструмент, требующий ювелирной точности при формировании URL. Соблюдение правил описания ключа записи позволяет эффективно управлять данными в 1С из внешних систем без использования тяжеловесных COM-соединений или сложных SOAP-сервисов.

← На главную