Разбор от сообщества: Копирование на FTP с докачкой при разрыве связи | infolimp.ru

Разбор от сообщества: Копирование на FTP с докачкой при разрыве связи

29 июля 2026 · infolimp.ru

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

Стандартный механизм докачки: как это работает и где подвох

В платформе 1С:Предприятие для работы с FTP предусмотрен объект FTPСоединение. Для возобновления прерванной загрузки достаточно установить свойство ПродолжитьЗагрузку = Истина перед вызовом ПолучитьФайл. На первый взгляд всё прозрачно:

// Через реальный API ИТС (FTPСоединение)
FTP = Новый FTPСоединение("ftp.example.com", 21, "user", "pass");
FTP.ПродолжитьЗагрузку = Истина;
FTP.ПолучитьФайл("/remote/data.zip", "C:\local\data.zip");

Однако за этой простотой скрывается ключевое допущение: платформа не проверяет, не изменился ли файл на сервере с момента начала передачи. Если во время разрыва связи администратор заменил data.zip на новую версию, докачка допишет к старому локальному фрагменту данные из нового файла, начиная с байта, на котором остановились. Результат — бинарный «винегрет», который не откроется ни одним архиватором.

Почему это не баг, а архитектурная особенность

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

Предупреждение: Никогда не полагайтесь на докачку без предварительной проверки времени изменения файла на сервере или его контрольной суммы. Один разрыв связи + замена файла = гарантированное повреждение данных.

Нетривиальная ловушка: изменение файла на сервере во время передачи

Рассмотрим реальный сценарий: ежедневная выгрузка большого архива (1–2 ГБ) на FTP-сервер партнёра. Канал нестабилен, разрывы случаются. Разработчик добавляет докачку. Всё работает неделями, пока однажды партнёр не сообщает, что архив не открывается. Причина: во время очередного разрыва на сервере запустилась новая выгрузка, и файл был перезаписан. Докачка «приклеила» начало старого файла к концу нового.

Как обнаружить проблему до того, как она станет критической

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

// Через реальный API ИТС (FTPСоединение)
FTP = Новый FTPСоединение("ftp.example.com", 21, "user", "pass");
УдаленныйФайл = FTP.ПолучитьСвойстваФайла("/remote/data.zip");
ЛокальныйФайл = Новый Файл("C:\local\data.zip");

Если ЛокальныйФайл.Существует() Тогда
    Если УдаленныйФайл.Размер <> ЛокальныйФайл.Размер() Или
       УдаленныйФайл.ДатаИзменения > ЛокальныйФайл.ПолучитьВремяИзменения() Тогда
        // Файл на сервере изменился — начинаем заново
        FTP.ПродолжитьЗагрузку = Ложь;
        FTP.ПолучитьФайл("/remote/data.zip", "C:\local\data.zip");
    Иначе
        // Можно докачивать
        FTP.ПродолжитьЗагрузку = Истина;
        FTP.ПолучитьФайл("/remote/data.zip", "C:\local\data.zip");
    КонецЕсли;
Иначе
    FTP.ПолучитьФайл("/remote/data.zip", "C:\local\data.zip");
КонецЕсли;

Обратите внимание: метод ПолучитьСвойстваФайла возвращает структуру с полями Размер, ДатаИзменения, Имя и т.д. Это реальный API платформы.

Сравнение подходов: встроенный FTP vs внешние утилиты

Когда стандартный механизм не устраивает (например, нужна проверка контрольной суммы или поддержка SFTP), приходится обращаться к внешним инструментам. Рассмотрим два популярных варианта.

Встроенный FTPСоединение 1С

Внешняя утилита (curl / WinSCP) через COMОбъект

Расширение «НОПик» для 1С — встраиваемый коннектор к внешнему AI с интеллектуальным поиском по базе. Задавайте вопросы обычными словами - AI сам найдёт нужное. 45 дней бесплатно.

Попробовать НОПик →