При работе с базами данных 1С, размещенными на зарубежных серверах, пользователи нередко сталкиваются с ошибкой Internet error: Timeout exceeded при попытке автоматического обновления курсов валют с сайта currencyrates.1c.ru. Это распространенная проблема, связанная с сетевыми ограничениями доступа к инфраструктуре 1С для иностранных IP-адресов. Давайте разберем, как проанализировать ситуацию и какими методами можно решить эту задачу.
Первое, что необходимо выяснить — блокирует ли доступ ваш локальный брандмауэр или инфраструктура на стороне фирмы «1С». Часто запросы из определенных подсетей, особенно если они относятся к публичным дата-центрам, могут автоматически отсекаться в целях безопасности. Если браузер на том же сервере успешно открывает ссылку, но платформа 1С выдает Timeout exceeded, это с высокой долей вероятности означает, что сетевой экран блокирует специфические запросы от процесса платформы.
Если нет возможности получить прямой доступ к сервисам 1С, самым надежным способом будет создание собственного механизма загрузки. Мы можем реализовать выгрузку данных о курсах валют из базы, расположенной в РФ, в файл и последующую загрузку этого файла в зарубежную базу. Для этого отлично подойдет формат JSON или XML.
Рассмотрим алгоритм выгрузки данных на «российской» стороне. Мы будем использовать СериализаторXDTO для формирования структуры данных:
Функция ЗаписиРегистраВТекстJSON()
Запрос = Новый Запрос("ВЫБРАТЬ * ИЗ РегистрСведений.КурсыВалют ГДЕ Период >= &ДатаС");
Запрос.УстановитьПараметр("ДатаС", ДатаС);
Выборка = Запрос.Выполнить().Выбрать();
НаборыЗаписей = Новый Соответствие();
Сч = 0;
Пока Выборка.Следующий() Цикл
Сч = Сч + 1;
Запись = Новый Структура("Период, Валюта, Курс, Кратность, _КурсЕЦБ, _КратностьЕЦБ",
Выборка.Период, Выборка.Валюта, Выборка.Курс, Выборка.Кратность,
Выборка._КурсЕЦБ, Выборка._КратностьЕЦБ);
НаборыЗаписей.Вставить("" + Сч, Запись);
КонецЦикла;
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку(Новый ПараметрыЗаписиJSON(, Символы.Таб));
СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, НаборыЗаписей, НазначениеТипаXML.Явное);
Возврат ЗаписьJSON.Закрыть();
КонецФункции
Затем, на стороне зарубежного сервера, мы производим обратную процедуру — чтение файла и обновление регистра КурсыВалют:
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(ТекстJSON);
НаборыЗаписей = СериализаторXDTO.ПрочитатьJSON(ЧтениеJSON);
НЗ = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей();
НЗ.Прочитать();
ТЗ = НЗ.Выгрузить();
Для Каждого Запись Из НаборыЗаписей Цикл
НайденныеСтроки = ТЗ.НайтиСтроки(Новый Структура("Период, Валюта", Запись.Значение["Период"], Запись.Значение["Валюта"]));
Если НайденныеСтроки.Количество() = 0 Тогда
ТекСтрока = ТЗ.Добавить();
Иначе
ТекСтрока = НайденныеСтроки[0];
КонецЕсли;
ЗаполнитьЗначенияСвойств(ТекСтрока, Запись.Значение);
КонецЦикла;
НЗ.Загрузить(ТЗ);
НЗ.Записать();
Этот способ позволяет полностью исключить зависимость от сетевых политик 1С, так как обмен данными может происходить через SFTP, электронную почту или облачное хранилище.
Если вы хотите сохранить стандартный функционал 1С, можно попытаться «обмануть» систему, обеспечив доступ через российский узел. Рассмотрим возможные шаги:
При выборе стратегии решения проблемы помните о следующих моментах:
Анализируя ситуацию, можно сделать вывод, что на текущий момент самым надежным решением является отказ от попыток прямого подключения к сервисам 1С из-за рубежа в пользу создания собственной автоматизированной системы загрузки данных через защищенный канал обмена файлами.