Рассмотрим достаточно распространенную задачу интеграции, когда требуется создать новый документ (например, ПриходныйОрдерНаТовары) в базе 1С из внешней системы (например, скрипта на PHP) посредством HTTP-запроса. Проанализируем типичные подводные камни, с которыми сталкиваются разработчики, выясним причину возникновения ошибок стандартного интерфейса и разберем по шагам создание собственного надежного HTTP-сервиса.
Первая мысль при необходимости создать объект извне — воспользоваться готовым стандартным интерфейсом OData, который предоставляет платформа 1С. Однако при отправке POST-запроса на создание документа разработчики часто получают от сервера ответ с кодом 500 и следующим содержанием:
{
"odata.error": {
"code": "-1",
"message": {
"lang": "ru",
"value": "Ошибка при выполнении обработчика - 'ОбработкаЗаполнения'"
}
}
}
Давайте выясним причину такого поведения. При попытке создать новый объект (документ, справочник) через OData, платформа автоматически инициализирует этот объект и вызывает событие ОбработкаЗаполнения в его модуле. Если в данном обработчике написан "тяжелый" прикладной код, который жестко завязан на пользовательский интерфейс, или ожидающий строго определенную структуру параметров (например, данные из документа-основания, которых OData не передает), происходит программный сбой.
Если мы хотим продолжить использовать именно OData, нам потребуется вмешаться в код самой конфигурации. Рассмотрим этот процесс подробнее:
ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка).Чаще всего проблема кроется в отсутствии проверок на тип входящего параметра ДанныеЗаполнения. Когда запрос приходит извне, этот параметр может быть равен Неопределено. Чтобы исправить ошибку, достаточно обернуть проблемный код в условие проверки или добавить игнорирование обработки при загрузке данных:
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
// Пропускаем выполнение, если идет загрузка данных извне
Если ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
// Остальной прикладной код...
КонецПроцедуры
Если исправлять чужой прикладной код нельзя (конфигурация на поддержке) или нужна более гибкая логика обработки входящих запросов от PHP, разработка собственного HTTP-сервиса станет идеальным выходом. В этом случае мы сможем принудительно отключить лишние обработчики, создавая объект в режиме загрузки.
Разберем по шагам процесс создания своего API в 1С:
HTTPСервис (назовем его, например, ApiIntegration)./create_order).Посмотрим на пример кода, который необходимо разместить в модуле HTTP-сервиса:
Функция ApiIntegrationСоздатьДокумент(Запрос)
// 1. Создаем пустой объект документа
НовыйДокумент = Документы.ПриходныйОрдерНаТовары.СоздатьДокумент();
НовыйДокумент.Дата = ТекущаяДата();
// Здесь можно получить тело запроса от PHP и распарсить JSON
// СтрокаЗапроса = Запрос.ПолучитьТелоКакСтроку();
// И заполнить реквизиты документа...
// 2. Включаем Режим Загрузки!
// Это ключевой момент: установка флага отключает запуск ОбработкиЗаполнения
// и других прикладных проверок, которые могут вызвать ошибку.
НовыйДокумент.ОбменДанными.Загрузка = Истина;
Попытка
// 3. Записываем объект без проведения
НовыйДокумент.Записать(РежимЗаписиДокумента.Запись);
// 4. Формируем успешный ответ для внешней системы
Ответ = Новый HTTPСервисОтвет(200);
Ответ.УстановитьТелоИзСтроки("Документ успешно создан. GUID: " + Строка(НовыйДокумент.Ссылка.УникальныйИдентификатор()));
Исключение
// 5. Обрабатываем возможные ошибки при записи
Ответ = Новый HTTPСервисОтвет(500);
Ответ.УстановитьТелоИзСтроки("Ошибка создания документа: " + ОписаниеОшибки());
КонецПопытки;
Возврат Ответ;
КонецФункции
Ключевым свойством здесь является использование ОбменДанными.Загрузка. Установив его в Истина, мы сообщаем платформе, что объект записывается программно в рамках обмена, и выполнять интерактивные или сложные проверки не требуется.
Чтобы созданный нами сервис стал доступен извне для скриптов PHP, проанализируем финальный шаг — публикацию базы.
Для публикации необходим настроенный веб-сервер (Apache или IIS). Перейдите в конфигураторе в меню Администрирование -> Публикация на веб-сервере. В открывшемся окне обязательно перейдите на вкладку HTTP-сервисы и установите галочку напротив созданного сервиса ApiIntegration. После нажатия кнопки публикации и перезапуска веб-сервера, ваш PHP-скрипт сможет отправлять POST-запросы по адресу вашей базы, безопасно создавая новые документы в обход всех проблемных проверок.