Как правильно создать HTTP-запрос из одной базы 1С в другую и что делать, если возникает ошибка "Страница не найдена"?

Программист 1С v8.3 (Обычные формы)
← К списку

Приветствуем вас! Если вы столкнулись с ошибкой "Страница не найдена" (HTTP 404) при попытке выполнить HTTP-запрос из одной информационной базы 1С к другой, значит, мы вместе выясним причину и найдем решение. Эта проблема часто возникает из-за некорректной настройки серверной части или неправильного формирования адреса запроса. Давайте подробно разберем, как наладить взаимодействие между базами 1С с помощью HTTP-запросов. Мы рассмотрим два основных подхода к организации такого взаимодействия: через HTTP-сервисы, которые вы разрабатываете самостоятельно, и через стандартный интерфейс OData, предоставляемый платформой 1С.

Публикация информационной базы 1С на веб-сервере

Прежде чем мы сможем обратиться к другой базе 1С по протоколу HTTP, необходимо, чтобы эта база была опубликована на веб-сервере. Без этого шага любая попытка обращения к ней завершится ошибкой "Страница не найдена", поскольку веб-сервер просто не будет знать, куда маршрутизировать ваш запрос. Для публикации базы нам потребуется один из веб-серверов: IIS (Internet Information Services), который обычно используется в среде Windows Server, или Apache. Рассмотрим процесс публикации по шагам:

  1. Установка веб-сервера: Убедитесь, что на сервере, где находится целевая база 1С, установлен и настроен веб-сервер (IIS или Apache). Для IIS на Windows Server необходимо включить соответствующие компоненты, такие как "Расширения ISAPI" и "Фильтры ISAPI".
  2. Публикация через Конфигуратор: Откройте базу 1С в режиме Конфигуратор под пользователем с административными правами. Перейдите в меню "Администрирование" -> "Публикация на веб-сервере...".
  3. Настройка публикации:
    • Имя публикации: Укажите короткое и понятное имя, например, MyBaseService. Это имя будет частью URL-адреса вашей базы.
    • Каталог: Выберите или создайте каталог, куда будут сохраняться файлы публикации.
    • Веб-сервер: Выберите тип установленного веб-сервера (IIS или Apache).
    • Публикуемые сервисы: Очень важно установить флажки для тех HTTP-сервисов или интерфейса OData, которые вы планируете использовать. Если вы забудете это сделать, даже при опубликованной базе, сам сервис будет недоступен.
    • Публиковать стандартный интерфейс OData: Если вы планируете использовать OData, обязательно установите этот флажок.
    • Публиковать доступ для клиентских приложений: Этот флажок позволяет подключаться к базе через веб-клиент. Если вы планируете только программное взаимодействие через HTTP-сервисы/OData, его можно снять для повышения безопасности.
    • Использовать защищенное соединение (HTTPS): Для повышения безопасности передачи данных в интернете настоятельно рекомендуем использовать HTTPS. Для этого потребуется настроить SSL-сертификат на веб-сервере.
  4. Проверка разрядности Apache: Если вы используете Apache, убедитесь, что его разрядность (32-бит или 64-бит) соответствует разрядности клиентской платформы 1С, установленной на сервере.
  5. Перезапуск веб-сервера: После публикации обязательно перезапустите веб-сервер (IIS или Apache), чтобы изменения вступили в силу.

После успешной публикации вы сможете проверить доступность базы, введя в адресную строку браузера примерно такой URL: http://<Адрес_Сервера>/<Имя_Публикации>/ru_RU/. Если база открывается, значит, основная публикация прошла успешно.

Использование HTTP-сервисов для взаимодействия

HTTP-сервисы в 1С — это мощный инструмент для организации произвольного API (Application Programming Interface), который позволяет обмениваться данными с другими системами, включая другие базы 1С.

Разработка HTTP-сервиса в конфигурации 1С

Давайте разберем процесс создания собственного HTTP-сервиса:

  1. Создание объекта метаданных: В конфигураторе откройте дерево метаданных и найдите ветку "HTTP-сервисы". Добавьте новый HTTP-сервис.
  2. Настройка корневого URL: Укажите Корневой URL, например, APIService. Это будет базовая часть адреса для всех методов вашего сервиса.
  3. Определение шаблонов URL и методов: Внутри HTTP-сервиса вы создаете Шаблоны URL. Каждый шаблон может иметь свои методы обработки запросов (GET, POST, PUT, DELETE и т.д.). Например, для получения данных о товаре вы можете создать шаблон /V1/Товары/* с методом GET.
    • В шаблонах URL можно использовать параметры, которые будут передаваться в процедуру обработки запроса, например, /V1/Товары/{КодТовара}.
  4. Реализация логики в модуле: Для каждого метода (например, GET, POST) в шаблоне URL необходимо создать процедуру обработки на встроенном языке 1С. Эта процедура будет получать объект HTTPСервисЗапрос и возвращать объект HTTPСервисОтвет.
    
    // Пример процедуры обработки GET-запроса
    // в модуле HTTP-сервиса
    Процедура Get(Запрос)
        Ответ = Запрос.СоздатьОтвет();
        Ответ.КодСостояния = 200; // OK
        Ответ.УстановитьТелоИзСтроки("Привет от HTTP-сервиса 1С!");
        Ответ.УстановитьЗаголовок("Content-Type", "text/plain; charset=utf-8");
    КонецПроцедуры
    
    Мы получаем входящий Запрос, анализируем его (заголовки, параметры, тело), выполняем необходимую логику (например, выбираем данные из базы) и формируем Ответ.
  5. Получение тела HTTP-запроса: Если вы ожидаете данные в теле запроса (например, для методов POST или PUT), вы можете получить их с помощью методов объекта HTTPСервисЗапрос, например:
    
    // Пример получения тела POST-запроса
    // в модуле HTTP-сервиса
    Процедура Post(Запрос)
        Ответ = Запрос.СоздатьОтвет();
        Попытка
            // Получаем тело запроса как строку
            ТелоЗапросаСтрокой = Запрос.ПолучитьТелоКакСтроку();
            // Если ожидаем JSON
            ДанныеJSON = ПрочитатьJSON(ТелоЗапросаСтрокой);
    
            // ... Ваша логика обработки данных ...
    
            Ответ.КодСостояния = 200;
            Ответ.УстановитьТелоИзСтроки("Данные успешно получены и обработаны.");
        Исключение
            Ответ.КодСостояния = 400; // Bad Request
            Ответ.УстановитьТелоИзСтроки("Ошибка обработки запроса: " + ОписаниеОшибки());
        КонецПопытки;
    КонецПроцедуры
    

Выполнение HTTP-запроса из клиентской базы 1С

Теперь давайте посмотрим, как из другой базы 1С отправить запрос к нашему опубликованному HTTP-сервису. Для этого мы будем использовать объекты HTTPСоединение, HTTPЗапрос и HTTPОтвет.

  1. Создание объекта HTTPСоединение: Этот объект отвечает за установление связи с веб-сервером.
    
    // Параметры целевой базы 1С
    ИмяСервера = "localhost"; // Или IP-адрес, или доменное имя сервера
    Порт = 80; // Стандартный порт HTTP, для HTTPS обычно 443
    ИмяПубликации = "MyBaseService"; // Имя публикации нашей базы на веб-сервере
    
    // Создаем защищенное соединение для HTTPS, если используется
    // Иначе просто HTTPСоединение
    Если Порт = 443 Тогда
        ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
        Соединение = Новый HTTPСоединение(ИмяСервера, Порт, , , , ЗащищенноеСоединение);
    Иначе
        Соединение = Новый HTTPСоединение(ИмяСервера, Порт);
    КонецЕсли;
    
    // Если требуется аутентификация
    // Соединение.Пользователь = "ИмяПользователя1С";
    // Соединение.Пароль = "ПарольПользователя1С";
    
    Здесь мы указываем адрес сервера, порт и, при необходимости, данные для аутентификации. Для защищенного соединения (HTTPS) используем объект ЗащищенноеСоединениеOpenSSL.
  2. Создание объекта HTTPЗапрос: Этот объект описывает сам запрос.
    
    // Корневой URL нашего HTTP-сервиса и его шаблон
    // Пример: /hs/APIService/V1/Товары/00001
    // Формат URL: /<ИмяПубликации>/hs/<КорневойURL_Сервиса>/<ШаблонURL>
    // В нашем примере: /MyBaseService/hs/APIService/V1/Товары/00001
    Ресурс = "/" + ИмяПубликации + "/hs/APIService/V1/Товары/00001";
    
    Запрос = Новый HTTPЗапрос(Ресурс);
    Запрос.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8"); // Если отправляем JSON
    Запрос.Заголовки.Вставить("Accept", "application/json"); // Если ожидаем JSON в ответ
    
    // Для POST/PUT запросов устанавливаем тело
    // Запрос.УстановитьТелоИзСтроки("{""Код"":""00001"", ""Наименование"":""Новый Товар""}");
    
    Мы формируем полный путь к ресурсу на сервере, добавляем необходимые заголовки (например, Content-Type для указания формата отправляемых данных, Accept для указания ожидаемого формата ответа) и, если это POST или PUT запрос, устанавливаем тело запроса.
  3. Выполнение запроса и получение HTTPОтвет:
    
    Попытка
        // Выполняем GET-запрос
        Ответ = Соединение.Получить(Запрос);
        // Для POST-запроса использовали бы: Ответ = Соединение.ОтправитьДляОбработки(Запрос);
    
        Если Ответ.КодСостояния = 200 Тогда
            Сообщить("Запрос успешно выполнен. Код состояния: " + Ответ.КодСостояния);
            // Получаем тело ответа
            ТелоОтвета = Ответ.ПолучитьТелоКакСтроку();
            Сообщить("Тело ответа: " + ТелоОтвета);
        Иначе
            Сообщить("Ошибка выполнения запроса. Код состояния: " + Ответ.КодСостояния);
            Сообщить("Текст ошибки: " + Ответ.ПолучитьТелоКакСтроку());
        КонецЕсли;
    
    Исключение
        Сообщить("При выполнении HTTP-запроса произошла ошибка: " + ОписаниеОшибки());
    КонецПопытки;
    
    Мы используем методы Получить() (для GET), ОтправитьДляОбработки() (для POST) или другие методы объекта HTTPСоединение для отправки запроса. В ответ получаем объект HTTPОтвет, который содержит код состояния (например, 200 OK, 404 Not Found, 500 Internal Server Error), заголовки и тело ответа. Обязательно анализируйте КодСостояния!

Использование стандартного интерфейса OData

OData (Open Data Protocol) — это еще один мощный способ взаимодействия с базами 1С. Платформа 1С может автоматически формировать REST-интерфейс для всего прикладного решения, используя протокол OData версии 3.0. Это позволяет читать, изменять, создавать и удалять объекты данных 1С, а также получать структуру метаданных, не разрабатывая HTTP-сервисы вручную.

Настройка и публикация OData

  1. Настройка в конфигурации (для БСП): Если ваша конфигурация основана на БСП (Библиотека стандартных подсистем), откройте ее в пользовательском режиме. Перейдите в раздел "Администрирование" -> "Синхронизация данных" -> "Настройки стандартного интерфейса OData". Здесь вы можете выбрать, какие объекты метаданных будут доступны через OData, и настроить их параметры.
  2. Публикация на веб-сервере: При публикации информационной базы на веб-сервере (как мы рассмотрели выше) необходимо установить флажок "Публиковать стандартный интерфейс OData".
  3. Безопасность: Для безопасной работы с OData рекомендуется создавать отдельные учетные записи пользователей в базе 1С с минимально необходимыми правами доступа.

Выполнение запроса к OData из клиентской базы 1С

URL для обращения к OData будет выглядеть примерно так: http://<Адрес_Сервера>/<Имя_Публикации>/odata/standard.odata/. Далее к этому адресу добавляются названия объектов метаданных.


// Параметры целевой базы 1С
ИмяСервера = "localhost";
Порт = 80;
ИмяПубликации = "MyBaseService";

// Создаем соединение
Соединение = Новый HTTPСоединение(ИмяСервера, Порт);
// Устанавливаем пользователя и пароль, если требуется
// Соединение.Пользователь = "ODataUser";
// Соединение.Пароль = "ODataPassword";

// Пример запроса к справочнику "Номенклатура"
РесурсOData = "/" + ИмяПубликации + "/odata/standard.odata/Catalog_Номенклатура?$format=json";

ЗапросOData = Новый HTTPЗапрос(РесурсOData);
ЗапросOData.Заголовки.Вставить("Accept", "application/json");

Попытка
    ОтветOData = Соединение.Получить(ЗапросOData);

    Если ОтветOData.КодСостояния = 200 Тогда
        Сообщить("Данные OData успешно получены. Код состояния: " + ОтветOData.КодСостояния);
        ТелоОтвета = ОтветOData.ПолучитьТелоКакСтроку();
        // Можно прочитать JSON
        ЧтениеJSON = Новый ЧтениеJSON();
        ЧтениеJSON.УстановитьСтроку(ТелоОтвета);
        ДанныеНоменклатуры = ПрочитатьJSON(ЧтениеJSON);
        ЧтениеJSON.Закрыть();
        Сообщить("Полученные данные: " + ДанныеНоменклатуры);
    Иначе
        Сообщить("Ошибка получения данных OData. Код состояния: " + ОтветOData.КодСостояния);
        Сообщить("Текст ошибки: " + ОтветOData.ПолучитьТелоКакСтроку());
    КонецЕсли;

Исключение
    Сообщить("При выполнении OData-запроса произошла ошибка: " + ОписаниеОшибки());
КонецПопытки;

OData позволяет выполнять различные операции, такие как фильтрация ($filter), сортировка ($orderby), выборка полей ($select) и другие, прямо в URL запроса.

Диагностика ошибки "Страница не найдена" (404 Not Found)

Ошибка 404 — это самый частый спутник начинающих интеграторов. Давайте проанализируем ситуацию и выясним основные причины возникновения этой ошибки:

  1. База не опубликована на веб-сервере: Это самая очевидная причина. Если база не опубликована вообще, веб-сервер не знает, что с ней делать, и возвращает 404. Проверьте, выполнили ли вы все шаги по публикации.
  2. Неправильный URL-адрес:
    • Опечатки: В имени сервера, порте, имени публикации, корневом URL сервиса или шаблоне URL.
    • Неверное имя публикации: Убедитесь, что ИмяПубликации в вашем коде точно совпадает с тем, что вы указали при публикации в конфигураторе.
    • Неверный корневой URL HTTP-сервиса: Убедитесь, что часть /hs/APIService/ (где APIService — это Корневой URL вашего сервиса) корректна.
    • Неверный шаблон URL: Если вы обращаетесь к HTTP-сервису, убедитесь, что путь после Корневого URL (например, /V1/Товары/00001) соответствует одному из шаблонов, определенных в вашем HTTP-сервисе.
    • Неверный URL OData: Для OData базовый путь всегда /odata/standard.odata/.
  3. HTTP-сервис или OData не опубликованы: Даже если база опубликована, но вы забыли установить флажок для конкретного HTTP-сервиса или для OData в окне публикации, эти компоненты будут недоступны. Проверьте настройки публикации в конфигураторе.
  4. Веб-сервер не запущен или настроен некорректно: Возможно, веб-сервер (IIS/Apache) не запущен, или в его конфигурации есть ошибки, которые мешают ему обрабатывать запросы к 1С. Перезапустите веб-сервер.
  5. Брандмауэр блокирует порт: Проверьте настройки брандмауэра на сервере с целевой базой 1С. Возможно, он блокирует входящие соединения на используемом порту (80 для HTTP, 443 для HTTPS).
  6. Проверка доступности с помощью внешних инструментов:
    • Браузер: Попробуйте ввести полный URL вашего HTTP-сервиса или OData в адресную строку браузера. Если вы получаете ошибку 404, это подтверждает проблему на стороне сервера или в URL.
    • Postman: Используйте такие инструменты, как Postman, для отправки запросов. Они позволяют гибко настраивать заголовки, методы и тело запроса, а также наглядно показывают ответ сервера, включая код состояния и тело ошибки. Это очень удобно для отладки.

Отладка и безопасность

Отладка HTTP-сервисов и запросов

Для эффективной разработки и отладки HTTP-сервисов в 1С рекомендуем следующее:

  1. Включение отладки по протоколу HTTP: В конфигураторе 1С, в меню "Отладка" -> "Подключение" -> "Настройка отладки", убедитесь, что разрешена отладка по протоколу HTTP. Также настройте возможные подключения, выбрав необходимые предметы отладки.
  2. Использование Postman: Как уже упоминалось, Postman или аналогичные инструменты (например, Swagger UI, Insomnia) незаменимы для отправки тестовых запросов к вашему HTTP-сервису и анализа ответов. Вы можете быстро менять URL, методы, заголовки и тело запроса, что значительно ускоряет процесс отладки.
  3. Журнал регистрации: Внимательно изучайте журнал регистрации 1С на сервере, где опубликован сервис. Там могут быть записи об ошибках выполнения кода вашего HTTP-сервиса.

Аутентификация и безопасность

При обмене данными между базами 1С не забывайте о безопасности:

  1. Аутентификация: В HTTP-сервисах 1С чаще всего используется аутентификация по логину и паролю пользователя базы 1С или аутентификация операционной системы. Для внешних программ рекомендуется создавать отдельных служебных пользователей с минимально необходимыми правами. С версии 8.3.21 появилась возможность авторизации с использованием JWT-токенов, а также OpenID и OpenID Connect, что является более современным и безопасным подходом.
  2. HTTPS: Всегда используйте HTTPS для защищенной передачи данных, особенно если обмен происходит через интернет. Это предотвратит перехват и изменение информации.
  3. Токены доступа: Если вы используете JWT-токены, помните, что они имеют ограниченный срок действия (обычно около часа). При получении кода 401 (Unauthorized) вам потребуется запросить новый токен.
  4. Анонимный доступ: Публикация HTTP-сервисов с анонимным доступом возможна, но требует тщательного анализа рисков и дополнительных мер безопасности на уровне веб-сервера.

Мы надеемся, что это подробное руководство поможет вам успешно настроить HTTP-взаимодействие между вашими базами 1С и избежать ошибки "Страница не найдена". Успешной работы!

← К списку