Использование прокси для заграничного сервера 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 час

image_pdfimage_print

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Вам может также понравиться...

1 комментарий

  1. 12.03.2026

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *