Разбор от сообщества: Копирование на FTP с докачкой при разрыве связи
ПродолжитьЗагрузку работает, но скрывает ловушку, способную превратить восстановленный файл в «кашу». Разбираем, почему докачка без контроля целостности опасна, и как обойти грабли, о которых молчит справка.
Стандартный механизм докачки: как это работает и где подвох
В платформе 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С
- Плюсы: не требует установки дополнительного ПО, прост в использовании, поддерживает докачку «из коробки».
- Минусы: нет встроенной проверки целостности, нет поддержки SSH/SFTP, ограниченный контроль над процессом (например, нельзя задать таймаут на отдельную команду).
Внешняя утилита (curl / WinSCP) через COMОбъект
- Плюсы: полный контроль, поддержка контрольных сумм (MD5, SHA), работа по SFTP/FTPS, возможность возобновления с проверкой.
- Минусы: зависимость от внешнего ПО, сложность развёртывания
Попробовать НОПик →