При интеграции различных информационных систем на базе 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 с конкретной записью и решит, что вы пытаетесь применить метод к коллекции записей.
guid и заключаются в одинарные кавычки. Если значение измерения пустое (пустая ссылка), обязательно передаем "нулевой" GUID: guid'00000000-0000-0000-0000-000000000000'.Period является обязательным. Оно передается в формате datetime'YYYY-MM-DDThh:mm:ss'. Обратите внимание на букву T между датой и временем.Выясним причину, по которой метод DELETE может не работать даже при правильном ключе. В 1С существует два принципиально разных типа регистров сведений:
DELETE работает идеально.InformationRegister_..., так как это нарушит целостность данных. В этом случае необходимо либо удалять сам документ-регистратор, либо изменять его движения. Через OData это делается путем взаимодействия с сущностью документа, а не регистра.Если перед нами стоит задача удалить не одну запись, а сотни или тысячи, отправка индивидуальных HTTP-запросов на каждую запись будет крайне медленной из-за накладных расходов на установку TCP-соединения и авторизацию. Рассмотрим альтернативный вариант — использование $batch запросов.
Технология Batch позволяет упаковать множество команд (включая DELETE) в один POST-запрос. Это значительно ускоряет очистку регистров. Внутри тела запроса вы перечисляете заголовки и пути для каждой удаляемой записи. Платформа обработает их внутри одной транзакции (если это предусмотрено логикой), что повышает надежность операции.
Для выполнения удаления через OData пользователь, под чьими учетными данными выполняется запрос, должен обладать соответствующими правами в 1С. Недостаточно иметь право Чтение. Требуется право Изменение для регистра сведений. Поскольку в архитектуре 1С удаление записи регистра — это фактически запись пустого набора по определенному ключу, проверяется именно право на запись/изменение.
Также важно помнить, что при удалении записи через OData в базе 1С срабатывают стандартные события объекта: ПередЗаписью и ПриЗаписи. Если в коде конфигурации прописаны проверки, которые вызывают Отказ = Истина, то OData вернет ошибку 400 Bad Request с текстом ошибки из 1С.
Проанализируем основные ответы, которые мы можем получить от платформы при попытке удаления:
Period.Таким образом, удаление записей регистров сведений через OData — это мощный инструмент, требующий ювелирной точности при формировании URL. Соблюдение правил описания ключа записи позволяет эффективно управлять данными в 1С из внешних систем без использования тяжеловесных COM-соединений или сложных SOAP-сервисов.