Использование прокси для заграничного сервера 1С в Директ-банке к Т-Банк
У клиента сервер за границей, при обмене с Директ-банк и отправке платежек часты сбои.
Отладка показала, что Директ-банк работает, к сожалению, на сервере.
Можно пробовать портировать запросы на клиента, но это работа часа на два.
Решил попробовать прокси на сервере.
Нашел список бесплатных прокси-серверов:

Взял несколько российских, протестировал, какие из них работают прокси-чекером:


Настройки доступа в интернет на клиенте указываются в персональных настойках пользователя, а для сервера хранятся в константе НастройкаПроксиСервера. Долго искал, где настраивается, нашел в справке, как ни странно. Настраиваются в меню Администрирование (или Настройки) — Общие настройки:

Правда, пришлось поковырять типовой код в модуле ИнтернетСоединениеБЭД согласно совету, там не докрутили, добавить последний параметр, который отключает windows-авторизацию:
&ИзменениеИКонтроль("СформироватьПрокси") Функция дор_СформироватьПрокси(Протокол) // НастройкаПроксиСервера - Соответствие: // ИспользоватьПрокси - использовать ли прокси-сервер; // НеИспользоватьПроксиДляЛокальныхАдресов - использовать ли прокси-сервер для локальных адресов; // ИспользоватьСистемныеНастройки - использовать ли системные настройки прокси-сервера; // Сервер - адрес прокси-сервера; // Порт - порт прокси-сервера; // Пользователь - имя пользователя для авторизации на прокси-сервере; // Пароль - пароль пользователя. НастройкаПроксиСервера = ПолучениеФайловИзИнтернета.НастройкиПроксиНаСервере(); Если НастройкаПроксиСервера <> Неопределено Тогда ИспользоватьПрокси = НастройкаПроксиСервера.Получить("ИспользоватьПрокси"); ИспользоватьСистемныеНастройки = НастройкаПроксиСервера.Получить("ИспользоватьСистемныеНастройки"); Если ИспользоватьПрокси Тогда Если ИспользоватьСистемныеНастройки Тогда // Системные настройки прокси-сервера. Прокси = Новый ИнтернетПрокси(Истина); Иначе // Ручные настройки прокси-сервера. Прокси = Новый ИнтернетПрокси; #Удаление Прокси.Установить(Протокол, НастройкаПроксиСервера["Сервер"], НастройкаПроксиСервера["Порт"], НастройкаПроксиСервера["Пользователь"], НастройкаПроксиСервера["Пароль"]); #КонецУдаления #Вставка //https://forum.infostart.ru/forum9/topic313577/ Прокси.Установить(Протокол, НастройкаПроксиСервера["Сервер"], НастройкаПроксиСервера["Порт"], НастройкаПроксиСервера["Пользователь"], НастройкаПроксиСервера["Пароль"], ложь); #КонецВставки Прокси.НеИспользоватьПроксиДляЛокальныхАдресов = НастройкаПроксиСервера["НеИспользоватьПроксиДляЛокальныхАдресов"]; КонецЕсли; Иначе // Не использовать прокси-сервер. Прокси = Новый ИнтернетПрокси(Ложь); КонецЕсли; Иначе Прокси = Неопределено; КонецЕсли; Возврат Прокси; КонецФункции
Однако возникла еще одна проблема — через прокси перестал работать обмен с сайтом.
Я решил проблему, отключив прокси для сайта в модуле ИнтеграцияСИнтернетМагазиномСервер:
&После("ЗаполнитьНастройкиПодключения") Процедура дор_ЗаполнитьНастройкиПодключения(НастройкиПодключения) //Сайт должен работать без прокси Если НастройкиПодключения.Свойство("Прокси") И НастройкиПодключения.Прокси <> Неопределено Тогда НастройкиПодключения.Прокси = Неопределено; КонецЕсли; КонецПроцедуры
Но думаю, это не идеальное решение.
Прокси получается методом ПолучениеФайловИзИнтернета.НастройкиПроксиНаСервере без параметров. То есть определить, нужно прокси или нет по адресу сайта нельзя. Но, можно обойти.
К сожалению, нет общего метода, который выполняет HTTP-запрос. Для сайта это один метод, для обмена с банками — другой. Также поле Прокси в соединении доступно только для чтения.
Выход в общем такой, находим где выполняется HTTP-запрос и вызываем функцию корректировки.
Она проверяет, если нужно или не нужно прокси, то просто создает аналогичное соединение по полям текущего (клонирует соединение), но подставляет или удаляет оттуда прокси) и вызывает метод HTTP.
UPD: через прокси не работает обработка API-ship для 1С.
В общем, я все больше думаю, что лучше было сделать заглушку только для директ-банка, не меняя основной системный прокси. Может быть позже переделаю.
Для обработки я написал заплатку на модуль ПолучениеФайловИзИнтернета используя метод определения стека по ошибке:
&Вместо("НастройкиПроксиНаСервере") Функция дор_НастройкиПроксиНаСервере() //Проверяем место вызова ошибки //https://geniy1s.ru/ispolzovanie-isklyuchenij-dlya-opredeleniya-steka-vypolneniya-koda/ Попытка ВызватьИсключение ""; Исключение ИнформацияОбОшибке = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); //Для таких мест программы не используем прокси Если Найти(ИнформацияОбОшибке, "ВнешняяОбработка.Api1C.") ИЛИ ЛОЖЬ Тогда Возврат Неопределено; КонецЕсли; КонецПопытки; //Прежний код Результат = ПродолжитьВызов(); Возврат Результат; КонецФункции
Среда: УНФ 3.0.13.238. Объем 1 час




1 комментарий
[…] прошлый раз я добавил российкое прокси для УНФ, размещенное на заграничном сервере, потому что Т-Банк […]