Рассмотрим распространенную задачу: необходимо наладить обмен данными между 1С и внешней системой (например, сайтом или самописным приложением). Изначально обмен был реализован через выгрузку/загрузку файлов, но теперь требуется перейти на более современный и надежный способ — API. При этом внешняя система будет инициатором обмена, то есть она будет отправлять запросы в 1С для создания или обновления данных, например, заказов клиентов.
Проанализируем, как реализовать такую схему, когда 1С выступает в роли сервера, принимающего запросы. Разберем два основных подхода: создание собственного HTTP-сервиса и использование стандартного интерфейса OData. Чтобы сделать процесс разработки эффективнее, можно опираться на существующий опыт использования фреймворков для интеграции систем 1С, которые помогают решать сложные задачи обмена без лишних усилий.
Этот подход является наиболее гибким и мощным. Он позволяет реализовать любую бизнес-логику на стороне 1С при обработке входящих запросов. Идея заключается в том, что мы создаем в конфигурации 1С специальную точку входа (endpoint), которая будет доступна по определенному URL и сможет принимать и обрабатывать HTTP-запросы.
Разберем процесс по шагам.
Создание HTTP-сервиса в конфигураторе
В дереве конфигурации перейдите в ветку Общие -> HTTP-сервисы и создайте новый сервис. Назовем его, например, WebAPI. Важнейшее свойство здесь — Корневой URL. Зададим ему значение, например, /api. Если вам требуется быстрая организация HTTP-сервиса, рекомендуется заранее подготовить модуль с универсальными процедурами, который позволит легко расширять API в будущем.
Создание шаблона URL и метода
Внутри нашего HTTP-сервиса нужно создать шаблон URL. Он определяет конкретный адрес, по которому будет обращаться внешняя система. Создадим шаблон с именем Orders и URL /orders. Для этого шаблона добавим метод, например, CreateOrder с типом HTTP-метода POST, так как мы планируем создавать новые объекты.
В свойстве "Обработчик" этого метода нужно указать имя экспортной процедуры из общего модуля, которая будет выполнять всю работу. Например, ИнтеграцияAPI.CreateOrder.
Передача данных: JSON в теле запроса
Возникает вопрос: как передать данные для создания заказа? Внешняя система может передать множество полей: клиент, товары, количество, цены и т.д. Передавать их в виде отдельных параметров в URL (.../create?param1=value1¶m2=value2) — плохая практика. Это неудобно, нечитаемо и имеет ограничения по длине.
Правильный подход — использовать работу с JSON в 1С и передавать все данные в теле POST-запроса. Это позволяет передавать структурированную информацию любого объема и сложности. Внешняя система будет формировать JSON-объект, аналогичный тому, что раньше выгружался в файл, и отправлять его в 1С.
Посмотрим на пример структуры JSON для создания заказа:
{
"ТипИнформации": "СозданиеЗаказа",
"Источник": "WebApp",
"Документы": [
{
"УИД_Заказа": "a1b2-c3d4-e5f6-g7h8",
"ДатаЗаказа": "2023-10-27T12:00:00",
"Клиент": "ООО Ромашка",
"Сумма": 15000,
"Товары": [
{
"Номенклатура": "Стол офисный",
"Количество": 1,
"Цена": 10000
},
{
"Номенклатура": "Стул офисный",
"Количество": 2,
"Цена": 2500
}
]
}
]
}
Обработка запроса в 1С (код)
Теперь напишем код обработчика в общем модуле ИнтеграцияAPI (не забудьте установить флаги "Сервер" и "Внешнее соединение" для модуля). Процедура должна принимать один параметр — объект типа HTTPСервисЗапрос.
Основная логика такова: получить тело запроса как строку, прочитать из нее JSON, проанализировать полученные данные и создать на их основе документы в 1С. В конце необходимо сформировать и вернуть ответ.
Посмотрим на пример кода:
Процедура CreateOrder(Запрос) Экспорт
// 1. Получаем тело запроса, где находится наш JSON
ТелоЗапросаСтрокой = Запрос.ПолучитьТелоКакСтроку("UTF-8");
// 2. Парсим JSON в объекты 1С (Структуры и Массивы)
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(ТелоЗапросаСтрокой);
ДанныеЗапроса = ПрочитатьJSON(ЧтениеJSON, Истина); // Истина - чтобы можно было изменять данные
ЧтениеJSON.Закрыть();
// 3. Проверяем корректность полученных данных
Если ДанныеЗапроса = Неопределено
Или НЕ ДанныеЗапроса.Свойство("ТипИнформации")
Или ДанныеЗапроса["ТипИнформации"] <> "СозданиеЗаказа" Тогда
// Если что-то не так, возвращаем ошибку
Ответ = Новый HTTPСервисОтвет(400); // 400 - Bad Request
Ответ.УстановитьТелоИзСтроки("Ошибка формата запроса. Неверный ТипИнформации.");
Возврат Ответ;
КонецЕсли;
// 4. Основная логика: обходим массив документов и создаем их
РезультатыОбработки = Новый Массив;
Для Каждого ДанныеДокумента Из ДанныеЗапроса.Документы Цикл
// Здесь вызывается ваша функция по созданию документа "Заказ покупателя"
// В нее передаются данные из ДанныеДокумента
// РезультатСоздания - это структура с полями УИД, Статус, Информация
РезультатСоздания = СоздатьЗаказПокупателяПоДанным(ДанныеДокумента);
РезультатыОбработки.Добавить(РезультатСоздания);
КонецЦикла;
// 5. Формируем ответ для внешней системы
СтруктураОтвета = Новый Структура;
СтруктураОтвета.Вставить("ТипИнформации", "РезультатЗагрузкиЗаказов");
СтруктураОтвета.Вставить("Документы", РезультатыОбработки);
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, СтруктураОтвета);
СтрокаJSONОтвета = ЗаписьJSON.Закрыть();
Ответ = Новый HTTPСервисОтвет(200); // 200 - OK
Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Ответ.УстановитьТелоИзСтроки(СтрокаJSONОтвета);
Возврат Ответ;
КонецПроцедуры
Авторизация и безопасность
Чтобы к вашему API не мог подключиться кто угодно, крайне важно правильно настроить авторизацию и обеспечить безопасность. Самый простой способ — Basic-аутентификация. Также для профессиональных решений часто требуется регистрация и авторизация мобильного или web-приложения через расширение 1С, что позволяет более гибко управлять доступом.
api_user) с ограниченными правами, достаточными только для выполнения операций обмена.Authorization с логином и паролем этого пользователя в формате Base64.Публикация на веб-сервере
Чтобы HTTP-сервис стал доступен извне, информационную базу необходимо опубликовать на веб-сервере (IIS или Apache). В процессе публикации не забудьте поставить галочку напротив вашего HTTP-сервиса WebAPI.
Платформа 1С:Предприятие 8 предоставляет мощный механизм, который во многих случаях позволяет обойтись без написания кода — стандартный интерфейс OData. Это унифицированный протокол для доступа к данным.
В чем его преимущество? Если вам нужно выполнять стандартные операции (создание, чтение, изменение, удаление объектов) и не требуется сложная бизнес-логика на стороне 1С в момент получения запроса, то изучите наше развернутое руководство по OData. Этот механизм часто используют для простых задач, таких как интеграция 1С с Google Таблицами или другими облачными сервисами.
Как это работает?
http://<адрес_базы>/odata/standard.odata/Document_ЗаказПокупателя, передав в теле запроса JSON со свойствами документа.Этот вариант значительно проще в настройке, так как не требует написания кода обработчиков. Однако он менее гибкий. Если при создании заказа нужно выполнить сложные проверки, создать связанные документы или запустить бизнес-процессы, то лучше использовать собственный HTTP-сервис.
Мы рассмотрели два мощных способа организации API на стороне 1С.
Используйте стандартный интерфейс OData, если вам нужны простые CRUD-операции (создание, чтение, обновление, удаление) и не требуется сложная логика обработки на стороне 1С. Это быстро и не требует программирования.
Используйте собственный HTTP-сервис, если требуется сложная валидация данных, выполнение комплексных операций или нужен полный контроль над форматом данных. Для отладки и проверки работоспособности ваших сервисов мы рекомендуем тестирование API (например, через Postman).
Для задачи, описанной в начале, где требуется просто создавать заказы по данным из внешней системы, оба подхода применимы. Но создание собственного HTTP-сервиса даст больше контроля и возможностей для дальнейшего развития интеграции.