Интеграция 1С с внешними сайтами и сервисами через REST OData — это мощный инструмент, который требует понимания внутренних механизмов платформы. Разберем по шагам, как правильно передавать данные для создания документов и на что обратить внимание при разработке.
Первый вопрос, который возникает при интеграции — где взять названия полей? Чтобы не гадать, используйте механизм метаданных самой платформы. Обратитесь к адресу вашей базы с добавлением $metadata в конце строки (например, адрес_базы/odata/standard.odata/$metadata). В ответ вы получите XML-файл, в котором подробно описана структура всех доступных объектов, включая точные имена полей, их типы данных и признаки обязательности.
При передаче JSON важно учитывать особенности ссылочных реквизитов. В 1С они передаются с суффиксом _Key. Рассмотрим структуру тела запроса для создания документа:
{
"Date": "2021-11-15T14:47:46",
"Number": "ПЭ21216142",
"ВалютаДокумента_Key": "e7a375a0-6ed4-11e3-b22c-d43d7e99f0b2",
"Комментарий": "Хозяйственные расходы",
"Организация_Key": "59fa81f1-56cd-11e5-b31b-00155d02010a",
"СуммаДокумента": 5100,
"ФизЛицо_Key": "4769ac90-6da0-11e5-b31b-00155d02010a",
"Posted": false
}
Если вы создаете новый документ, Ref_Key указывать не обязательно — 1С сгенерирует его автоматически. Однако, если вы хотите передать свой GUID, вы можете включить его в запрос, и система использует его как уникальный идентификатор объекта.
Передача табличных частей — один из самых частых источников ошибок. Не стремитесь отправлять все поля, которые вы видите при GET-запросе существующего документа. Многие из них (например, LineNumber или навигационные ссылки) 1С формирует самостоятельно.
Для добавления строк в табличную часть достаточно передать массив объектов, содержащий только ключевые реквизиты: Номенклатура_Key, Количество, Цена, СтавкаНДС и т.д. Лишние данные часто приводят к ошибкам валидации, так как платформа пытается перезаписать защищенные системные поля.
Интерфейс REST OData поддерживает полноценное управление объектами:
POST для отправки нового документа.PATCH для обновления отдельных реквизитов, чтобы не передавать весь объект целиком.DELETE-запрос по адресу конкретной строки, например: адрес_базы/odata/standard.odata/Document_ЗаказКлиента_Товары(guid'...').Многие разработчики совершают ошибку, пытаясь передать учетные данные через параметры URL. Помните, что авторизация осуществляется исключительно через HTTP-заголовки. Стандартным протоколом является Basic Authentication.
Если вы пишете на PHP или используете curl, процесс выглядит следующим образом:
$username = "Администратор";
$password = "1";
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, $username . ":" . $password);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$output = curl_exec($ch);
Внутри 1С, если вы взаимодействуете с другой базой через HTTPСоединение, используйте конструктор:
СоединениеOData = Новый HTTPСоединение(АдресВебСервера, Порт, ИмяПользователя, Пароль);
Ошибка Значение поля \"Дата\" не может быть пустой датой почти всегда означает нарушение формата ISO 8601. Убедитесь, что ваша дата передается в формате YYYY-MM-DDTHH:MM:SS. Если вы передаете пустую строку или некорректный формат, 1С не сможет распознать значение, и транзакция будет отклонена. Всегда проверяйте, чтобы в поле Date была корректная строка, соответствующая времени в формате UTC или локальном времени сервера 1С.
Анализируя ситуацию, помните: REST OData — это строгий стандарт. Чем меньше «лишней» информации вы отправляете в теле JSON, тем стабильнее будет работать ваша интеграция. Начинайте с минимально необходимого набора полей, и постепенно расширяйте его по мере необходимости.