Работа с внешними ресурсами, такими как FTP-серверы, является стандартной задачей для многих конфигураций 1С, особенно в рамках обмена данными (например, в Управление торговлей 10.3). Однако в процессе реализации программной выгрузки разработчики часто сталкиваются с неочевидными ошибками, такими как Ошибка доступа к файлу или успешное выполнение кода без фактического появления файла на сервере. В этой статье мы подробно разберем, как правильно настроить объект FTPСоединение, разберем типичные ошибки синтаксиса и выясним, почему пассивный режим работы является критически важным.
Рассмотрим типовую ситуацию. Программист пишет процедуру для отправки сформированного файла (например, DBF-отчета) на сервер. Код выглядит логично: устанавливается соединение, выбирается каталог, вызывается метод записи. Однако система выдает ошибку: Ошибка при вызове метода контекста (Записать) по причине: Ошибка доступа к файлу.
Проанализируем фрагмент кода, который вызывает сбой:
ФТП.УстановитьТекущийКаталог(ФТПКаталог);
ФТП.Записать("C:\Users\1\Desktop\Контроль еженедельных сверок 1С vs SAP\", СокрЛП(Файл));
Выясним причину этой ошибки. В методе Записать() первым параметром должен выступать полный путь к локальному файлу-источнику, включая его имя и расширение. Если указать только путь к папке (каталог), платформа 1С воспринимает это как попытку прочитать директорию как файл, что и вызывает отказ в доступе на уровне операционной системы.
Правильный вариант вызова метода должен выглядеть так:
// Формируем полный путь к локальному файлу
ПолныйПутьКФайлу = "C:\Users\1\Desktop\Контроль еженедельных сверок 1С vs SAP\" + СокрЛП(Файл);
// Записываем файл на FTP. Второй параметр — это имя файла, под которым он сохранится на сервере.
ФТП.Записать(ПолныйПутьКФайлу, СокрЛП(Файл));
Важно помнить: метод Записать() принимает два основных строковых параметра: Источник (откуда берем файл на диске) и Приемник (как он будет называться на сервере). Если вы предварительно использовали метод УстановитьТекущийКаталог(), то во втором параметре достаточно указать только имя файла.
Иногда случается так: синтаксис исправлен, код выполняется без ошибок, 1С сообщает об успешной отправке, но файл на FTP-сервере так и не появляется (или имеет размер 0 байт). При этом, если зайти через сторонний клиент (например, FAR Manager или FileZilla), файлы загружаются без проблем.
Проанализируем ситуацию. В протоколе FTP существует два режима передачи данных: активный и пассивный. В активном режиме сервер пытается сам инициировать соединение с клиентом для передачи данных. В современных сетях это часто блокируется брандмауэрами (Firewalls) или NAT со стороны пользователя.
Для стабильной работы из 1С необходимо использовать пассивный режим. В конструкторе объекта FTPСоединение этот параметр является шестым по счету. Рассмотрим, как изменится инициализация соединения:
Было (по умолчанию активный режим):
FTPСоединение = Новый FTPСоединение(Адрес, Порт, Логин, Пароль);
Стало (принудительный пассивный режим):
// Шестой параметр "Истина" включает пассивный режим
FTPСоединение = Новый FTPСоединение(Адрес, Порт, Логин, Пароль, , Истина);
Использование пассивного режима позволяет обойти большинство сетевых ограничений, так как в этом случае инициатором всех соединений выступает клиент (программа 1С), что разрешено стандартными правилами безопасности в большинстве корпоративных сетей.
Посмотрим на ситуацию шире. Ошибка доступа может быть связана не только с кодом 1С, но и с окружением операционной системы. Разберем основные моменты, которые стоит проверить:
C:. Попробуйте использовать техническую папку в корне диска с полными правами доступа (например, C:\Temp\).1cv8.exe может расцениваться антивирусным ПО как потенциальная угроза при попытке передачи данных в интернет. Рекомендуется добавить исполняемые файлы 1С в исключения брандмауэра.FTPСоединение работать не будет — он поддерживает только стандартный FTP и FTPS. В таких случаях мы рекомендуем использовать внешние утилиты, такие как curl или WinSCP, вызывая их через команду ЗапуститьПриложение().С учетом всех разобранных факторов, составим надежную процедуру выгрузки файла на FTP-сервер с обработкой исключений и логированием этапов:
Процедура ВыгрузитьФайлНаFTP(ИмяФайлаИсточника, ИмяФайлаНаСервере)
// Настройки подключения
Сервер = "ftp.example.ru";
Порт = 21;
Логин = "user123";
Пароль = "password";
ПутьНаСервере = "/upload/";
Попытка
// Инициализируем соединение в пассивном режиме (6-й параметр = Истина)
// Также можно указать таймаут в 7-м параметре (например, 60 секунд)
ФТП = Новый FTPСоединение(Сервер, Порт, Логин, Пароль, , Истина, 60);
Сообщить("Соединение с FTP установлено успешно.");
Исключение
Сообщить("Ошибка при подключении к FTP: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
Попытка
// Переходим в нужный каталог на сервере
ФТП.УстановитьТекущийКаталог(ПутьНаСервере);
// Выполняем запись файла
// ВАЖНО: ИмяФайлаИсточника должно быть полным путем, например "C:\Temp\data.dbf"
ФТП.Записать(ИмяФайлаИсточника, ИмяФайлаНаСервере);
Сообщить("Файл " + ИмяФайлаНаСервере + " успешно отправлен на сервер.");
Исключение
Сообщить("Произошла ошибка при передаче файла: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Подведем итог: для успешной работы с FTP в 1С необходимо четко соблюдать структуру путей к файлам, всегда использовать пассивный режим соединения для обхода сетевых блокировок и следить за правами доступа процесса 1С к локальной файловой системе. Эти простые правила помогут вам избежать большинства проблем с автоматизацией обмена данными.