Как реализовать фоновую докачку файлов обмена через FTP в 1С?

Программист 1С v8.3 (Управляемые формы)
← На главную

В процессе эксплуатации распределенных информационных баз (РИБ) системные администраторы и разработчики часто сталкиваются с проблемой нестабильной связи на удаленных точках. Если файл обмена (особенно при обновлении конфигурации) весит сотни мегабайт, а интернет-соединение осуществляется через мобильный «свисток», стандартные средства 1С могут давать сбой. Рассмотрим подробно, как решить задачу фоновой загрузки и реализации механизма докачки файлов, чтобы не начинать процесс заново при каждом обрыве связи.

Анализ проблемы: почему штатные средства 1С не подходят

Разберем ситуацию: объект платформы FTPСоединение и его методы Получить или Записать работают по принципу «все или ничего». Если при передаче 99% файла произойдет кратковременный разрыв сессии, метод вызовет исключение, и при следующей попытке загрузка начнется с 0 байт. Это критично для «жадных ларьков» и удаленных складов, где качество связи оставляет желать лучшего. Проанализируем имеющиеся альтернативы и выберем наиболее надежные способы реализации фоновой докачки.

Способ 1. Использование системной утилиты curl (Windows 10/11)

Самый простой и эффективный метод, не требующий установки стороннего ПО на каждую из 40 точек, — это использование встроенной в современные ОС Windows утилиты curl. Проанализируем команду, которая позволяет реализовать докачку автоматически.

Рассмотрим пример кода для запуска загрузки из 1С:


// Параметр -C - указывает curl автоматически определить позицию для возобновления
// Параметр -O сохраняет файл с тем же именем, что и на сервере
КомандаЗапуска = "curl -C - -u user:password -o ""C:\Exchange\Message.zip"" ftp://server.com/Message.zip";
ЗапуститьПриложение(КомандаЗапуска, , Истина);

Выясним преимущества этого подхода: curl самостоятельно проверяет размер локального файла и отправляет FTP-серверу команду REST (Restart), запрашивая только недостающие байты. Для пользователя это выглядит как бесшовная работа в фоне.

Способ 2. Переход на протокол HTTP и использование Range

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

Разберем по шагам, как реализовать докачку на чистом коде 1С через HTTPСоединение:

  1. Проверяем существование локального файла и его текущий размер в байтах с помощью объекта Файл.
  2. Формируем заголовки HTTP-запроса, указывая диапазон байт, которые нам нужны (от текущего размера до конца файла).
  3. Используем метод Получить для дозаписи данных.

Пример реализации логики:


РазмерФайла = Новый Файл(ПутьКЛокальномуФайлу).Размер();
Заголовки = Новый Соответствие;
// Запрашиваем данные, начиная с текущего размера файла
Заголовки.Вставить("Range", "bytes=" + Формат(РазмерФайла, "ЧГ=0") + "-");

Соединение = Новый HTTPСоединение("myserver.com");
Запрос = Новый HTTPЗапрос("/exchange/update.zip", Заголовки);
Результат = Соединение.Получить(Запрос, ПутьКЛокальномуФайлу + ".part");
// Далее следует логика объединения основного файла и скачанной части

Способ 3. Использование службы BITS (Background Intelligent Transfer Service)

Проанализируем технологию BITS — это штатная служба Windows, предназначенная специально для скачивания обновлений в условиях нестабильного канала. Она идеально подходит для нашей задачи, так как умеет использовать только свободную полосу пропускания, не мешая работе кассира.

Для управления BITS из 1С удобнее всего использовать PowerShell. Посмотрим на пример команды:


КомандаPS = "Start-BitsTransfer -Source 'http://server.com/file.zip' -Destination 'C:\Exchange\file.zip' -TransferType Download -Asynchronous";
ЗапуститьПриложение("powershell.exe -Command " + КомандаPS, , Ложь);

Важный нюанс: BITS работает только с протоколами HTTP/HTTPS и SMB. Если ваша инфраструктура жестко завязана на FTP, этот способ потребует публикации файлов через веб-сервер (IIS или Apache).

Способ 4. Внешние специализированные утилиты (WinSCP и aria2c)

Если требуется максимальная надежность и детальный контроль, рассмотрим использование профессиональных загрузчиков, таких как aria2c или WinSCP.

aria2c — это консольная утилита, которая умеет качать файлы в несколько потоков и поддерживает автоматическую докачку после любого количества разрывов. Выясним, как это выглядит в коде:


// --continue=true включает докачку
Команда = "aria2c --continue=true --ftp-user=admin --ftp-passwd=pass ftp://server/file.zip -d C:\Exchange";
ЗапуститьПриложение(Команда, , Истина);

Для интеграции WinSCP мы можем использовать их COM-библиотеку. Это позволит нам прямо внутри 1С получать события о проценте загрузки и управлять очередью файлов. Разберем пример инициализации:


Сессия = Новый COMОбъект("WinSCP.Session");
ОпцииСессии = Новый COMОбъект("WinSCP.SessionOptions");
ОпцииСессии.Protocol = 1; // FTP
ОпцииСессии.HostName = "ftp.example.com";
ОпцииСессии.UserName = "user";
ОпцииСессии.Password = "password";

Сессия.Open(ОпцииСессии);
// Метод GetFiles с параметром ResumeSupport позволяет докачивать файлы
Сессия.GetFiles("/remote/path/*", "C:\local\path\", Ложь).Check();

Способ 5. Синхронизация через облачные хранилища

Рассмотрим нестандартный, но действенный для «ленивого» внедрения подход: использование клиентских приложений Яндекс.Диск, Облако Mail.ru или Google Drive. В этом случае 1С просто кладет файл в папку синхронизации на сервере, а облачный клиент на стороне точки сам заботится о доставке, докачке и фоновом режиме. 1С на точке остается лишь проверять появление файла в локальной папке.

Рекомендации по реализации фонового режима в 1С

Чтобы скачивание не блокировало работу пользователя, выясним, как правильно организовать архитектуру процесса:

Таким образом, комбинируя внешние инструменты, такие как curl, и архитектурные возможности 1С, мы можем создать отказоустойчивую систему обмена данными, которая не боится проблем с интернетом на удаленных точках.

← На главную