При работе с механизмами интеграции в платформе 1С:Предприятие разработчики часто сталкиваются со стандартным объектом FTPСоединение. Одной из самых распространенных и не всегда очевидных проблем при его использовании является возникновение системной ошибки «Ошибка работы с Интернет». Данное сообщение может появляться на этапе вызова метода Записать() и сопровождаться аварийным завершением процесса выгрузки.
В этой статье мы подробно разберем, почему возникает эта ошибка, проанализируем синтаксис методов работы с FTP, а также рассмотрим сопутствующие системные и сетевые факторы, которые могут блокировать передачу данных между 1С и удаленным сервером.
Обратимся к практическому примеру. Часто разработчики совершают ошибку при передаче параметров в метод Записать(). Рассмотрим исходный некорректный код, который приводит к ошибке:
ТекКаталог = "D:/Новая папка/dannietovar.xml";
КаталогВыгрузки = "/";
Соединение.Записать(ТекКаталог, КаталогВыгрузки);
Выясним причину, почему этот код вызывает сбой. Согласно официальной спецификации платформы 1С:Предприятие, метод Записать() (в англоязычной версии Put()) имеет следующий синтаксис:
Записать(<Источник>, <ИмяВыходногоФайла>)
Проанализируем параметры этого метода подробнее:
Строка) — это полный локальный путь к файлу на компьютере-источнике (или на сервере 1С, если код выполняется в серверном контексте).Строка) — это не просто целевой каталог на FTP-сервере, а конкретное имя файла, под которым данные должны быть сохранены на сервере. При необходимости здесь также указывается относительный путь к папке на FTP вместе с именем файла.Передавая во втором параметре значение "/", мы заставляем платформу пытаться записать поток данных в качестве самого каталога, что является грубым нарушением протокола FTP и вызывает моментальный отказ сервера, интерпретируемый 1С как «Ошибка работы с Интернет».
Для исправления этой ошибки мы должны явно передать целевое имя файла во втором параметре. Посмотрим на правильный вариант реализации кода:
ТекКаталог = "D:/Новая папка/dannietovar.xml";
// Передаем конкретное имя результирующего файла
Соединение.Записать(ТекКаталог, "dannietovar.xml");
Если файл требуется записать в определенную подпапку на FTP-сервере, путь к ней также должен заканчиваться именем файла, например:
ТекКаталог = "D:/Новая папка/dannietovar.xml";
// Выгрузка в конкретную папку на сервере
Соединение.Записать(ТекКаталог, "upload/documents/dannietovar.xml");
Даже при абсолютно корректном синтаксисе метода Записать() вы можете продолжать получать ошибку «Ошибка работы с Интернет». Очень часто это связано с сетевым режимом работы FTP-соединения.
По умолчанию при инициализации объекта FTPСоединение в 1С используется активный режим. Рассмотрим, чем они отличаются:
Записать()) падает с ошибкой.Мы рекомендуем всегда явно указывать пассивный режим работы при создании подключения. Разберем синтаксис инициализации:
// Шестой параметр Истина активирует пассивный режим
Соединение = Новый FTPСоединение(
"ftp.example.com", // Адрес сервера
21, // Порт (по умолчанию 21)
"ftp_user", // Имя пользователя
"ftp_password", // Пароль
, // Прокси (не используется)
Истина // Пассивный режим (Истина/Ложь)
);
Следующий важный шаг — анализ контекста выполнения кода 1С. В зависимости от того, выполняется ли выгрузка на клиенте (в интерактивном режиме) или на сервере (в фоновом или регламентном задании), поведение системы будет кардинально отличаться.
Если код выполняется на сервере:
Записать) должен указывать на локальный диск сервера 1С, а не вашего персонального компьютера. Путь вида "D:/Новая папка/dannietovar.xml" сервер будет искать на своих физических накопителях.USR1CV8), должна иметь полные права операционной системы на чтение из указанной папки. Если прав нет, платформа вернет ошибку доступа, которая может маскироваться под сетевую.Для надежной работы серверных модулей мы рекомендуем отказаться от жестко прописанных путей и использовать механизм временных файлов. Рассмотрим пример безопасной выгрузки:
// Создаем временный файл в системной папке, гарантированно доступной для 1С
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xml");
// ... Код формирования файла (например, ЗаписьXML или Выгрузка в текст) ...
// Для примера запишем пустую структуру
Запись = Новый ЗаписьXML;
Запись.ОткрытьФайл(ИмяВременногоФайла);
Запись.ЗаписатьОбъявлениеXML();
Запись.ЗаписатьНачалоЭлемента("Данные");
Запись.ЗаписатьКонецЭлемента();
Запись.Закрыть();
// Выгружаем файл на FTP
Попытка
Соединение = Новый FTPСоединение("ftp.example.com", , "user", "pass", , Истина);
Соединение.Записать(ИмяВременногоФайла, "dannietovar.xml");
ЗаписатьЛогСобытий("Файл успешно отправлен!");
Исключение
ЗаписатьЛогСобытий("Ошибка при отправке: " + ОписаниеОшибки());
КонецПопытки;
// Обязательно удаляем временный файл после отправки
Попытка
УдалитьФайлы(ИмяВременногоФайла);
Исключение
// Игнорируем ошибку удаления, если файл занят процессом
КонецПопытки;
Бывают ситуации, когда первая выгрузка на FTP проходит успешно, а все последующие завершаются ошибкой «Ошибка работы с Интернет». Это может указывать на политику безопасности FTP-сервера, запрещающую перезапись уже существующих файлов одним и тем же пользователем.
Чтобы исключить этот фактор, мы можем перед записью проверять наличие файла на сервере и принудительно удалять его перед отправкой новой версии. Разберем, как это реализовать программно:
ИмяФайлаНаСервере = "dannietovar.xml";
КаталогНаСервере = "/";
// Проверяем наличие файла на сервере
НайденныеФайлы = Соединение.НайтиФайлы(КаталогНаСервере, ИмяФайлаНаСервере);
Если НайденныеФайлы.Количество() > 0 Тогда
Попытка
// Удаляем старый файл перед записью нового
Соединение.Удалить(КаталогНаСервере, ИмяФайлаНаСервере);
Исключение
ЗаписатьЛогСобытий("Не удалось удалить старый файл. Возможно, нет прав или файл заблокирован.");
КонецПопытки;
КонецЕсли;
// Производим чистую запись файла
Соединение.Записать(ПутьКЛокальномуФайлу, ИмяФайлаНаСервере);
Обратим внимание на написание слешей в путях к файлам. В операционной системе Windows в качестве разделителя каталогов традиционно используется обратный слеш (\), в то время как в интернет-протоколах и Unix-системах (под управлением которых работает абсолютное большинство FTP-серверов) разделителем служит прямой слеш (/).
Для предотвращения сбоев в работе методов платформы придерживайтесь следующего правила:
"D:\Новая папка\dannietovar.xml"."updates/xml/dannietovar.xml".Если корпоративная сеть вашего предприятия осуществляет доступ к внешним интернет-ресурсам через специализированный шлюз (прокси-сервер), объект FTPСоединение должен быть проинициализирован с передачей параметров прокси. В противном случае сетевые пакеты будут отсекаться на границе локальной сети.
Посмотрим на пример создания подключения с прокси-сервером:
ПроксиСервер = Новый ИнтернетПрокси;
// Настраиваем параметры прокси (протокол ftp или http в зависимости от архитектуры)
ПроксиСервер.Установить("ftp", "192.168.1.1", 8080, "domain\proxy_user", "proxy_password");
// Передаем объект прокси в качестве пятого параметра конструктора соединения
Соединение = Новый FTPСоединение(
"ftp.example.com",
21,
"ftp_user",
"ftp_password",
ПроксиСервер,
Истина
);
Для успешного решения проблемы «Ошибка работы с Интернет» при записи файлов по протоколу FTP в 1С последовательно выполните следующие шаги:
Записать(). Он обязательно должен содержать конечное имя файла на сервере, а не только имя каталога.Истина шестым параметром в конструктор FTPСоединение.