К статье
Практический материал

Разработка и Конфигурация · 9 мин

1С: как записать файл на FTP

Как записать файл на FTP из 1С через FTPСоединение: установка соединения, запись файла, работа с каталогами, пассивный режим, ошибки и примеры кода.

В платформе 1С:Предприятие 8.3 для работы с FTP предусмотрен встроенный объект FTPСоединение, доступный на сервере и в толстом клиенте. Он позволяет подключиться к FTP-серверу, передать туда файл, создать каталог и проверить результат записи — без внешних компонент и сторонних программ.

Типовая задача выглядит так: сформировать файл (выгрузку, отчёт, изображение), сохранить его во временный каталог, установить FTP-соединение и вызвать метод Записать(). Ниже разобран полный рабочий сценарий: от установки соединения до проверки, что файл действительно лёг на сервер, а также типичные ошибки — таймауты, пассивный режим и права доступа.

Как установить FTP-соединение из 1С

Соединение создаётся конструктором Новый FTPСоединение. Минимально нужны адрес сервера, порт (по умолчанию 21), логин и пароль. Дополнительно задаются таймаут и признак пассивного режима — именно эти параметры чаще всего решают проблемы с подключением через файрвол.

ФТП = Новый FTPСоединение(

"ftp.example.com", // сервер

21, // порт

"user", // логин

"password", // пароль

, // прокси (не используется)

Истина, // пассивный режим

30 // таймаут, секунд

);

Пассивный режим (ПассивноеСоединение = Истина) почти всегда нужен, если клиент 1С находится за NAT или корпоративным файрволом. В активном режиме сервер сам инициирует обратное соединение для передачи данных, и оно блокируется сетевым оборудованием — внешне это выглядит как зависание или ошибка после успешной авторизации.

Как записать файл на FTP: базовый пример

После установки соединения файл передаётся методом Записать(). Первый параметр — полный путь к локальному файлу, второй — путь и имя файла на FTP-сервере относительно текущего каталога соединения.

Процедура ВыгрузитьФайлНаFTP()

ЛокальныйФайл = ПолучитьИмяВременногоФайла("xml");

// ... формирование и сохранение файла ...

Попытка

ФТП = Новый FTPСоединение("ftp.example.com", 21, "user", "password", , Истина, 30);

ФТП.Записать(ЛокальныйФайл, "/upload/data.xml");

Исключение

Сообщить("Ошибка FTP: " + ОписаниеОшибки());

КонецПопытки;

КонецПроцедуры

Код выше выполняется на сервере 1С (в серверной процедуре общего модуля или фоновом задании) либо в толстом клиенте. В тонком и веб-клиенте объект недоступен — типовое решение: передать данные на сервер и выполнить отправку там.

bsl
ФТП = Новый FTPСоединение("ftp.example.com", 21, "user", "pass", , Истина, 30);
ФТП.Записать("C:\Temp\report.xml", "/upload/report.xml");

Работа с каталогами на FTP-сервере

Метод Записать() не создаёт промежуточные каталоги автоматически: если путь /upload/2026/ не существует, запись завершится ошибкой. Поэтому перед передачей каталог проверяют и при необходимости создают.

// Проверка наличия каталога

Найденные = ФТП.НайтиФайлы("/upload");

Если Найденные.Количество() = 0 Тогда

ФТП.СоздатьКаталог("/upload");

КонецЕсли;

// Смена текущего каталога

ФТП.УстановитьТекущийКаталог("/upload");

ФТП.Записать(ЛокальныйФайл, "data.xml"); // теперь можно без полного пути

Полезные методы для навигации: ТекущийКаталог() — узнать, где находится соединение, НайтиФайлы(маска) — получить список файлов и каталогов, Удалить() — удалить файл на сервере. Обратите внимание: пути на FTP указываются через прямой слэш / независимо от операционной системы сервера 1С.

Как проверить, что файл записался

Отсутствие исключения при вызове Записать() — хороший признак, но для ответственных выгрузок стоит явно убедиться, что файл появился на сервере и имеет ненулевой размер.

Файлы = ФТП.НайтиФайлы("/upload/data.xml");

Если Файлы.Количество() > 0 Тогда

Размер = Файлы[0].Размер();

Если Размер > 0 Тогда

// файл успешно записан

КонецЕсли;

КонецЕсли;

Контрольные точки

Как проверить результат

Наличие файла
Норма

НайтиФайлы возвращает один объект с нужным именем

Тревожный признак

Коллекция пустая — файл не записался

Размер файла
Норма

Размер больше нуля и близок к размеру локального файла

Тревожный признак

Размер 0 байт — передача оборвалась

Исключения
Норма

Записать() отработал без ошибки

Тревожный признак

Ошибка таймаута или доступа в ОписаниеОшибки()

Типичные ошибки и их причины

Большинство проблем при записи на FTP связаны не с кодом 1С, а с сетевым окружением и настройками сервера. Ниже — ситуации, которые встречаются чаще всего.

Типичные ошибки
01
Активный режим за файрволом: авторизация проходит, но передача файла зависает — включите пассивный режим
02
Запись в несуществующий каталог: метод Записать() падает с ошибкой — создайте каталог заранее
03
Нет прав на запись у FTP-пользователя: сервер отвечает ошибкой доступа — проверьте права учётной записи
04
Слишком маленький таймаут для больших файлов: передача обрывается — увеличьте таймаут соединения
05
Попытка использовать FTPСоединение в тонком клиенте: объект недоступен — выполняйте код на сервере

Отдельный частый случай — кодировка имён файлов. Если на сервере имена с кириллицей отображаются «кракозябрами» или запись такого файла не удаётся, используйте латиницу и цифры в именах файлов на FTP — это самое надёжное решение без привязки к настройкам конкретного сервера.

Организация регулярной выгрузки

Если файл нужно отправлять по расписанию, логику записи оформляют в общем серверном модуле и вызывают из регламентного задания. Логин и пароль при этом не хранят в коде: их выносят в константы, регистр сведений или защищённое хранилище, доступное только администраторам.

Порядок действий для регламентной выгрузки
  1. 1
    Создайте серверную процедуру: формирование файла, соединение, запись, проверка
  2. 2
    Обработайте исключения и запишите ошибку в журнал регистрации
  3. 3
    Создайте регламентное задание, вызывающее эту процедуру
  4. 4
    Настройте расписание и проверьте выполнение в консоли заданий
  5. 5
    Проверьте на FTP-сервере, что файлы появляются по расписанию

Для больших файлов учитывайте, что регламентное задание может быть прервано по таймауту сеанса. В таких случаях файл разбивают на части, либо выгрузку выносят во внешнюю обработку, запускаемую планировщиком Windows, либо используют архивирование для уменьшения объёма передачи.

Альтернативы встроенному FTPСоединение

Встроенный объект закрывает большинство задач, но у него есть ограничения: нет поддержки SFTP, нет докачки файлов, ограниченная диагностика ошибок протокола.

Сравнение вариантов

FTPСоединение (встроенный)

Подходит для обычного FTP и простых выгрузок; не поддерживает SFTP и докачку

Внешняя утилита (curl, WinSCP) через ЗапуститьПриложение

Нужна для SFTP, сложных сценариев и логирования; требует установки утилиты на сервер 1С

HTTPСоединение вместо FTP

Вариант, если приёмник можно заменить на HTTP-сервис; надёжнее проходит через прокси и файрволы

Выбор зависит от требований приёмной стороны. Если контрагент принимает файлы только по SFTP, встроенными средствами задача не решается — используют вызов внешней утилиты из кода 1С через ЗапуститьПриложение() или Shell на сервере.

FAQ

Можно ли записать файл на FTP из тонкого клиента 1С?

Нет, объект FTPСоединение недоступен в тонком и веб-клиенте. Передайте данные на сервер через серверный вызов и выполните отправку в серверной процедуре общего модуля.

Почему соединение устанавливается, но файл не передаётся?

Классический признак работы в активном режиме за файрволом: канал команд открывается, а канал данных блокируется. Установите пассивный режим (параметр ПассивноеСоединение = Истина) и проверьте, что на файрволе разрешены исходящие соединения на порты данных.

Как записать файл с русским именем на FTP?

Технически это возможно, но результат зависит от кодировки FTP-сервера — имя может исказиться. Надёжнее формировать имя файла латиницей, цифрами и символами подчёркивания, а русское название хранить внутри файла или в базе.

Поддерживает ли 1С протокол SFTP?

Нет, встроенный объект работает только с FTP и FTPS. Для SFTP (по SSH) вызывают внешние утилиты — например, WinSCP в режиме командной строки или curl — через ЗапуститьПриложение() на сервере.

Как передать сразу несколько файлов?

Метод Записать() принимает и маску: например, ФТП.Записать("C:\Temp\*.xml", "/upload/") передаст все подходящие файлы каталога. Либо перебирайте файлы циклом через НайтиФайлы() локально и записывайте каждый по отдельности — так проще контролировать ошибки.

Что делать, если передача большого файла обрывается?

Увеличьте таймаут соединения, проверьте стабильность канала и ограничения FTP-сервера на размер файла. Если обрывы продолжаются, сжимайте файл архивом или разбивайте выгрузку на части — встроенной докачки в FTPСоединение нет.

Итог

Что важно запомнить

Запись файла на FTP в 1С выполняется объектом FTPСоединение методом Записать(). Включайте пассивный режим, создавайте каталоги заранее, проверяйте результат через НайтиФайлы и выполняйте код на сервере. Пароли держите вне кода конфигурации.