Создание сервиса для обработки POST-запросов и изменения документов в 1С
Шаг 1: Создание шаблона URL и обработчика
Обработчик для POST-запроса
Функция Changesumm(Запрос) // Обработчик POST-запроса для изменения суммы документа
// Получаем тело запроса в формате JSON
Попытка
СтрокаJSON = Запрос.ПолучитьТелоКакСтроку();
Исключение
// Возвращаем ошибку при проблемах с получением тела запроса
Возврат Новый HTTPСервисОтвет(400, "Ошибка при получении тела запроса");
КонецПопытки;
// Разбираем JSON в структуру данных
Попытка
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(СтрокаJSON);
СтруктураВходныхПараметров = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
Исключение
// Возвращаем ошибку при некорректном формате JSON
Возврат Новый HTTPСервисОтвет(400, "Ошибка разбора JSON");
КонецПопытки;
// Передаем данные в модуль для обработки и получаем результат
ОбъектОтвета = АИР.ОбновитьСуммуПоДокументу(СтруктураВходныхПараметров);
// Формируем HTTP-ответ
Ответ = Новый HTTPСервисОтвет(200);
Ответ.УстановитьТелоИзСтроки(ОбъектОтвета);
Возврат Ответ;
КонецФункции
Важные моменты:
- Получение тела запроса: Используется метод
Запрос.ПолучитьТелоКакСтроку()для извлечения данных из POST-запроса. - Обработка ошибок: Добавлены обработчики исключений для предотвращения падения сервиса при некорректных данных.
- Проверка JSON: После разбора JSON данные передаются в модуль для дальнейшей обработки.
Пример тела запроса:
{
"cod": "00ЦБ-005884",
"summa": 32100
}
Шаг 2: Создание функции в общем модуле
Функция ОбновитьСуммуПоДокументу(СтруктураПараметров) Экспорт
Попытка
// Проверка входных параметров
Если НЕ СтруктураПараметров.Свойство("cod") ИЛИ НЕ СтруктураПараметров.Свойство("summa") Тогда
Возврат Новый HTTPСервисОтвет(400, "Invalid parameters: 'cod' and 'summa' are required");
КонецЕсли;
КодДокумента = СтруктураПараметров.cod;
НоваяСумма = СтруктураПараметров.summa;
// Поиск документа по номеру
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Ссылка
|ИЗ
| Документ.ОперацияПоПлатежнойКарте КАК Документ
|ГДЕ
| Документ.Номер = &Номер"; // Параметр для Номер без кавычек
Запрос.УстановитьПараметр("Номер", КодДокумента); // Устанавливаем параметр, значение КодДокумента будет в кавычках
// Отладочное сообщение: выводим запрос
Сообщить("Запрос: " + Запрос.Текст); // Выводим текст запроса для отладки
РЗ = Запрос.Выполнить().Выбрать();
// Если документ не найден
Если РЗ.Следующий() тогда
ДокументСсылка=РЗ.ССылка; //Сообщить(РЗ.номер);
иначе
Возврат "Нет такого документа";
Конецесли;
// Получаем первую строку из результата запроса
ДокументОбъект=ДокументСсылка.ПолучитьОбъект();;
// Проверка на наличие ссылки на объект
Если ДокументОбъект = Неопределено Тогда
Возврат Новый HTTPСервисОтвет(500, "Ошибка получения объекта документа");
КонецЕсли;
// Изменяем сумму
ДокументОбъект.СуммаДокумента = НоваяСумма;
// Обновляем сумму в табличной части, например, в табличной части "Расшифровка платежа"
Если ДокументОбъект.РасшифровкаПлатежа <> Неопределено Тогда
Для Каждого СтрокаТЧ Из ДокументОбъект.РасшифровкаПлатежа Цикл
// Логика изменения суммы в табличной части
// Например, распределение суммы пропорционально количеству
СтрокаТЧ.Сумма = НоваяСумма;
КонецЦикла;
КонецЕсли;
// Проводим документ
Попытка
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
//
Исключение
Возврат Новый HTTPСервисОтвет(500, "Ошибка проведения документа: " + ОписаниеОшибки());
КонецПопытки;
// Возвращаем успех
Возврат Новый HTTPСервисОтвет(200, "Document updated and posted successfully");
Исключение
// Логируем и возвращаем ошибку
Сообщить("Ошибка обновления документа: " + ОписаниеОшибки());
Возврат Новый HTTPСервисОтвет(500, "Internal server error: " + ОписаниеОшибки());
КонецПопытки;
КонецФункции
Ключевые моменты:
- Проверка входных данных: обязательная проверка наличия полей
codиsummaв структуре параметров. - Поиск документа: запрос для получения ссылки на документ должен использовать параметр с учетом кавычек.
- Обновление документа: проверяется наличие объекта документа и изменяется его сумма.
- Изменение табличной части: добавлена возможность обновлять суммы в строках табличной части документа.
- Обработка ошибок: исключения отлавливаются и возвращается сообщение для отладки.
- Обязательно пользуемся отладчиком с включенным автообнаружением HTTP-запросов.
Результат работы
Пример успешного JSON-ответа:
{
"status": "success",
"message": "Изменения успешно сохранены"
}
Пример ошибки:
{
"status": "error",
"message": "Нет такого документа"
}
Важные моменты для публикации и тестирования
- Публикация сервиса:
- Убедитесь, что серверный сервис опубликован на веб-сервере и доступен по URL.
- Настройте разрешения для вызова обработчиков.
- Тестирование:
- Используйте инструменты, такие как Postman или curl, для отправки POST-запросов.
- Проверяйте корректность передаваемого JSON.
- Логирование:
- Добавьте логирование на этапе обработки запроса и выполнения изменений для упрощения диагностики.
- Пример тела запроса:
Убедитесь, что JSON-запрос формируется в правильном формате:{ "cod": "00ЦБ-005884", "summa": 32100 }
