Post запрос (изменение документа)

Создание сервиса для обработки 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: " + ОписаниеОшибки());
    КонецПопытки;
КонецФункции

Ключевые моменты:

  1. Проверка входных данных: обязательная проверка наличия полей cod и summa в структуре параметров.
  2. Поиск документа: запрос для получения ссылки на документ должен использовать параметр с учетом кавычек.
  3. Обновление документа: проверяется наличие объекта документа и изменяется его сумма.
  4. Изменение табличной части: добавлена возможность обновлять суммы в строках табличной части документа.
  5. Обработка ошибок: исключения отлавливаются и возвращается сообщение для отладки.
  6. Обязательно пользуемся отладчиком  с включенным автообнаружением HTTP-запросов.

Результат работы

Пример успешного JSON-ответа:

{
    "status": "success",
    "message": "Изменения успешно сохранены"
}

Пример ошибки:

{
    "status": "error",
    "message": "Нет такого документа"
}

Важные моменты для публикации и тестирования

  1. Публикация сервиса:
    • Убедитесь, что серверный сервис опубликован на веб-сервере и доступен по URL.
    • Настройте разрешения для вызова обработчиков.
  2. Тестирование:
    • Используйте инструменты, такие как Postman или curl, для отправки POST-запросов.
    • Проверяйте корректность передаваемого JSON.
  3. Логирование:
    • Добавьте логирование на этапе обработки запроса и выполнения изменений для упрощения диагностики.
  4. Пример тела запроса:
    Убедитесь, что JSON-запрос формируется в правильном формате:

    {
        "cod": "00ЦБ-005884",
        "summa": 32100
    }