Приветствуем вас! Если вы столкнулись с ошибкой "Страница не найдена" (HTTP 404) при попытке выполнить HTTP-запрос из одной информационной базы 1С к другой, значит, мы вместе выясним причину и найдем решение. Эта проблема часто возникает из-за некорректной настройки серверной части или неправильного формирования адреса запроса. Давайте подробно разберем, как наладить взаимодействие между базами 1С с помощью HTTP-запросов. Мы рассмотрим два основных подхода к организации такого взаимодействия: через HTTP-сервисы, которые вы разрабатываете самостоятельно, и через стандартный интерфейс OData, предоставляемый платформой 1С.
Прежде чем мы сможем обратиться к другой базе 1С по протоколу HTTP, необходимо, чтобы эта база была опубликована на веб-сервере. Без этого шага любая попытка обращения к ней завершится ошибкой "Страница не найдена", поскольку веб-сервер просто не будет знать, куда маршрутизировать ваш запрос. Для публикации базы нам потребуется один из веб-серверов: IIS (Internet Information Services), который обычно используется в среде Windows Server, или Apache. Рассмотрим процесс публикации по шагам:
Конфигуратор под пользователем с административными правами. Перейдите в меню "Администрирование" -> "Публикация на веб-сервере...".MyBaseService. Это имя будет частью URL-адреса вашей базы.HTTPS. Для этого потребуется настроить SSL-сертификат на веб-сервере.После успешной публикации вы сможете проверить доступность базы, введя в адресную строку браузера примерно такой URL: http://<Адрес_Сервера>/<Имя_Публикации>/ru_RU/. Если база открывается, значит, основная публикация прошла успешно.
HTTP-сервисы в 1С — это мощный инструмент для организации произвольного API (Application Programming Interface), который позволяет обмениваться данными с другими системами, включая другие базы 1С.
Давайте разберем процесс создания собственного HTTP-сервиса:
Корневой URL, например, APIService. Это будет базовая часть адреса для всех методов вашего сервиса.Шаблоны URL. Каждый шаблон может иметь свои методы обработки запросов (GET, POST, PUT, DELETE и т.д.). Например, для получения данных о товаре вы можете создать шаблон /V1/Товары/* с методом GET.
/V1/Товары/{КодТовара}.GET, POST) в шаблоне URL необходимо создать процедуру обработки на встроенном языке 1С. Эта процедура будет получать объект HTTPСервисЗапрос и возвращать объект HTTPСервисОтвет.
// Пример процедуры обработки GET-запроса
// в модуле HTTP-сервиса
Процедура Get(Запрос)
Ответ = Запрос.СоздатьОтвет();
Ответ.КодСостояния = 200; // OK
Ответ.УстановитьТелоИзСтроки("Привет от HTTP-сервиса 1С!");
Ответ.УстановитьЗаголовок("Content-Type", "text/plain; charset=utf-8");
КонецПроцедуры
Запрос, анализируем его (заголовки, параметры, тело), выполняем необходимую логику (например, выбираем данные из базы) и формируем Ответ.
POST или PUT), вы можете получить их с помощью методов объекта HTTPСервисЗапрос, например:
// Пример получения тела POST-запроса
// в модуле HTTP-сервиса
Процедура Post(Запрос)
Ответ = Запрос.СоздатьОтвет();
Попытка
// Получаем тело запроса как строку
ТелоЗапросаСтрокой = Запрос.ПолучитьТелоКакСтроку();
// Если ожидаем JSON
ДанныеJSON = ПрочитатьJSON(ТелоЗапросаСтрокой);
// ... Ваша логика обработки данных ...
Ответ.КодСостояния = 200;
Ответ.УстановитьТелоИзСтроки("Данные успешно получены и обработаны.");
Исключение
Ответ.КодСостояния = 400; // Bad Request
Ответ.УстановитьТелоИзСтроки("Ошибка обработки запроса: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Теперь давайте посмотрим, как из другой базы 1С отправить запрос к нашему опубликованному HTTP-сервису. Для этого мы будем использовать объекты HTTPСоединение, HTTPЗапрос и HTTPОтвет.
HTTPСоединение: Этот объект отвечает за установление связи с веб-сервером.
// Параметры целевой базы 1С
ИмяСервера = "localhost"; // Или IP-адрес, или доменное имя сервера
Порт = 80; // Стандартный порт HTTP, для HTTPS обычно 443
ИмяПубликации = "MyBaseService"; // Имя публикации нашей базы на веб-сервере
// Создаем защищенное соединение для HTTPS, если используется
// Иначе просто HTTPСоединение
Если Порт = 443 Тогда
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
Соединение = Новый HTTPСоединение(ИмяСервера, Порт, , , , ЗащищенноеСоединение);
Иначе
Соединение = Новый HTTPСоединение(ИмяСервера, Порт);
КонецЕсли;
// Если требуется аутентификация
// Соединение.Пользователь = "ИмяПользователя1С";
// Соединение.Пароль = "ПарольПользователя1С";
HTTPS) используем объект ЗащищенноеСоединениеOpenSSL.
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 запрос, устанавливаем тело запроса.
HTTPОтвет:
Попытка
// Выполняем GET-запрос
Ответ = Соединение.Получить(Запрос);
// Для POST-запроса использовали бы: Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Если Ответ.КодСостояния = 200 Тогда
Сообщить("Запрос успешно выполнен. Код состояния: " + Ответ.КодСостояния);
// Получаем тело ответа
ТелоОтвета = Ответ.ПолучитьТелоКакСтроку();
Сообщить("Тело ответа: " + ТелоОтвета);
Иначе
Сообщить("Ошибка выполнения запроса. Код состояния: " + Ответ.КодСостояния);
Сообщить("Текст ошибки: " + Ответ.ПолучитьТелоКакСтроку());
КонецЕсли;
Исключение
Сообщить("При выполнении HTTP-запроса произошла ошибка: " + ОписаниеОшибки());
КонецПопытки;
Получить() (для GET), ОтправитьДляОбработки() (для POST) или другие методы объекта HTTPСоединение для отправки запроса. В ответ получаем объект HTTPОтвет, который содержит код состояния (например, 200 OK, 404 Not Found, 500 Internal Server Error), заголовки и тело ответа. Обязательно анализируйте КодСостояния!
OData (Open Data Protocol) — это еще один мощный способ взаимодействия с базами 1С. Платформа 1С может автоматически формировать REST-интерфейс для всего прикладного решения, используя протокол OData версии 3.0. Это позволяет читать, изменять, создавать и удалять объекты данных 1С, а также получать структуру метаданных, не разрабатывая HTTP-сервисы вручную.
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 — это самый частый спутник начинающих интеграторов. Давайте проанализируем ситуацию и выясним основные причины возникновения этой ошибки:
ИмяПубликации в вашем коде точно совпадает с тем, что вы указали при публикации в конфигураторе./hs/APIService/ (где APIService — это Корневой URL вашего сервиса) корректна.Корневого URL (например, /V1/Товары/00001) соответствует одному из шаблонов, определенных в вашем HTTP-сервисе./odata/standard.odata/.Для эффективной разработки и отладки HTTP-сервисов в 1С рекомендуем следующее:
При обмене данными между базами 1С не забывайте о безопасности:
JWT-токенов, а также OpenID и OpenID Connect, что является более современным и безопасным подходом.HTTPS для защищенной передачи данных, особенно если обмен происходит через интернет. Это предотвратит перехват и изменение информации.Мы надеемся, что это подробное руководство поможет вам успешно настроить HTTP-взаимодействие между вашими базами 1С и избежать ошибки "Страница не найдена". Успешной работы!
← К списку