При разработке и тестировании механизмов интеграции между различными базами 1С программисты часто сталкиваются с ситуацией, когда отработанная схема «Сервер-Сервер» перестает функционировать при переносе одной из баз на локальный компьютер. В данной статье мы проанализируем ситуацию, когда база-источник опубликована на локальном веб-сервере Apache, а серверная база-приемник не может получить из нее данные. Мы разберем причины возникновения ошибок «Связь с сервером потеряна» и «Код состояния 401», а также детально изучим правильную настройку параметров запросов и авторизации.
Одной из первых преград, с которой мы сталкиваемся, является использование адреса localhost или 127.0.0.1 в коде обработки. Выясним причину, почему это не работает в клиент-серверной архитектуре. Если код, инициирующий HTTP-соединение, выполняется на стороне сервера 1С (в контексте службы rphost), то обращение к localhost будет перенаправлено на само железо сервера, где установлена база-приемник, а не на ваш локальный компьютер.
Для решения этой проблемы мы должны использовать реальный IP-адрес вашего компьютера в локальной сети. Рассмотрим пример правильной инициализации соединения:
// Вместо localhost используем реальный IP разработчика
АдресХоста = "10.1.2.55"; // Ваш IP в локальной сети
Соединение = Новый HTTPСоединение(АдресХоста, , , , , , Новый ЗащищенноеСоединениеOpenSSL());
После того как сетевой путь установлен, мы часто получаем ошибку 401 Unauthorized. Это означает, что веб-сервер Apache принял запрос, но 1С отклонила его из-за отсутствия прав или неверных учетных данных. Разберем по шагам, как настроить автоматический вход через файл публикации default.vrd.
Проанализируем структуру файла default.vrd, который обычно находится в каталоге публикации Apache (например, C:\Apache24\htdocs\ВашаБаза\). Чтобы избежать постоянных запросов логина и пароля при каждом вызове HTTP-сервиса, мы можем прописать параметры в строке соединения:
default.vrd через текстовый редактор.ib в теге <point>.Usr и Pwd.Пример настройки строки соединения в файле:
ib="Srvr="ИмяСервера";Ref="ИмяБазы";Usr="ИмяРобота";Pwd="Пароль";"
Важно помнить: если база-источник файловая и расположена локально, путь будет выглядеть так: ib="File="C:\Bases\SourceDB";Usr="Админ";Pwd="123";". После внесения изменений не забудьте перезапустить службу Apache.
Часто ошибка «Недопустимое состояние потока чтения JSON» или ошибки при вызове XMLЗначение возникают из-за того, что HTTP-сервис получает пустые или неверно сформированные параметры. Рассмотрим подробнее, как должен выглядеть запрос к сервису, который ожидает период дат.
Если в модуле HTTP-сервиса используется код для получения параметров:
НачДатаСтрока = Запрос.ПараметрыЗапроса.Получить("from");
НачДата = XMLЗначение(Тип("Дата"), НачДатаСтрока);
То вызывающая сторона должна сформировать URL строго определенным образом. Разберем пример формирования запроса в коде 1С:
ПараметрыURL = "from=" + Формат(Объект.ДатаНачала, "ДФ=yyyy-MM-dd") + "&to=" + Формат(Объект.ДатаОкончания, "ДФ=yyyy-MM-dd");
ИмяСервиса = "/idpo/hs/getdocuments/";
ПолныйПуть = ИмяСервиса + "?" + ПараметрыURL;
HTTPЗапрос = Новый HTTPЗапрос(ПолныйПуть);
Ответ = Соединение.Получить(HTTPЗапрос);
Обратите внимание на использование ?wsdl. Многие программисты по ошибке добавляют этот суффикс, характерный для SOAP-сервисов (Web-сервисов). Для HTTP-сервисов этот суффикс не используется и может приводить к ошибкам маршрутизации. Для интерактивной проверки отправки параметров и заголовков запроса можно использовать обработку для тестирования HTTP-сервисов.
При передаче данных через JSON из табличных частей документов часто возникают ошибки, если поля запроса не имеют явных псевдонимов или типы данных не соответствуют ожиданиям сериализатора. Проанализируем типичный запрос внутри HTTP-сервиса:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТЧ.НомерДоговора КАК НомерДоговора,
| ТЧ.ДатаДоговора КАК ДатаДоговора
|ИЗ
| Документ.Зачисление.Слушатели КАК ТЧ
|ГДЕ
| ТЧ.Ссылка.Дата МЕЖДУ &НачДата И &КонДата";
Выборка = Запрос.Выполнить().Выбрать();
При заполнении структуры для JSON-ответа мы должны убедиться, что используем правильные имена полей из выборки. Рассмотрим пример формирования структуры:
Пока Выборка.Следующий() Цикл
СтруктураТЧ = Новый Структура();
// Используем псевдонимы из запроса
СтруктураТЧ.Вставить("ContractNumber", СокрЛП(Выборка.НомерДоговора));
// При передаче даты важно привести её к формату ISO или строке
СтруктураТЧ.Вставить("ContractDate", Формат(Выборка.ДатаДоговора, "ДФ=yyyy-MM-dd"));
МассивДанных.Добавить(СтруктураТЧ);
КонецЦикла;
Если вы исправили авторизацию и URL, но данные все равно не приходят, необходимо включить отладку. Выясним, как «поймать» запрос внутри модуля HTTP-сервиса на локальном компьютере:
GET), который обрабатывает входящий запрос.Помните, что для успешной отладки служба Apache должна иметь доступ к портам отладчика 1С (обычно это диапазон 1560-1591). Если отладка не срабатывает, попробуйте временно отключить брандмауэр Windows для проверки влияния сетевых фильтров. Для автоматизированного развертывания веб-сервера с нужными портами и правилами брандмауэра подойдёт скрипт установки Apache HTTP Server для Windows.
Подводя итог, можно сказать, что стабильная связь между базами через Apache требует внимания к трем аспектам: сетевой доступности (реальный IP), правильной авторизации (настройка default.vrd) и валидности передаваемых параметров в строке URL. Следуя этим шагам, вы сможете успешно тестировать интеграционные механизмы 1С на локальном окружении.