При интеграции 1С с внешними веб-сервисами, которые отдают данные в формате JSON, часто возникает необходимость проверить, существует ли файл по заданному URL. Многие разработчики по привычке используют метод ЧтениеJSON.ОткрытьФайл(), оборачивая его в блок Попытка...Исключение. Однако практика показывает, что такой подход может приводить к аварийному завершению работы (падению) платформы 1С, так как этот объект предназначен для разбора уже полученных данных, а не для обработки сетевых статусов.
Давайте разберем, как сделать эту проверку надежной, быстрой и безопасной для системы.
Попытка-Исключение при чтении файла не всегда работает?Проблема заключается в том, что ЧтениеJSON пытается инициализировать соединение и начать потоковое чтение файла. Если сервер возвращает ошибку (например, 404 Not Found), 1С может интерпретировать это не как ожидаемое исключение, а как сбой на низком уровне сетевого взаимодействия, что приводит к критической ошибке платформы. Чтобы избежать подобных проблем, нам нужно сначала «спросить» сервер о статусе файла, не пытаясь его сразу прочитать.
HTTPСоединение и HTTPЗапросСамым правильным способом является использование встроенных объектов для работы с протоколом HTTP. Мы отправим запрос к серверу, получим ответ и проанализируем его код состояния (HTTP Status Code). Если код равен 200, значит, файл успешно найден и его можно скачивать или читать. Если код другой — например, 404 — мы получим корректный сигнал об отсутствии файла без падения системы.
Рассмотрим по шагам, как это реализовать в коде:
HTTPСоединение, указав адрес ресурса.HTTPЗапрос с указанием пути к конкретному файлу.Получить, который вернет нам объект HTTPОтвет.КодСостояния полученного ответа.Вот пример того, как это выглядит на практике:
HTTPСоединение = Новый HTTPСоединение("www.floatrates.com",,,,, 60, Новый ЗащищенноеСоединениеOpenSSL);
Запрос = Новый HTTPЗапрос("/daily/" + СокрЛП(АббревиатураВалюты) + ".json");
Попытка
Ответ = HTTPСоединение.Получить(Запрос);
Если Ответ.КодСостояния = 200 Тогда
// Файл существует, можно приступать к парсингу
ДанныеJSON = Ответ.ПолучитьТелоКакСтроку();
// Далее обработка данных
Иначе
// Обработка случая, когда сервер ответил, но файла нет (код 404) или ошибка сервера (5xx)
Сообщить("Ошибка доступа к файлу. Код состояния: " + Ответ.КодСостояния);
КонецЕсли;
Исключение
// Обработка исключений, связанных с отсутствием сети или таймаутом
Сообщить("Не удалось установить соединение: " + ОписаниеОшибки());
КонецПопытки;
Чтобы ваше решение работало еще стабильнее, учтите следующие моменты:
Тайм-аут в конструкторе HTTPСоединение (в примере выше — 60 секунд). Это предотвратит «зависание» сеанса 1С в случае, если удаленный сервер медленно отвечает или вовсе не откликается.HTTPS, обязательно используйте ЗащищенноеСоединениеOpenSSL, иначе соединение будет отвергнуто платформой по соображениям безопасности.HEAD. Это сэкономит трафик и время, так как сервер пришлет только заголовки ответа без тела документа. В 1С это делается методом ВызватьHTTPМетод("HEAD", Запрос).Применяя этот подход, вы навсегда избавитесь от внезапных падений обработки и сделаете обмен данными с внешними сайтами профессиональным и предсказуемым.