HTTP-сервисы в 1С

Создание модуля API с 5 шаблонами URL согласно мастер-классу для работы с категориями и товарами

1

Создание HTTP-сервиса API

Добавление нового HTTP-сервиса в раздел Общие

Переход к HTTP-сервисам

Находим раздел в дереве конфигурации

  1. 1В дереве конфигурации найдите раздел Общие
  2. 2Раскройте раздел Общие
  3. 3Найдите подраздел HTTP-сервисы
  4. 4Щелкните правой кнопкой на разделе HTTP-сервисы и выберите Добавить

Настройка модуля API

Указываем параметры согласно мастер-классу

  1. 1В поле Имя введите: API
  2. 2В поле Корневой URL введите: api
  3. 3Остальные настройки оставьте по умолчанию
2

Создание 5 шаблонов URL

Добавим все шаблоны согласно мастер-классу с точными маршрутами

Шаблон 1: Категории

Создаем первый шаблон для получения всех категорий

  1. 1Щелкните правой кнопкой на модуле API
  2. 2Выберите Добавить → Шаблон URL
  3. 3Имя: Категории
  4. 4Шаблон: /categories

Метод GET для Категории

Добавляем метод для получения категорий

  1. 1Щелкните правой кнопкой по шаблону Категории
  2. 2Нажмите Добавить → Метод
  3. 3Имя: GET
  4. 4HTTP-метод: GET
  5. 5Обработчик: ПолучитьКатегории

Шаблон 2: IDКатегории

Создаем шаблон для получения определенной категории

  1. 1Создайте новый шаблон URL аналогично
  2. 2Имя: IDКатегории
  3. 3Шаблон: /categories/{id}
  4. 4Добавьте метод GET
  5. 5Обработчик: ПолучитьОпределеннуюКатегорию

Шаблон 3: ТоварыКатегории

Создаем шаблон для получения товаров категории

  1. 1Создайте третий шаблон URL
  2. 2Имя: ТоварыКатегории
  3. 3Шаблон: /categories/{id}/products
  4. 4Добавьте метод GET
  5. 5Обработчик: ПолучитьТоварыКатегории

Шаблон 4: ВсеТовары

Создаем шаблон для получения всех товаров

  1. 1Создайте четвертый шаблон URL
  2. 2Имя: ВсеТовары
  3. 3Шаблон: /categories/products
  4. 4Добавьте метод GET
  5. 5Обработчик: ПолучитьВсеТовары

Шаблон 5: ОпределенныйТовар

Создаем шаблон для получения конкретного товара

  1. 1Создайте пятый шаблон URL
  2. 2Имя: ОпределенныйТовар
  3. 3Шаблон: /categories/{id}/products/{id_product}
  4. 4Добавьте метод GET
  5. 5Обработчик: ПолучитьОпределенныйТовар
3

Открытие модуля для программирования

Переходим к написанию кода обработчиков

Открытие модуля API

Открываем модуль для написания кода

  1. 1Щелкните правой кнопкой на модуле API
  2. 2Выберите Открыть модуль
  3. 3Откроется редактор кода модуля
  4. 4Здесь нужно вставить код из мастер-класса

Код обработчиков

В открывшемся модуле необходимо написать функции-обработчики: ПолучитьКатегории, ПолучитьОпределеннуюКатегорию, ПолучитьТоварыКатегории, ПолучитьВсеТовары, ПолучитьОпределенныйТовар. Код этих функций предоставляется в мастер-классе.

Пример кода обработчиков

Код функций для HTTP-сервиса


          Функция ПолучитьКатегории(Запрос)
    
    Попытка
        Ответ = Новый HTTPСервисОтвет(200);
        Ответ.Заголовки.Вставить("Content-Type", "application/json");
        
        МассивКатегорий = Новый Массив;
        
        ЗапросКатегорий = Новый Запрос;
        ЗапросКатегорий.Текст = 
            "ВЫБРАТЬ
            |   Категории.Ссылка,
            |   Категории.Код,
            |   Категории.Наименование
            |ИЗ
            |   Справочник.Категории КАК Категории
            |ГДЕ
            |   НЕ Категории.ЭтоГруппа
            |   И НЕ Категории.ПометкаУдаления";
        
        РезультатЗапроса = ЗапросКатегорий.Выполнить();
        Выборка = РезультатЗапроса.Выбрать();
        
        Пока Выборка.Следующий() Цикл
            Категория = Новый Структура;
            Категория.Вставить("id", Строка(Выборка.Ссылка.УникальныйИдентификатор()));
            Категория.Вставить("code", Выборка.Код);
            Категория.Вставить("name", Выборка.Наименование);
            
            МассивКатегорий.Добавить(Категория);
        КонецЦикла;
        
        ЗаписьJSON = Новый ЗаписьJSON;
        ЗаписьJSON.УстановитьСтроку();
        ЗаписатьJSON(ЗаписьJSON, МассивКатегорий);
        СтрокаJSON = ЗаписьJSON.Закрыть();
        
        Ответ.УстановитьТелоИзСтроки(СтрокаJSON);
        
        Возврат Ответ;
        
    Исключение
        Ответ = Новый HTTPСервисОтвет(500);
        Ответ.УстановитьТелоИзСтроки("Внутренняя ошибка сервера: " + ОписаниеОшибки());
        Возврат Ответ;
    КонецПопытки;
    
КонецФункции

Функция ПолучитьОпределеннуюКатегорию(Запрос)
    
    Попытка
        Ответ = Новый HTTPСервисОтвет(200);
        Ответ.Заголовки.Вставить("Content-Type", "application/json");
        
        ПараметрыЗапроса = Запрос.ПараметрыURL;
        ИдентификаторКатегории = ПараметрыЗапроса.Получить("id");
        
        Если ИдентификаторКатегории = Неопределено Тогда
            Ответ = Новый HTTPСервисОтвет(400);
            Ответ.УстановитьТелоИзСтроки("Ошибка: не указан идентификатор категории");
            Возврат Ответ;
        КонецЕсли;
        
        Попытка
            СсылкаКатегории = Справочники.Категории.ПолучитьСсылку(Новый УникальныйИдентификатор(ИдентификаторКатегории));
        Исключение
            Ответ = Новый HTTPСервисОтвет(400);
            Ответ.УстановитьТелоИзСтроки("Ошибка: неверный формат идентификатора категории");
            Возврат Ответ;
        КонецПопытки;
        
        ЗапросКатегории = Новый Запрос;
        ЗапросКатегории.Текст = 
            "ВЫБРАТЬ
            |   Категории.Ссылка,
            |   Категории.Код,
            |   Категории.Наименование
            |ИЗ
            |   Справочник.Категории КАК Категории
            |ГДЕ
            |   Категории.Ссылка = &Ссылка";
        
        ЗапросКатегории.УстановитьПараметр("Ссылка", СсылкаКатегории);
        
        РезультатЗапроса = ЗапросКатегории.Выполнить();
        Выборка = РезультатЗапроса.Выбрать();
        
        Если НЕ Выборка.Следующий() Тогда
            Ответ = Новый HTTPСервисОтвет(404);
            Ответ.УстановитьТелоИзСтроки("Категория не найдена");
            Возврат Ответ;
        КонецЕсли;
        
        Категория = Новый Структура;
        Категория.Вставить("id", Строка(Выборка.Ссылка.УникальныйИдентификатор()));
        Категория.Вставить("code", Выборка.Код);
        Категория.Вставить("name", Выборка.Наименование);
        
        ЗаписьJSON = Новый ЗаписьJSON;
        ЗаписьJSON.УстановитьСтроку();
        ЗаписатьJSON(ЗаписьJSON, Категория);
        СтрокаJSON = ЗаписьJSON.Закрыть();
        
        Ответ.УстановитьТелоИзСтроки(СтрокаJSON);
        
        Возврат Ответ;
        
    Исключение
        Ответ = Новый HTTPСервисОтвет(500);
        Ответ.УстановитьТелоИзСтроки("Внутренняя ошибка сервера: " + ОписаниеОшибки());
        Возврат Ответ;
    КонецПопытки;
    
КонецФункции

Функция ПолучитьТоварыКатегории(Запрос)
    
    Попытка
        Ответ = Новый HTTPСервисОтвет(200);
        Ответ.Заголовки.Вставить("Content-Type", "application/json");
        
        ПараметрыЗапроса = Запрос.ПараметрыURL;
        ИдентификаторКатегории = ПараметрыЗапроса.Получить("id");
        
        Если ИдентификаторКатегории = Неопределено Тогда
            Ответ = Новый HTTPСервисОтвет(400);
            Ответ.УстановитьТелоИзСтроки("Ошибка: не указан идентификатор категории");
            Возврат Ответ;
        КонецЕсли;
        
        Попытка
            СсылкаКатегории = Справочники.Категории.ПолучитьСсылку(Новый УникальныйИдентификатор(ИдентификаторКатегории));
        Исключение
            Ответ = Новый HTTPСервисОтвет(400);
            Ответ.УстановитьТелоИзСтроки("Ошибка: неверный формат идентификатора категории");
            Возврат Ответ;
        КонецПопытки;
        
        МассивТоваров = Новый Массив;
        
        ЗапросТоваров = Новый Запрос;
        ЗапросТоваров.Текст = 
            "ВЫБРАТЬ
            |   Товары.Ссылка,
            |   Товары.Код,
            |   Товары.Наименование,
            |   Товары.Артикул,
            |   Товары.Цена,
            |   Товары.ЕдиницаИзмерения,
            |   Товары.Активен
            |ИЗ
            |   Справочник.Товары КАК Товары
            |ГДЕ
            |   Товары.Категория = &Категория
            |   И Товары.Активен = Истина
            |   И НЕ Товары.ПометкаУдаления";
        
        ЗапросТоваров.УстановитьПараметр("Категория", СсылкаКатегории);
        
        РезультатЗапроса = ЗапросТоваров.Выполнить();
        Выборка = РезультатЗапроса.Выбрать();
        
        Пока Выборка.Следующий() Цикл
            Товар = Новый Структура;
            Товар.Вставить("id", Строка(Выборка.Ссылка.УникальныйИдентификатор()));
            Товар.Вставить("code", Выборка.Код);
            Товар.Вставить("name", Выборка.Наименование);
            Товар.Вставить("article", Выборка.Артикул);
            Товар.Вставить("price", Выборка.Цена);
            Товар.Вставить("unit", Строка(Выборка.ЕдиницаИзмерения));
            Товар.Вставить("active", Выборка.Активен);
            
            МассивТоваров.Добавить(Товар);
        КонецЦикла;
        
        ЗаписьJSON = Новый ЗаписьJSON;
        ЗаписьJSON.УстановитьСтроку();
        ЗаписатьJSON(ЗаписьJSON, МассивТоваров);
        СтрокаJSON = ЗаписьJSON.Закрыть();
        
        Ответ.УстановитьТелоИзСтроки(СтрокаJSON);
        
        Возврат Ответ;
        
    Исключение
        Ответ = Новый HTTPСервисОтвет(500);
        Ответ.УстановитьТелоИзСтроки("Внутренняя ошибка сервера: " + ОписаниеОшибки());
        Возврат Ответ;
    КонецПопытки;
    
КонецФункции

Функция ПолучитьВсеТовары(Запрос)
    
    Попытка
        Ответ = Новый HTTPСервисОтвет(200);
        Ответ.Заголовки.Вставить("Content-Type", "application/json");
        
        МассивТоваров = Новый Массив;
        
        ЗапросТоваров = Новый Запрос;
        ЗапросТоваров.Текст = 
            "ВЫБРАТЬ
            |   Товары.Ссылка,
            |   Товары.Код,
            |   Товары.Наименование,
            |   Товары.Артикул,
            |   Товары.Цена,
            |   Товары.ЕдиницаИзмерения,
            |   Товары.Активен,
            |   Товары.Категория.Код КАК КодКатегории,
            |   Товары.Категория.Наименование КАК НаименованиеКатегории
            |ИЗ
            |   Справочник.Товары КАК Товары
            |ГДЕ
            |   Товары.Активен = Истина
            |   И НЕ Товары.ПометкаУдаления";
        
        РезультатЗапроса = ЗапросТоваров.Выполнить();
        Выборка = РезультатЗапроса.Выбрать();
        
        Пока Выборка.Следующий() Цикл
            Товар = Новый Структура;
            Товар.Вставить("id", Строка(Выборка.Ссылка.УникальныйИдентификатор()));
            Товар.Вставить("code", Выборка.Код);
            Товар.Вставить("name", Выборка.Наименование);
            Товар.Вставить("article", Выборка.Артикул);
            Товар.Вставить("price", Выборка.Цена);
            Товар.Вставить("unit", Строка(Выборка.ЕдиницаИзмерения));
            Товар.Вставить("active", Выборка.Активен);
            
            Категория = Новый Структура;
            Категория.Вставить("code", Выборка.КодКатегории);
            Категория.Вставить("name", Выборка.НаименованиеКатегории);
            Товар.Вставить("category", Категория);
            
            МассивТоваров.Добавить(Товар);
        КонецЦикла;
        
        ЗаписьJSON = Новый ЗаписьJSON;
        ЗаписьJSON.УстановитьСтроку();
        ЗаписатьJSON(ЗаписьJSON, МассивТоваров);
        СтрокаJSON = ЗаписьJSON.Закрыть();
        
        Ответ.УстановитьТелоИзСтроки(СтрокаJSON);
        
        Возврат Ответ;
        
    Исключение
        Ответ = Новый HTTPСервисОтвет(500);
        Ответ.УстановитьТелоИзСтроки("Внутренняя ошибка сервера: " + ОписаниеОшибки());
        Возврат Ответ;
    КонецПопытки;
    
КонецФункции

Функция ПолучитьОпределенныйТовар(Запрос) Экспорт
    
    Попытка
        Ответ = Новый HTTPСервисОтвет(200);
        Ответ.Заголовки.Вставить("Content-Type", "application/json");
        
        ПараметрыЗапроса = Запрос.ПараметрыURL;
        ИдентификаторТовара = ПараметрыЗапроса.Получить("id_product");
        
        Если ИдентификаторТовара = Неопределено Тогда
            Ответ = Новый HTTPСервисОтвет(400);
            Ответ.УстановитьТелоИзСтроки("Ошибка: не указан идентификатор товара");
            Возврат Ответ;
        КонецЕсли;
        
        Попытка
            СсылкаТовара = Справочники.Товары.ПолучитьСсылку(Новый УникальныйИдентификатор(ИдентификаторТовара));
        Исключение
            Ответ = Новый HTTPСервисОтвет(400);
            Ответ.УстановитьТелоИзСтроки("Ошибка: неверный формат идентификатора товара");
            Возврат Ответ;
        КонецПопытки;
        
        ЗапросТовара = Новый Запрос;
        ЗапросТовара.Текст = 
            "ВЫБРАТЬ
            |   Товары.Ссылка,
            |   Товары.Код,
            |   Товары.Наименование,
            |   Товары.Артикул,
            |   Товары.Цена,
            |   Товары.ЕдиницаИзмерения,
            |   Товары.Активен,
            |   Товары.Категория.Код КАК КодКатегории,
            |   Товары.Категория.Наименование КАК НаименованиеКатегории
            |ИЗ
            |   Справочник.Товары КАК Товары
            |ГДЕ
            |   Товары.Ссылка = &Ссылка
            |   И Товары.Активен = Истина
            |   И НЕ Товары.ПометкаУдаления";
        
        ЗапросТовара.УстановитьПараметр("Ссылка", СсылкаТовара);
        
        РезультатЗапроса = ЗапросТовара.Выполнить();
        Выборка = РезультатЗапроса.Выбрать();
        
        Если НЕ Выборка.Следующий() Тогда
            Ответ = Новый HTTPСервисОтвет(404);
            Ответ.УстановитьТелоИзСтроки("Товар не найден");
            Возврат Ответ;
        КонецЕсли;
        
        Товар = Новый Структура;
        Товар.Вставить("id", Строка(Выборка.Ссылка.УникальныйИдентификатор()));
        Товар.Вставить("code", Выборка.Код);
        Товар.Вставить("name", Выборка.Наименование);
        Товар.Вставить("article", Выборка.Артикул);
        Товар.Вставить("price", Выборка.Цена);
        Товар.Вставить("unit", Строка(Выборка.ЕдиницаИзмерения));
        Товар.Вставить("active", Выборка.Активен);
        
        Категория = Новый Структура;
        Категория.Вставить("code", Выборка.КодКатегории);
        Категория.Вставить("name", Выборка.НаименованиеКатегории);
        Товар.Вставить("category", Категория);
        
        ЗаписьJSON = Новый ЗаписьJSON;
        ЗаписьJSON.УстановитьСтроку();
        ЗаписатьJSON(ЗаписьJSON, Товар);
        СтрокаJSON = ЗаписьJSON.Закрыть();
        
        Ответ.УстановитьТелоИзСтроки(СтрокаJSON);
        
        Возврат Ответ;
        
    Исключение
        Ответ = Новый HTTPСервисОтвет(500);
        Ответ.УстановитьТелоИзСтроки("Внутренняя ошибка сервера: " + ОписаниеОшибки());
        Возврат Ответ;
    КонецПопытки;
    
КонецФункции
4

Создание пользователя admin

Создаем пользователя для работы с API

Переход к администрированию

Создаем пользователя согласно мастер-классу

  1. 1В верхней панели нажмите Администрирование
  2. 2Выберите Пользователи
  3. 3Добавьте нового пользователя
  4. 4Имя пользователя: admin
  5. 5Пароль: root
  6. 6Назначьте роль Администратор
5

Запуск и проверка

Тестируем созданные HTTP-сервисы

Запуск базы

Переходим в режим Предприятие для тестирования

  1. 1Нажмите Ctrl+F5 или используйте верхнюю панель Сервис → 1С:Предприятие
  2. 2Согласитесь с изменениями конфигурации
  3. 3Введите пароль, если потребуется: root
  4. 4База должна успешно запуститься

Готовность к следующему этапу

HTTP-сервисы созданы и готовы к работе. После настройки Apache и публикации сервисов, API будет доступно по адресам вида: http://localhost:80/chvt2025/hs/api/categories/

HTTP-сервисы готовы!

Модуль API с 5 шаблонами URL создан согласно мастер-классу. Все обработчики настроены, пользователь admin создан. Можно переходить к установке Apache.

1СHTTP-сервисыAPIRESTОбработчики